/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
実行された端末ではなく提供された端末ですscript
。script
端末が書き込みを検出すると、独自の標準出力と指定された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に置き換えられます)。
プログラムを実行し、システムコールを傍受してリダイレクトします。これがどのように行われるかを示しています。