2014-01-22 4 views
2

그래서 ... 내 프로그램에서 일부 입력을 받아들이는 또 다른 프로세스를 시작합니다 (다른 방향으로도 갈 수 있습니다). 정렬의 뭔가 : 이제popen()을 수행하고 FILE * 포인터를 fstream에 넣습니다. pclose()는 어떻게됩니까?

FILE *f(popen("sendmail", "w")); 

, 난 그냥 스트림을 사용할 수있는 방법 있도록 fstream에서 F를 넣을 수 있습니다

를 (할 수있는 현명한 일이 될 것으로 보인다 내 프로그램은 C++에 있기 때문에.)
std::ofstream output(fileno(f)); 
... 
output << "To: [email protected]" << std::endl; 
... 

여기까지 나 좋다. 이제는 자식 프로세스로 데이터를 보내는 작업이 끝난 시점이되었습니다. 내가 원하는 것은 파이프를 닫는 것뿐입니다. 필자가 알고 있듯이,이 함수는 다른 프로세스가 모든 데이터를 받도록 보장하기 때문에 pclose()를 사용해야합니다. 다른 말로하면, pclose() 함수는 파이프를 깔끔하게 처리하는 방법을 알고 있습니다.

불행히도 내가 ofstream에 f를 넣었으므로 닫을 수는 없습니다.

pclose(f); // proper way to close a pipe 
... 
ofstream::~ofstream() { ... close(fd); ... } // not the right way to close a pipe 

ofstream에서 닫기를 포착하고 그것이 내가 폐쇄 EB에 원하는 방식으로 닫을 수 있도록하는 방법이 있나요.

+1

내가이 어떤 방법으로 당신을 도울 수 있으리라 생각합니다 : http://stackoverflow.com/a/1105009/2428958 또한, streambuf의를 유도하고 자신의 스트림 클래스를 구현하는 대신 표준을 사용하는 것을 고려할 수 있습니다 :: ofstream을 이 경우에는 소멸자에 사용자 정의 "닫기"를 첨부 할 수 없기 때문입니다. –

+0

파이프를 연 코드가 닫혀 있어야합니다. 소멸자가 파이프를 닫는 클래스와 파이프를 연관시키는 것이 좋습니다. 닫기를 캡처 할 필요가 없습니다. 객체가 삭제되면 닫을 수 있습니다. –

+0

@ MateuszKołodziejski 그것은 완벽한 대답입니다. 실제 답변을 작성 하시겠습니까? (링크가 실제로 도움이되지는 않지만 streambuf에서 파생 된 것은 내가해야 할 일입니다.) –

답변

1

내가 ofstream에서 사용자 정의 클래스를 상속하는 것 :

PipeStream::~PipeStream { pclose(f) }; 

그래서 만일 pclose가 (F) FCLOSE 전에 실행 소멸자

class PipeStream : public std::ofstream 

및 덮어 쓰기 (F)?

+0

close() 호출을 catch하고 가상이 아닌 경우 문제가 될 수 있습니다. std :: ofstream은 템플릿이기 때문에 어떻게 작동하는지 100 % 확신 할 수는 없지만 보통 클래스와 동일하다고 생각하므로 누군가 ofstream을 사용하면 close() 함수를 잘못 호출 할 수 있습니다. –