Cプログラムの出力を/dev/ttyから/dev/nullにリダイレクトする方法は?

Cプログラムの出力を/dev/ttyから/dev/nullにリダイレクトする方法は?

/dev/tty書き込みを防ぐためのコマンドラインオプションがない次のCプログラムの例を考えてみましょう。

#include <stdio.h>

int main (void) {
    FILE* fout = fopen("/dev/tty", "w");
    fprintf(fout, "Hello, World!\n");
    fclose(fout);
}

出力を/dev/nullシェルスクリプトにどのようにリダイレクトできますか?

PS私は読んだこの回答でも、よく理解できません。とにかく、プログラムコードソースを変更しない答えを探しています。

ベストアンサー1

TL、博士:

script -c myprogram /dev/null </dev/null >/dev/null

/dev/tty標準出力をリダイレクトするのと同じ方法で「リダイレクト」することはできません。標準出力はファイル記述子として定義されます。ファイル記述子1ですでに開いているすべてのファイルは、プログラムの開始時に記録されます。一部のオペレーティングシステムは標準出力と同等のファイルを提供します/dev/stdoutが、これは標準出力の「エイリアス」です。代わりに、/dev/ttyプロセスの制御端末を表すファイル名です。プログラムが開いている場合は、/dev/tty明示的に開いて/dev/ttyリダイレクトできません。

あなたができることは、実行中のプログラムの制御端末以外の制御端末を使用してプログラムを実行することです。これを行う簡単な方法は、次を使用することです。script注文する。最も簡単な形式:

script -c myprogram /dev/null >/dev/null

実行してmyprogram開くと、/dev/ttyこれはscript実行された端末ではなく提供された端末ですscriptscript端末が書き込みを検出すると、独自の標準出力と指定されたTypeScriptファイルの両方に書き込みを行うため、script標準出力とTypeScriptファイルの両方を使用します/dev/null

myprogram端末から読み取る場合は独自の標準入力から読み取るので、scriptそれを端末にリダイレクトすることをお勧めします。/dev/null

script終了ステータスは発信者には渡されませんmyprogram。 Debian やその派生など、一部の実装では-eこれを行うことを選択できます。

おすすめ記事