26

マルチスレッドプログラムを使用しています。

まず、stdout を特定のファイルにリダイレクトします。そこに問題はありません(ファイルのファイル記述子はdup2(fd, 1)どこにあるのかを使用しました)。fd

その後、stdout を端末に再度リダイレクトする必要があります。

私の最初のアプローチ:

      /*Declaration*/
      fpost_t  stream_sdout;
      /*code*/
      if ( fgetpos( stdout, &stream_sdout) == -1 )
          perror(Error:);

違法なシークと言っています。
なぜこれが起こっているのか分かりません。
しかし、これを機能させれば、使用するだけfsetpos(stdout, &stream_stdout)で機能するはずです。

私の 2 番目のアイデアは、4 番目の位置にあるファイル記述子テーブルを使用して stdout をコピーすることdup2(stdout, 4)でした。しかし、それも機能しません。

標準出力を元の宛先 (端末、パイプ、ファイルなど) に戻すにはどうすればよいですか?

4

3 に答える 3

46
#include <unistd.h>

...

int saved_stdout;

...

/* Save current stdout for use later */
saved_stdout = dup(1);
dup2(my_temporary_stdout_fd, 1);

... do some work on your new stdout ...

/* Restore stdout */
dup2(saved_stdout, 1);
close(saved_stdout);
于 2012-06-14T23:08:19.043 に答える
0

プログラムが Linux 環境で実行されている場合は、freopen ("/dev/stdout", "a", stdout).

しかし、それstdoutが端末、freopen ("/dev/tty", "a", stdout)または他の OS (Windows でさえも) の同等物であることがわかっている場合。

于 2012-06-14T22:35:15.887 に答える