2

リモートシェルとして機能するデーモンを書きたかったのです。そのため、標準入力、標準出力、および標準エラー出力を閉じる必要があります。

これがどのように適切に行われるかを知りたいと思います。

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

これが機能し、ストリームがリダイレクトされるようになりました。しかし、「古い」の意味は何ですか?これは古いバッファではなく、削除する必要がありますか? 削除しようとすると、ポインター自体が NULL ではないにもかかわらず、NULL ポインター例外が発生します。では、どうすればそれを取り除くことができますか、または単に無視できますか? 無視する場合、デーモンは端末から適切に切り離されていますか?

stderr と stdin も同じですが、扱いは同じだと思います。

4

2 に答える 2

4

必要なのは、実際のファイル記述子を閉じることだけです。これはもちろんプラットフォーム固有ですが、デーモンも同様です。したがって、POSIX プラットフォームの場合、これには POSIX API を使用します。をリダイレクトした後cout、次のことを行います。

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

あなたも読みたいかもしれません:

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

于 2013-04-23T11:55:53.257 に答える