How to get the return value of a program ran via calling a member of the exec family of functions?

后端 未结 5 2074
面向向阳花
面向向阳花 2020-11-27 06:45

I know that it is possible to read commands output with a pipe? But what about getting return value ? For example i want to execute:

execl(\"/bin/ping\", \"/         


        
5条回答
  •  死守一世寂寞
    2020-11-27 07:34

    Had trouble understanding and applying the existing answers.

    In AraK's answer, if the application has more than one child process running, it is not possible to know which specific child process produced the exit status obtained. According the man page,

    wait() and waitpid()

    The wait() system call suspends execution of the calling process until one of its children terminates. The call wait(&status) is equivalent to:

           waitpid(-1, &status, 0);
    
       The **waitpid()** system call suspends execution of the calling process until a **child specified by pid** argument has changed state.
    

    So, to obtain the exit status of a specific child process we should rewrite the answer as :

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

    Feel free to turn this answer to an edit of AraK's answer.

提交回复
热议问题