그래서 ... 내 프로그램에서 일부 입력을 받아들이는 또 다른 프로세스를 시작합니다 (다른 방향으로도 갈 수 있습니다). 정렬의 뭔가 : 이제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에 원하는 방식으로 닫을 수 있도록하는 방법이 있나요.
내가이 어떤 방법으로 당신을 도울 수 있으리라 생각합니다 : http://stackoverflow.com/a/1105009/2428958 또한, streambuf의를 유도하고 자신의 스트림 클래스를 구현하는 대신 표준을 사용하는 것을 고려할 수 있습니다 :: ofstream을 이 경우에는 소멸자에 사용자 정의 "닫기"를 첨부 할 수 없기 때문입니다. –
파이프를 연 코드가 닫혀 있어야합니다. 소멸자가 파이프를 닫는 클래스와 파이프를 연관시키는 것이 좋습니다. 닫기를 캡처 할 필요가 없습니다. 객체가 삭제되면 닫을 수 있습니다. –
@ MateuszKołodziejski 그것은 완벽한 대답입니다. 실제 답변을 작성 하시겠습니까? (링크가 실제로 도움이되지는 않지만 streambuf에서 파생 된 것은 내가해야 할 일입니다.) –