web-dev-qa-db-ja.com

C 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番目のアイデアは、dup2(stdout, 4)を使用してstdoutをファイル記述子テーブルの位置4にコピーすることでしたが、それも機能しません。

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

20
#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);
29
pilcrow

dup2(fd, STDOUT_FILENO)を実行する前に、int saved_stdout = dup(STDOUT_FILENO);dup() を選択して、現在のオープンファイル記述子を標準出力用に保存する必要があります。利用可能なファイル記述子番号)。次に、出力をファイルにリダイレクトした後、dup2(saved_stdout, STDOUT_FILENO)を実行して、標準出力をこれをすべて開始する前の状態に戻すことができます(_saved_stdout_も閉じる必要があります) 。

標準I/Oストリーム(fflush(stdout))を適切なタイミングでフラッシュすることについては、これをいじくりまわす必要があります。これは、「標準出力を切り替える前」を意味します。

8

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

ただし、stdoutがターミナルであることがわかっている場合は、freopen ("/dev/tty", "a", stdout)または他のOSの同等の機能、つまりWindowsでも同様です。

0
wallyk