少し奇妙です。あなたがプログラムを実行すると
通常は、リダイレクトを指定することができます。
cat 0<file #= cat <file
は、これは基本的にcat
fork
によってINGのためのプロセスを作成します。その子の中にと書かれた後に、opens
file
,dup
のファイル記述子が0に書き込まれます。あなたの代わりにexec cat 0<file
にした場合
//Equivalent C code:
pid=fork();
//... (=error checking)
if(0==pid){
//child
int fd;
fd = open("file", O_RDONLY);
//...
dup2(fd, 0);
//..
execvpl("cat", "cat", (char*)0);
//..
}
して、そこにはfork
ING、 とリダイレクションないだろうとexec
コールは、現在のプロセス内で発生します:ようがない場合
int fd;
fd = open("file", O_RDONLY);
//...
dup2(fd, 0);
//..
execvpl("cat", "cat", (char*)0);
//..
シェルはexec
をオーバーロードプログラムはexec
に提供され、現在のプロセス内ではopen
とdup
(シェルリダイレクトに翻訳されます)のみが実行されます。あなたは現在のプロセスのためにリダイレクトすることができます
:
exec 0<file #standard input is the file "file" from this point forward
バッシュおよびその他の高度なシェルは、さらにあなたは、単にファイルを開き、ファイル記述子の数を取得するためにexec
構文を使用できるようにするために、これを拡張します。
exec {fd}<file
は、基本的に行うための彼らの方法である:
fd = open("file", O_RDONLY);
きれいな詳細な回答ありがとうございます。私は最終的にメカニズムを理解することができた。ありがとうございました。 – mora
うれしいですね。もともと私はそれの中のいくつかの細部を台無しにしていました。うまくいけば、それは今ほとんど正しいはずです。 – PSkocik