2017-11-02 1 views
-1

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에 의해 반환 된 이유를 알고 싶습니다. 감사합니다.

+1

'popen'은'find' 프로그램을 실행하도록 요청합니다. 'find' 프로그램이 실패하거나'popen' *이 여전히 그것을 실행하기 때문에 무관합니다. –

+1

* 당신이 * 실패한 일이 있습니다. 예를 들어,'popen'이 실패하고 널 포인터를 반환하더라도'fflush (pf)'*를 무조건 호출합니다. 그리고 성공했는지 확인하지 않고'fgets' *를 호출합니다! * –

+0

@Someprogrammerdude - 제 질문은 찾기에 실패해도 FILE * pf 데이터가 동일하게 유지되는 이유입니다. find 명령이 주어진 파일을 찾지 못하면 stdout에 아무것도 반환하지 않습니다. fgets()를 사용하는 요점은 FILE * pf가 다음 반복에서 이전 데이터를 가리키고 있음을 증명하는 것입니다. 새로운 가치를 가져야하지 않습니까? – yuvi

답변

1

find이 실패하면 NULL이 아닌지 확인하십시오.

아니요, 유효한 FILE *find 프로세스의 파이프 출력을 구현해야합니다. 프로세스가 출력을 생성하지 않으면이를 읽으면 즉시 EOF가 생성됩니다. find 프로세스를 시작하는 것은 여기서 실패하지 않습니다. 아무 것도 찾지 못했습니다.

왜 다르게 생각하는지 분명하지 않습니다.

+0

그래서 find 프로세스가 실패하면 출력을 보내지 않습니다. 따라서 FILE * pf가 스트림의 이전 데이터를 보유하는 대신 EOF를 가리 키지 않아야합니까? – yuvi

+0

'EOF를 가리키는'것은 의미가 없으며 '가리키는 것'은 NULL 값과 같은 것이 아닙니다. 'FILE * '은'FILE' 타입의 객체를 가리키며, 그것을 통해 읽는 것은 비어있는 경우 즉각적인 EOF를 생성해야합니다. 나는 이미 그 모든 것을 말했어. 그리고 EOF를 확인하지 않으므로 그것이 생산되지 않는다고 믿을만한 이유가 없습니다. – EJP

관련 문제