如何通过调用exec系列函数来获取程序的返回值?

时间:2010-04-19 11:52:46

标签: c exec

我知道可以通过管道读取命令输出吗?但是获得回报价值呢?例如,我想执行:

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

如何获取ping命令的返回值以确定它是返回0还是1?

6 个答案:

答案 0 :(得分:13)

这是我很久以前写的一个例子。基本上,在分叉子进程并且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;
}

答案 1 :(得分:5)

您可以使用waitpid将子进程的退出状态设置为:

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

答案 2 :(得分:4)

exec函数familly不返回,返回int仅在启动时发生错误时才会出现(就像没有找到要执行的文件一样)。

在调用 exec 之前,您必须从发送到分叉进程的信号中捕获返回值。

在你的信号处理程序中调用 wait() waitpid()(好吧,你也可以在你的进程中调用wait()而不使用任何信号处理程序,如果它有没别的办事。)

答案 3 :(得分:3)

无法理解和应用现有答案。

AraK's answer中,如果应用程序有多个子进程在运行,则无法知道哪个特定的子进程产生了获得的退出状态。根据手册页,

  

wait()和waitpid()

     

wait()系统调用暂停执行调用进程,直到其中一个子进程终止。呼叫等待(&amp; 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's exit code %d\n", WEXITSTATUS(statval));
        else
            printf("Child did not terminate with exit\n");
    }
    return 0;
}

随意将此答案转换为AraK答案的编辑。

答案 4 :(得分:1)

您可以使用exec来代替popen系列。然后使用fgetsfscanf读取输出。

char buff[MAX_BUFFER_SIZE];
FILE *pf = popen("your command", "r");
fscanf(pf, "%s", buff);
pclose(pf);

答案 5 :(得分:0)

您可以等待子进程并获取其退出状态。 系统调用是等待(pid),尝试阅读它。