プログラム出力リダイレクト


11

「〜より大きい数字」構文(例:)を使用してプログラム出力をリダイレクトしようとする場合foo 2> myfile、ここで考えられる数字は何であり、それらは何を表していますか?

1は/dev/stdout、2はだと思います/dev/stderr。5と6はどうですか?3、4、または6より大きい数はありますか?


回答:


11

この想定プログラムは、指定したファイル記述子番号に書き込みます。次のhello worldプログラムを検討してください。

#include <stdio.h>

main()
{
   ssize_t i = 0 ;
   printf ("hello world\n") ;
   i = write( 5 , "Bonjour Monde\n", 14 ) ;
   printf ("%d octet dans 5\n", (int) i) ;
}

コンパイルする

me@mybox:~/tmp7$ make hw
cc     hw.c   -o hw

今簡単な実行

me@mybox:~/tmp7$ ./hw
hello world
-1 octet dans 5

5のファイルがないため、バイトは書き込まれません。

次の試み:

me@mybox:~/tmp7$ ./hw 5> u
hello world
14 octet dans 5
me@mybox:~/tmp7$ cat u
Bonjour Monde

ファイルとファイル記述子(例:)を指定しながら、なんとか出力を取得できます5>u

実際には、上記のような面白いプログラムを作成していない限り、を使用してデータを収集することはほとんどありません5>foo

シェルスクリプトでは、<()を使用した構成の方が便利です。

 diff <( cmd -par 1 ) <(cmd -par 2)

write()ssize_tではなくを返しますint
Andrew Henle

それは問題の主要なポイントではなく、printf関数の戻り値もあります。
Archemar

戻り値を使用しないことは、間違った型を使用することとはまったく異なります。
Andrew Henle

編集私は出力の変更を確認しません...
Archemar

10

番号はファイル記述子(開かれたファイルへのハンドル)を表します。

シェルは通常3つのセットを自動的に持っています、

0-stdin 1-stdout 2-stderr

しかし、さらにファイルを開くことができ、数値が増加します。


7

これらの番号はファイル記述子です。お気づきのように、いくつかは自動的に作成されます。他のファイルまたはファイルのようなものが開かれると、それらは他の番号を取得します。

特定のプログラムで使用される番号は、そのプログラムによって開かれたファイル、または使用されたファイルによって異なります。たとえば、現在の標準入力を「保存」して一時的に他の場所から標準入力をリダイレクトし、後で復元したい場合は、次のようにします。

exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate

したがって、このスクリプトでは4、少なくともしばらくの間、ファイル記述子を使用できます。その4は、使用されていないものでもかまいません(プロセスが開くことができるファイルの数には制限がありますが、その制限内のものはすべてです)。

プロセスで開いているファイル記述子と、それらがどこに開いているかを確認するには、を調べ/proc/<pid>/fdます。これにより、そのプロセスで開いているすべてのファイル記述子と、<pid>それらが関連付けられているファイルが表示されます。


0

すべてのプロセスは整数をファイル記述子として取得します。POSIXには3つの予約済みのものがあります。0はstdin、1はstdout、2はstderrです。それ以降のファイルには、さらに番号が割り当てられます。このプログラムで簡単に確認し、fdtest.cとして保存して、実行時に独自のプログラムコードを開くことができます。

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int fd = open("fdtest.c", O_RDONLY);
    printf("%d\n", fd);
    close(fd);
    return 0;
}

コンパイルします。

gcc fdtest.c -o fdtest

それを実行します:

./fdtest

あなたが得る出力は次のようなものです:

3

...これは、変数によって参照されるファイルのファイル記述子の番号ですfd

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.