2016-10-05 5 views
1

Я нашел код, который получает файловый дескриптор файла. Код следующий.Почему exec {fd} <файл назначает файловый дескриптор файла fd?

exec {fd}<'file' 

К сожалению, в коде не указано, почему он может получить файловый дескриптор exec. Даже после того, как я прочитал руководство по bash, я не мог понять, какую команду выполняет exec. Кто-то, кто знает механизм вышеприведенного кода, сообщите мне. Большое спасибо.

ответ

2

Это немного странно.

Обычно, когда вы запускаете программу, вы можете указать переназначения:

cat 0<file #= cat <file 

Это в основном создает процесс cat по fork Инг. Затем он opensfile, dup s его filedescriptor на filedescriptor 0, а затем exec s cat внутри ребенка.

//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); 
     //.. 
} 

Если вместо этого было exec cat 0<file, то не было бы fork ИНГ, и переназначение и exec вызова будет происходить в рамках текущего процесса:

int fd; 
fd = open("file", O_RDONLY); 
//... 
dup2(fd, 0); 
//.. 
execvpl("cat", "cat", (char*)0); 
//.. 

Корпуса перегружать exec так что, если нет предусмотрена программа exec, только в текущем процессе выполняется только open ing и dup ing (которые вместе переходят на перенаправление оболочки).

Это позволяет перенаправлять для текущего процесса:

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

Bash и другие дополнительные оболочки дополнительно расширить это, чтобы позволить вам использовать синтаксис 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 

Скобки Прилагаю имя, а не целое число, которое задает оболочку найти доступный дескриптор для нас, открыть файл на этом дескрипторе , затем задайте имя, равное этому значению.

# 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

Смежные вопросы