2013-04-23 4 views
2

원격 쉘 역할을하는 데몬을 작성하고 싶습니다. 따라서 stdin, stdout 및 stderr를 닫아야합니다.C++ 제대로 종료 됨

이제 어떻게 이것이 제대로 이루어 졌는지 알고 싶습니다.

std::streambuf * old = std::cout.rdbuf(mStdOut.rdbuf()); 
std::cout << "Bla" << std::endl; 
std::string text = mStdOut.str(); 

이제 작동하고 스트림이 리디렉션됩니다. 그러나 '늙은'의 의미는 무엇입니까? 이것은 오래된 버퍼가 아니므로 삭제해야합니까? 포인터 자체가 NULL이 아니더라도 삭제하려고하면 null 포인터 예외가 발생합니다. 그러면 어떻게 제거 할 수 있습니까? 아니면 무시할 수 있습니까? 그것을 무시한다면, 데몬이 터미널에서 적절히 분리되어 있습니까?

stderr과 stdin도 동일하지만 치료법은 같을 것이라고 가정합니다.

답변

4

실제 파일 설명자를 닫으면됩니다. 이것은 물론 플랫폼에 따라 다르지만 데몬도 그렇습니다. 따라서 POSIX 플랫폼에서는 POSIX API를 사용합니다. 당신이 cout 리디렉션 후 수행

close(STDIN_FILENO); 
close(STDOUT_FILENO); 
close(STDERR_FILENO); 

당신은 또한 읽을 수 있습니다 사실이지만,이 질문에 대답하기 위해 아무것도하지 않는

http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html

3

프로그램을 종료하기 전에 원래 버퍼를 cout으로 복원해야합니다.

동적으로 할당되었는지 또는 다른 코드가 삭제를 호출하는지 모르기 때문에 삭제할 수 없습니다.

+0

. 대답은'cin' /'cout' /'cerr'을 통해 수행 될 수 없지만 기본 POSIX 파일 핸들에 대해 수행되어야한다는 것입니다. –

+0

그래, 질문에 두 부분이 있습니다. C++과'cout' 부분에 응답했습니다 - 스트림 버퍼를 삭제하지 마십시오. –