2

http://www.itp.uzh.ch/~dpotter/howto/daemonizeにある実装に基づいて端末からデタッチする Linux コードがあります。

ここにコードスニペットがあります:

....
freopen( "/dev/null", "r", stdin);
freopen( "/dev/null", "w", stdout);
freopen( "/dev/null", "w", stderr);

kill( parent, SIGUSR1 );
}

/dev/nullにリダイレクトする代わりに、次の方法で標準のファイル記述子を閉じて、同じ結果を得ることができます。

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

今のところ、使用するアプローチに少しこだわっています:リダイレクトまたはクローズ? 各アプローチの潜在的な問題は何ですか?

4

1 に答える 1

7

どちらでも実行できますが、リダイレクトする/dev/null方が安全で簡単です。

閉じることを選択した場合は、stdin/stdout/stderr を閉じたときに呼び出した外部プログラムまたはライブラリが引き続き機能することを確認する必要があります。ライブラリとフレームワークでは、これを処理する方法が異なります。

  • echo予期せず失敗を返すため、シェル スクリプトが異常終了したり、誤動作したりする可能性があります。
  • Python プログラムでは、基になるバッファーが書き込まれるときに、任意の print ステートメントが例外で失敗することがわかります。
  • Ruby はそれを無視します。

呼び出されたプログラムまたはライブラリが通常何も出力しない場合でも、それらが行う条件付きログの種類と、そこでの障害の処理方法はわかりません。

実行するすべてのコードが標準 I/O を持たないことを処理することがわかっている場合を除き、リダイレクトするだけの方がよいでしょう。

于 2015-10-21T20:24:46.003 に答える