2016-10-05 15 views
1

「ファイル」のファイル記述子を取得するコードが見つかりました。コードは以下のとおりです。なぜexec {fd} <fileはファイルのファイルディスクリプタをfdに割り当てるのですか?

exec {fd}<'file' 

残念ながら、このコードでは、残念ながらexecによってファイルディスクリプタを取得できる理由はありませんでした。私がbashのマニュアルを読んだ後でも、ここでexecが実行するコマンドは理解できませんでした。上記のコードの仕組みを知っている人は、私に知らせてください。どうもありがとうございました。

答えて

2

少し奇妙です。あなたがプログラムを実行すると

通常は、リダイレクトを指定することができます。

cat 0<file #= cat <file 

は、これは基本的にcatforkによってINGのためのプロセスを作成します。その子の中にと書かれた後に、opensfile,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に提供され、現在のプロセス内ではopendup(シェルリダイレクトに翻訳されます)のみが実行されます。あなたは現在のプロセスのためにリダイレクトすることができます

exec 0<file  #standard input is the file "file" from this point forward 

バッシュおよびその他の高度なシェルは、さらにあなたは、単にファイルを開き、ファイル記述子の数を取得するためにexec構文を使用できるようにするために、これを拡張します。

exec {fd}<file 

は、基本的に行うための彼らの方法である:

fd = open("file", O_RDONLY); 
+0

きれいな詳細な回答ありがとうございます。私は最終的にメカニズムを理解することができた。ありがとうございました。 – mora

+1

うれしいですね。もともと私はそれの中のいくつかの細部を台無しにしていました。うまくいけば、それは今ほとんど正しいはずです。 – PSkocik

3

シンタックスの特殊ビットは、識別子を囲む中カッコです。通常は、中括弧が名前を囲む

exec 3<file # Open file for reading on fd 3 
fd=5 
exec $fd<file # Open file for reading on fd 5 

、私たちのために利用できる記述子を見つけるために、シェルを尋ねていない整数は、その記述子でファイルを開くように整数値にevalutes式を指定しますその名前と同じ値を設定します。

# Pretend there is a function called get_avail_fd 
# Then the following is something like 
#  fd=$(get_available_descriptor) 
#  exec $fd<file 
# except there is no race condition or need to lock 
# file descriptor between the call to get_avail_fd and exec 
exec {fd}<file 
+0

は、実践的な知識と使用方法を提供していただきありがとうございます。 – mora

関連する問題