1

stdout をソケットにリダイレクトしようとしています。私はこのようなことをします:

dup2(new_fd, STDOUT_FILENO);

その後stdio、stdout に書き込むすべての関数が失敗します。私はこの方法でstdoutを再開しようとしました:

fclose(stdout);
stdout = fdopen(STDOUT_FILENO, "wb");

しかしprintf、他の機能はまだ機能しません。

編集:

そもそも問題を誤解していたことを恐れています。さらにデバッグした後、これが実際の問題であることがわかりました。

printf("Test"); // We get Broken pipe here
// Reconnect new_fd
dup2(new_fd, STDERR_FILENO);
printf("Test"); // This also returns Broken pipe despite that stdout is fine now

ありがとう。

4

2 に答える 2

1

修正後にstdioのエラーインジケータをクリアすることで問題を解決しましたstdout:

clearerr(stdout);

ご協力いただきありがとうございます。

于 2013-02-27T15:51:21.893 に答える
1

1: オンdup2(src, dst)

多くのオペレーティング システムは、ファイル記述子を使用して開いているファイルを追跡します。 todup2からファイル記述子を内部的に複製し、既に開いている場合は閉じます。srcdstdst

最初のステートメントが行っていることはSTDOUT_FILENO、 で表されるオブジェクトに移動するためにすべての書き込みを行うことnew_fdです。オブジェクトと言うのは、ファイルだけでなくソケットにもなり得るからです。

new_fdコードの最初の行に問題はありませんが、 がどのように定義されているかわかりません。

2: 再開時stdout

ファイル記述子を閉じると、OS はそれをテーブルから削除します。ただし、ファイル記述子を開くと、OS は使用可能な最小のファイル記述子を戻り値として設定します。したがって、 を再度開くstdoutには、デバイスを再度開くだけで済みます。OSによってデバイスが変わると思います。たとえば、私の Mac では、デバイスは/dev/tty.

したがって、stdout を再度開くには、次のようにします。

close(1);
open("/dev/tty", O_WRONLY);
于 2013-02-27T02:07:59.530 に答える