Как получить возвращаемое значение программы, запущенной путем вызова члена семейства функций exec?

Я знаю, что можно читать команды вывода с помощью трубы? Но как насчет получения возвращаемой стоимости? Например, я хочу выполнить:

execl("/bin/ping", "/bin/ping" , "-c", "1", "-t", "1", ip_addr, NULL); 

Как я могу получить возвращаемое значение команды ping, чтобы узнать, вернул ли он 0 или 1?

Вот пример, который я написал давно. В принципе, после того, как вы переделаете дочерний процесс и вы wait его статуса выхода, вы проверяете статус с помощью двух макросов. WIFEXITED используется для проверки того, что процесс WEXITSTATUS нормально, и WEXITSTATUS проверяет, что возвращается в случае, если оно возвращается нормально:

 #include  #include  #include  int main() { int number, statval; printf("%d: I'm the parent !\n", getpid()); if(fork() == 0) { number = 10; printf("PID %d: exiting with number %d\n", getpid(), number); exit(number) ; } else { printf("PID %d: waiting for child\n", getpid()); wait(&statval); if(WIFEXITED(statval)) printf("Child's exit code %d\n", WEXITSTATUS(statval)); else printf("Child did not terminate with exit\n"); } return 0; } 

Вы можете использовать waitpid для получения статуса выхода вашего дочернего процесса как:

 int childExitStatus; waitpid( pID, &childExitStatus, 0); // where pID is the process ID of the child. 

Функция exec функции familly не возвращает, возвращаемый int здесь, только когда во время запуска возникает ошибка (например, не найти файл для exec).

Вы должны поймать возвращаемое значение из сигнала, отправленного процессу, который был разветвлен перед вызовом exec .

call wait () или waitpid () в обработчике сигнала (ну, вы также можете вызвать wait () в своем процессе, не используя никакого обработчика сигналов, если ему больше нечего делать).

Были проблемы с пониманием и применением существующих ответов.

В ответе AraK , если приложение имеет более одного дочернего процесса, невозможно узнать, какой конкретный дочерний процесс получил статус выхода. Согласно странице руководства,

wait () и waitpid ()

Системный вызов wait () приостанавливает выполнение вызывающего процесса до тех пор, пока один из его дочерних элементов не завершится . Ожидание вызова (& status) эквивалентно:

  waitpid(-1, &status, 0); The **waitpid()** system call suspends execution of the calling process until a **child specified by pid** argument has changed state. 

Итак, чтобы получить статус выхода определенного дочернего процесса, мы должны переписать ответ как:

 #include  #include  #include  int main() { int number, statval; int child_pid; printf("%d: I'm the parent !\n", getpid()); child_pid = fork(); if(child_pid == -1) { printf("could not fork! \n"); exit( 1 ); } else if(child_pid == 0) { execl("/bin/ping", "/bin/ping" , "-c", "1", "-t", "1", ip_addr, NULL); } else { printf("PID %d: waiting for child\n", getpid()); waitpid( child_pid, &statval, WUNTRACED #ifdef WCONTINUED /* Not all implementations support this */ | WCONTINUED #endif ); if(WIFEXITED(statval)) printf("Child's exit code %d\n", WEXITSTATUS(statval)); else printf("Child did not terminate with exit\n"); } return 0; } 

Не стесняйтесь использовать этот ответ для редактирования ответа AraK.

Вы можете подождать дочернего процесса и получить его статус выхода. Системный вызов wait (pid), попробуйте прочитать об этом.

  • Запуск внешней программы с перенаправленным stdin и stdout из Java
  • Как использовать символ трубы через exec в Java
  • find: отсутствующий аргумент для -exec
  • Как запустить полностью независимый процесс из Java-программы?
  • Как выполнить команду с параметрами?
  • Запуск команд оболочки, хотя java-код на Android?
  • Давайте будем гением компьютера.