首页 文章

如何在C程序中调用execl()后控制父进程的执行?

提问于
浏览
1

我有简单的C程序,它使用fork()和execl()执行应用程序 . 如果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()不会成功返回 . 因此,如何在子进程中执行execl()之后正确调用HandleSuccessFromParent()和HandleFailureFromParent()函数 . 请帮我 .

2 回答

  • 7

    子进程需要以错误状态退出(非零; 1是常见的, EXIT_FAILURE 是标准C) .

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

    如果您需要知道孩子是否已经死亡但又不想等待它完成,请在小暂停后使用 waitpid()WNOHANG 让孩子尝试并运行(亚秒级延迟可能足够长) .

  • 1

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

    让孩子打电话 ptrace(PTRACE_TRACEME) . 让父母为孩子启用 PTRACE_O_TRACEEXEC 选项和 waitpid . 在此设置中 waitpid 将在成功 execl 时返回 . 测试状态以查看是否设置了 SIGTRAP 标志 . 让孩子继续 PTRACE_DETACH .

相关问题