Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Вот пример, который я написал давно. В принципе, после того, как вы переделаете дочерний процесс и вы 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 exit code %d\n", WEXITSTATUS(statval));
        else
            printf("Child did not terminate with exit\n");
    }
    return 0;
}

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

Не удалось понять и применить существующие ответы.

В Ответ 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 <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 exit code %d\n", WEXITSTATUS(statval));
        else
            printf("Child did not terminate with exit\n");
    }
    return 0;
}

Невозможно включить этот ответ в редактирование ответа AraK.

Ответ 5

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