我有简单的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()函数。请帮帮我。
答案 0 :(得分:7)
子进程需要以错误状态退出(非零; 1是常见的,EXIT_FAILURE
是标准C)。
父进程需要等待孩子完成,并使用wait()
或者waitpid()
来捕获孩子的退出状态。
{{3}}
如果您需要知道孩子是否已经死亡但又不想等待它完成,请在暂停一小段时间后waitpid()
与WNOHANG
一起让孩子试着跑(亚秒级延迟可能足够长。)
答案 1 :(得分:1)
一种可能的解决方案涉及ptrace
。大纲如下:
让孩子打电话给ptrace(PTRACE_TRACEME)
。让父母为孩子启用PTRACE_O_TRACEEXEC
选项和waitpid
。在此设置waitpid
成功execl
后将返回SIGTRAP
。测试状态以查看是否设置了PTRACE_DETACH
标志。让孩子继续{{1}}。