#c #linux #unix #fork #exec
Вопрос:
Как мне получить выходные данные программы, запущенной exec(). Допустим, у меня есть этот код:
int main(int argc, char ** argv) { int fid = fork(); if(fid == 0) { execlp("ls", "ls", NULL); } wait(); return 0; }
Как родительский процесс может получить вывод команды ls?
Ответ №1:
exec
Семейство функций полностью заменяет текущий процесс. Однако они не закрывают файловые дескрипторы, если только они не помечены как близкие к исполнению. Таким образом, типичный способ сделать это-создать канал, в котором сторона чтения принадлежит родителю, а сторона записи принадлежит ребенку.
Это выглядело бы примерно так (проверка на ошибки опущена и явно неэффективна):
#include lt;stdint.hgt; #include lt;sys/wait.hgt; #include lt;unistd.hgt; int main(int argc, char ** argv) { int pipefd[2]; int status; uint8_t buf[256]; pipe(pipefd); int fid = fork(); if(fid == 0) { close(pipefd[0]); dup2(pipefd[1], 1); close(pipefd[1]); execlp("ls", "ls", NULL); } close(pipefd[1]); while (read(pipefd[0], buf, 1) gt; 0) write(1, buf, 1); wait(amp;status); return 0; }
Обратите внимание, что для подключения дескриптора файла канала к стандартному выходу (FD 1) вам необходимо использовать dup2
. Вам также необходимо закрыть концы трубы, которую вы не используете, иначе вы никогда не достигнете конца файла.
Если вас интересует статус выхода, wait
(или waitpid
) предоставит вам это; см. страницу руководства, чтобы узнать, как определить, нормально ли он вышел, и если да, то каков был этот статус.