- Насколько я понимаю, fork () клонирует процесс, однако я не понимаю, как он выполняет команду, потому что execlp должен это делать, а код никогда не достигает этой части.
Fork возвращает pid дочернего элемента в родительском пространстве и 0 в новом пространстве процесса. Процесс son делает вызов execlp.
if (fork()) {
/* Parent process waits for child process */
}
else {
/* Son process */
execlp(command, command, NULL);
}
Я не понимаю, как работает execlp. Почему мы посылаем ему команду дважды (execlp (команда, команда, NULL);)?
Чтение execlp man-страница и this thread
Первый аргумент, по соглашению, должен указывать на имя файла, связанное с исполняемым файлом.
Как execlp знает, куда перенаправить вывод, если мы никуда не пропускаем outfile.
Перенаправление происходит раньше, закрывая дескрипторы файлов stdin и stdout. И перенаправление происходит путем открытия файлов, файловые дескрипторы которых будут содержать записи 0 и 1.
else {
/* redirecting stdin */
close(0);
open(infile, O_RDONLY);
/* redirecting stdout */
close(1);
open(outfile, O_CREAT|O_TRUNC|O_WRONLY, 0644);
execlp(command, command, NULL);
}
Зачем нам нужен infile, если команда уже передана в качестве другого аргумента?
Мы не можем сказать, что делает ваша программа, не увидев аргумент, переданный как команда.