Как получить возвращаемое значение программы, запущенной путем вызова члена семейства функций exec?
Я знаю, что можно читать вывод команд с трубой? Но как насчет получения возвращаемой стоимости ? Например я хочу выполнить:
execl("/bin/ping", "/bin/ping" , "-c", "1", "-t", "1", ip_addr, NULL);
Как я могу получить возвращаемое значение команды ping, чтобы узнать, вернул ли он 0 или 1?
5 ответов
вот пример, который я написал давно. В принципе, после того, как вы вилка детского процесса, и вы wait
его статус выхода, вы проверяете статус с помощью двух макросов. WIFEXITED
используется для проверки, если процесс вышел нормально, и WEXITSTATUS
проверяет, какой возвращаемый номер в случае, если он вернулся нормально:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
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.
вызов ждать() или waitpid () в вашем обработчике сигналов (ну, вы также можете вызвать wait () в своем процессе без использования какого-либо обработчика сигналов, если ему больше нечего делать).
возникли проблемы с пониманием и применением существующих ответов.
на ответ Арака, если приложение имеет более одного запущенного дочернего процесса, невозможно узнать, какой конкретный дочерний процесс произвел полученный статус выхода. Согласно man page,
wait() и waitpid()
на ждать() системный вызов приостанавливает выполнение вызывающего процесса до один из его детей прекращает. Ожидание вызова (&статус) эквивалентно:
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 <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
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;
}
Не стесняйтесь превратить этот ответ в редактирование ответа Арака.
вы можете подождать дочернего процесса и получить его статус выхода. Системный вызов-wait (pid), попробуйте прочитать об этом.