Как получить возвращаемое значение программы, запущенной путем вызова члена семейства функций exec?
Я знаю, что можно читать команды вывода с помощью трубы? Но как насчет получения возвращаемой стоимости? Например, я хочу выполнить:
execl("/bin/ping", "/bin/ping" , "-c", "1", "-t", "1", ip_addr, NULL);
Как я могу получить возвращаемое значение команды ping, чтобы узнать, вернул ли он 0 или 1?
- Перенаправление вывода exec в буфер или файл
- popen () альтернатива
- Использование котировок в getRuntime (). Exec
- Использование spawn nodejs вызывает ошибки «unknown option -» и «»
- bash: заставить exec'd обрабатывать небуферизованный stdout
- Как выполнить внешнюю программу из Node.js?
- Выполнение приложения Java в отдельном процессе
- Как вызвать execl () в C с соответствующими аргументами?
- Как заставить трубы работать с Runtime.exec ()?
- запустить команду оболочки из java
- Как выполнить команды cmd через Java
- Проблемы с fork (), pipe (), dup2 () и exec () в C
- Перенаправить Runtime.getRuntime (). Exec () с помощью System.setOut ();
Вот пример, который я написал давно. В принципе, после того, как вы переделаете дочерний процесс и вы 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), попробуйте прочитать об этом.