Как получить возвращаемое значение программы, запущенной путем вызова члена семейства функций 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), попробуйте прочитать об этом.