0

fork と execv を使用して別のプロセスを起動するアプリケーションを作成しました。ステータスを通知するパイプを作成し、起動したプロセスのメイン エントリから、正しく起動されたことを通知するバイトを書き込みます。それ以外の場合、フォークされたプロセスで書き込みパイプが閉じられているため、read は 0 を返します。

唯一の問題は、プロセスが起動しない場合 (ライブラリがない場合) です。このことについて stderr にメッセージが表示されます。メッセージはシェルに書き込まれます。何が問題なのか。静かにやればいいのに。ただし、execv の前に close(2) を実行すると、何が必要かというメッセージが表示されません。それでも、stderr 用に fd 2 を開いたままにしたいと思います。

4

2 に答える 2

1

おそらく、アプリケーションは stderr ストリームがまったくないことを好まないでしょう。それよりも

close(2);

やってみます

int tmpfd = open("/dev/null", O_WRONLY);
dup2(tmpfd, 2);
close(tmpfd);

もちろん、エラー処理を追加することを心から歓迎します。

于 2011-02-07T08:59:50.027 に答える
0

あなたがた両方に感謝します。stderrを/dev/nullにリダイレクトする際の問題を解決しました。ただし、子プロセスを2回起動する必要があります。最初に、stderrが抑制された状態で起動するかどうかを確認し、最初に成功した場合は再度起動します。したがって、子プロセスのデフォルトのstderrは正しく、失敗した場合のシェル出力はありません。

于 2011-02-07T13:16:06.540 に答える