回答:
この想定プログラムは、指定したファイル記述子番号に書き込みます。次の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
。
これらの番号はファイル記述子です。お気づきのように、いくつかは自動的に作成されます。他のファイルまたはファイルのようなものが開かれると、それらは他の番号を取得します。
特定のプログラムで使用される番号は、そのプログラムによって開かれたファイル、または使用されたファイルによって異なります。たとえば、現在の標準入力を「保存」して一時的に他の場所から標準入力をリダイレクトし、後で復元したい場合は、次のようにします。
exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate
したがって、このスクリプトでは4
、少なくともしばらくの間、ファイル記述子を使用できます。その4は、使用されていないものでもかまいません(プロセスが開くことができるファイルの数には制限がありますが、その制限内のものはすべてです)。
プロセスで開いているファイル記述子と、それらがどこに開いているかを確認するには、を調べ/proc/<pid>/fd
ます。これにより、そのプロセスで開いているすべてのファイル記述子と、<pid>
それらが関連付けられているファイルが表示されます。
すべてのプロセスは整数をファイル記述子として取得します。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
。