Это немного странно.
Обычно, когда вы запускаете программу, вы можете указать переназначения:
cat 0<file #= cat <file
Это в основном создает процесс cat
по fork
Инг. Затем он opens
file
, 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);
Благодарим вас за прекрасный подробный ответ. В конце концов я смог понять механизм. Еще раз спасибо. – mora
Рад, что все ясно. Сначала я перепутал пару деталей. Надеюсь, теперь это должно быть в основном правильным. – PSkocik