たとえば、「一部の数字が次より大きい」構文を使用してプログラム出力をリダイレクトしようとすると、foo 2> myfile
ここで可能な数字は何であり、これは何を表しますか?
/dev/stdout
私は1が、2価だと思います/dev/stderr
。 5と6はどうですか? 3、4、6より大きい数字がありますか?
答え1
この仮想プログラムは、ユーザーが指定したファイル記述子に書き込みます。次の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)
答え2
この数字はファイル記述子(ファイルオープンハンドル)を表します。
シェルは通常自動的に3を設定します。
0 - 標準入力 1 - 標準出力 2 - 標準エラー
しかし、より多くのファイルを開くことができ、その数が増えます。
答え3
この数字はファイル記述子。指摘したように、複数が自動的に生成されます。他のファイルやファイルに似たアイテムを開くと、別の番号が得られます。
特定のプログラムで使用される番号は、プログラムが開いたファイルや他の方法で使用したファイルによって異なります。たとえば、現在の標準入力を「保存」して一時的に他の場所から標準入力をリダイレクトしてから後で復元するには、次のようにします。
exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate
4
したがって、このスクリプトには少なくともしばらく使用できるファイル記述子があります。ただし、4は未使用のファイルにすることができます(プロセスが開くことができるファイルの数には制限がありますが、その制限内の任意のファイルにすることができます)。
プロセスがどのファイルディスクリプタを開いたか、ファイルディスクリプタを見ると、どこで開いているかを確認できます/proc/<pid>/fd
。これには、プロセス用に開いているすべてのファイル記述子<pid>
とそれに関連するファイルが表示されます。
答え4
すべてのプロセスはファイル記述子として整数を取得し、そのうちの3つはPOSIXに予約されています。 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
。