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

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

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

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

12 голосов | спросил skujins 19 PMpMon, 19 Apr 2010 15:52:46 +040052Monday 2010, 15:52:46

5 ответов


0

Вот пример, который я написал давно. По сути, после того, как вы разветвляете дочерний процесс и 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;
}
ответил AraK 19 PMpMon, 19 Apr 2010 16:03:47 +040003Monday 2010, 16:03:47
0

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

int childExitStatus;
waitpid( pID, &childExitStatus, 0); // where pID is the process ID of the child.
ответил codaddict 19 PMpMon, 19 Apr 2010 15:58:44 +040058Monday 2010, 15:58:44
0

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

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

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

ответил kriss 19 PMpMon, 19 Apr 2010 15:56:07 +040056Monday 2010, 15:56:07
0

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

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

  

wait () и waitpid ()

     

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

       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;
}

Не стесняйтесь превратить этот ответ в правку ответа Арака.

ответил xor007 12 Jam1000000amMon, 12 Jan 2015 01:37:15 +030015 2015, 01:37:15
0

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

ответил duduamar 19 PMpMon, 19 Apr 2010 15:57:48 +040057Monday 2010, 15:57:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132