Как получить вывод exec()?

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