#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int val;
if(argc!=2)
{
printf("Usage: %s <descriptor> \n", argv[0]);
exit(1);
}
val=fcntl(atoi(argv[1]), F_GETFL, 0);
switch(val & O_ACCMODE)
{
case O_RDONLY:
printf("read only");
break;
case O_WRONLY:
printf("write only");
break;
case O_RDWR:
printf("read write");
break;
default:
printf("unknown access mode");
}
if(val & O_APPEND)
printf(", append");
if(val & O_NONBLOCK)
printf(", nonblocking");
if(val & O_SYNC)
printf(", synchronous writes");
putchar('\n');
exit(0);
}
このコードがあります。とにかくソースは完全に理解可能です。
しかし、コマンドライン引数とリダイレクトでプログラムを使用するのは混乱しています。
このプログラムを使った結果は次のとおりです。
$ ./a.out 0 < /dev/tty
read only
$ ./a.out 1 > temp.foo
$ cat temp.foo
write only
$ ./a.out 2 2>>temp.foo
write only, append
$ ./a.out 5 5<>temp.foo
read write
リダイレクトを実行する方法を知っていますが、コマンドライン引数でこの手法を使用するのは非常に混乱しています。私は何も知らない。
まあ、私の知る限り、このプログラムにはファイル記述子というパラメータが1つあります。
だからこのプログラムを使うと
$ ./a.out 0
read write
$ ./a.out 1
read write
$ ./a.out 2
read write
いいですね。 stdin、stdout、stderrファイルの状態はですread write
。
ただし、リダイレクトにこのコマンドを使用する場合。どのメカニズムが何をしているのかわかりません。
たとえば、
./a.out 0 < /dev/tty
ここで/dev/tty
、ファイルは標準入力と同じです。もしそうなら/dev/tty
、0は正確に何を意味しますか?
リダイレクトを使用するときとの違いは何ですか&2
?&1
2
1
ベストアンサー1
リダイレクトを実行する方法を知っていますが、コマンドライン引数でこの手法を使用するのは非常に混乱しています。私は何も知らない。
正確に何があなたを混乱させるかを詳しく説明してください。私にとって、結果は予想したものとほぼ同じです。ファイルオブジェクトが読み取り専用で開かれている場合(例: "<"リダイレクト)、F_GETFLはO_RDONLYを提供します。他のタイプのリダイレクトにも同様です。
リダイレクトがない場合、サブコマンドは親コマンドと同じ標準記述子を取得します。ユーザー端末である一般的な対話状況では、すべての記述子を読み書きできます。読み取り専用、書き込み専用などにすることを決定することは、端末入力のためにゼロに分割するcurses
よりも、対話型端末活動(たとえば、使用される全画面活動)に同じ記述子を使用する方が便利であるため、役に立ちません。端子出力等のための端子入力の場合。ただし、これはユーザーが指定したリダイレクトには拡張されません。それはあなたが尋ねるものですか?
リダイレクトを使用するときの&2、&1と2、1の違いは何ですか?
2>1
とのような形式を意味する場合、主に2>&1
異なります。2>1
ファイルに書き込むには2をリダイレクトします1
。2>&1
2を記述子1のコピーにリダイレクトします(Cレベルではdup2(1,2)
)。数値nとmの場合は同じで、アクセスパターンに制限を追加しませんn<&m
。n>&m