2

例を見てみましょう: a.out という名前の実行可能ファイルがあります。これには、いくつかのテキストを printf の STDOUT cos に出力するためのバイナリ情報が含まれています。したがって、./a.out を指定すると、コンソール STDOUT に printf の出力が表示されます。

コンソールで「./a.out > tempFile」を実行するとします。これはどのように作動しますか?a.out の中に printf があるので、理想的には STDOUT に印刷するテキストを除外します。リダイレクションはこのテキストをどのように消費するのか、コンソールに出力が表示されず、ファイルにのみ printf テキストが表示されるのはなぜですか

4

4 に答える 4

3

UNIX では、すべてがファイルです。デフォルトでは、コンソール/ターミナル/ウィンドウに接続されたデバイスドライバーであるstdout(たとえば)ファイルがすべてです。/dev/tty出力はそのファイル (デバイス ドライバー) に送信されるだけで、対話型 I/O に使用しているものに出力されます。

すべての a コマンドがa.out >xyzzy.txt行うのは、最初にプログラムの標準出力を ではなくそのファイルに接続することです/dev/tty。したがって、出力は代わりにそこに表示されます。

于 2012-10-10T05:40:20.817 に答える
2

UNIXでは、すべてがファイル/ファイルストリームです

UNIX プロセスには、デフォルトで 3 つのファイル ストリームが接続されています。

0 = stdin
1 = stdout
2 = stderr

「通常」、標準入力はキーボード入力を解析する端末エミュレーションに接続され、標準出力/標準エラー出力はディスプレイを提供する端末エミュレーションに接続されます。

端末エミュレーターは、xterm、gnome-terminal、kterm、または Linux 仮想コンソール (「textmode-console」) の可能性があります。

リダイレクトすると、ストリームは単に別のソース/宛先に接続されます。そのため、端末エミュレーションに送られるすべてのテキストは、代わりにファイルに送られます。

両方が必要な場合は、「ティー」がオプションになる可能性があります。

./a.out | tee tempFile   

それをstdoutに出力し(再度リダイレクトする可能性のあるteeの)、tempFileに書き込みます

于 2012-10-10T05:40:51.963 に答える
0

シェルはa.outを実行し、stdoutをファイルtempFileに置き換えます。達成したいリダイレクトの種類に応じて、これを行うために使用できる関数( dup2、 )がいくつかあります。fropen

ここを参照してください:子プロセスの出力のリダイレクト

于 2012-10-10T05:41:56.537 に答える
0

リダイレクトは、a.out の標準出力を /dev/tty (端末に出力するためのドライバー) ではなく tempFile にリンクする別のプロセスです。そのため、出力はファイルにのみ表示され、コンソールには表示されません。これは、a.out が実行される前に行う必要があります。リダイレクション operator によってリンクが完了すると、 a.out の実行が開始され、ファイルへの出力が終了します。

于 2012-10-10T18:20:00.540 に答える