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これを行うことを選択できます。

答え2

それ非常にプログラムが自分で/dev/ttyを開くのは珍しいことです。コンソールに何かを印刷する必要がある場合は、stdoutに書き込んで次stdoutのようにリダイレクトできます。ジルショー

ここで唯一の選択は傍受することです図書館 fopenインライン処理されるか(一般的ではない)、デフォルトのオペレーティングシステムがopenそれを呼び出して曲がらない限り呼び出します。

難しくありません。その関数を含む小さなライブラリを作成する必要がありますopen。このライブラリは、入力を「衛生処理」した後に実際の関数を呼び出しますopen(つまり、ファイル名が/ dev / ttyの場合は/ dev / nullに置き換えられます)。

プログラムを実行し、システムコールを傍受してリダイレクトします。これがどのように行われるかを示しています。

関連情報