私はマルチスレッドプログラムを使用しています。
まず、標準出力を特定のファイルにリダイレクトします。問題ありません(私は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にコピーすることでしたが、それも機能しません。
標準出力を元の宛先(端末、パイプ、ファイルなど)に戻すにはどうすればよいですか?
#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);
dup2(fd, STDOUT_FILENO)
を実行する前に、int saved_stdout = dup(STDOUT_FILENO);
( dup()
を選択して、現在のオープンファイル記述子を標準出力用に保存する必要があります。利用可能なファイル記述子番号)。次に、出力をファイルにリダイレクトした後、dup2(saved_stdout, STDOUT_FILENO)
を実行して、標準出力をこれをすべて開始する前の状態に戻すことができます(_saved_stdout
_も閉じる必要があります) 。
標準I/Oストリーム(fflush(stdout)
)を適切なタイミングでフラッシュすることについては、これをいじくりまわす必要があります。これは、「標準出力を切り替える前」を意味します。
プログラムがLinux環境で実行されている場合、freopen ("/dev/stdout", "a", stdout)
を実行できます。
ただし、stdout
がターミナルであることがわかっている場合は、freopen ("/dev/tty", "a", stdout)
または他のOSの同等の機能、つまりWindowsでも同様です。