popen()을 사용하여 파일을 찾는 프로그램에서 작업하고 있습니다. 그런 다음 popen()이 반환 한 스트림의 데이터를 char 배열에 복사하고 인쇄합니다.popen()의 명령이 실패했을 때 FILE *이 데이터를 유지하는 이유
#include <iostream>
#include <cstdio>
#include <cstring>
int main()
{
char command[1024];
char ch = 'a';
FILE* pf;
while(ch < 'd')
{
sprintf(command, "find /home/ypatil/interest -name \\%c.out", ch);
std::cout << std::endl << command << std::endl;
pf = popen(command, "r");
if(pf)
{
char src[256];
fgets(src, 256, pf);
std::cout << std::endl << "pf = " << src << std::endl;
}
pclose(pf);
++ch;
}
return 0;
}
는 지금, 나는 루프에서이 일을하고 난 파일 프로그램이 존재하지 않는 검색하는 경우, 다음 스트림을 pf
가 이전 값을 유지 파일 것을 알아 냈다. 내 시스템에 a.out
파일 만 존재합니다. 그래서,이 프로그램의 출력은 - 그래서
find /home/ypatil/interest -name \a.out
pf = /home/ypatil/interest/a.out
find /home/ypatil/interest -name \b.out
pf = /home/ypatil/interest/a.out
find /home/ypatil/interest -name \c.out
pf = /home/ypatil/interest/a.out
, 당신은 find
다른 파일을 검색되는 것을 볼 수 있습니다 만 a.out
이 존재합니다. 따라서 다른 파일에서는 실패합니다. 그러나 여전히 pf
은 모든 반복에서 데이터를 보유합니다. 이전 iterataion에서 FILE *
값이 popen
에 의해 반환 된 이유를 알고 싶습니다. 감사합니다.
'popen'은'find' 프로그램을 실행하도록 요청합니다. 'find' 프로그램이 실패하거나'popen' *이 여전히 그것을 실행하기 때문에 무관합니다. –
* 당신이 * 실패한 일이 있습니다. 예를 들어,'popen'이 실패하고 널 포인터를 반환하더라도'fflush (pf)'*를 무조건 호출합니다. 그리고 성공했는지 확인하지 않고'fgets' *를 호출합니다! * –
@Someprogrammerdude - 제 질문은 찾기에 실패해도 FILE * pf 데이터가 동일하게 유지되는 이유입니다. find 명령이 주어진 파일을 찾지 못하면 stdout에 아무것도 반환하지 않습니다. fgets()를 사용하는 요점은 FILE * pf가 다음 반복에서 이전 데이터를 가리키고 있음을 증명하는 것입니다. 새로운 가치를 가져야하지 않습니까? – yuvi