如何控制在C程序EXECL()调用后父进程的执行?(How to control execution

2019-10-21 05:06发布

我有执行使用fork()和EXECL()的应用简单的C程序。 如果EXECL()无法运行该应用程序,然后我打电话给从子进程的父进程的功能并退出。 如果EXECL()成功运行的应用程序,那我也显示从父进程取得成功日志。 所以,父进程应该等待孩子的EXECL()调用(只是调用,而不是直到应用程序的执行结束),获取有关它的状态的信息,然后再做出决定,并继续自己的执行。 这里是我的代码。

int main()
{
    int iExecRetVal, pid;
    pid = fork();

    if (pid == -1)
    {

    }
    else if (pid > 0)
    {
    }
    else
    {
        iExecRetVal = execl("./flute-static", "./flute-static", "-send", "-a192.168.190.1/6666", "JFlute.1.2.tar.gz", NULL);
        if (iExecRetVal == -1)
        {
            /*execl() failed, need some error handling in the parent process*/
        }
        _exit(0);
    }

    /*Parent's normal execution*/
}

int HandleSuccessFromParent()
{
    /*Should be called when exec call was successful*/
}

int HandleFailureFromParent()
{
    /*Should be called when exec call was NOT successful*/
}

我们知道EXECL()成功不返回。 那么,如何调用HandleSuccessFromParent()和HandleFailureFromParent()函数在孩子EXECL()调用后正常。 请帮我。

Answer 1:

子进程需要与一个错误状态退出(非零1是共同的, EXIT_FAILURE是标准C)。

父进程需要等待孩子完成,并捕捉到孩子的退出状态,使用wait()waitpid()

如果您需要了解孩子是否死亡,但不想等待它完成,使用waitpid()WNOHANG一个小小的停顿之后让孩子尝试和运行(一分一秒的延迟可能是足够长的时间)。



Answer 2:

一个可能的解决方案涉及ptrace 。 大纲如下:

让孩子调用ptrace(PTRACE_TRACEME) 让家长能PTRACE_O_TRACEEXEC选项, waitpid的孩子。 在此设置waitpid将返回在成功execl 。 测试状态,看它是否有一个SIGTRAP标志设置。 让孩子继续PTRACE_DETACH



文章来源: How to control execution of parent process after execl() call in C program?