我有一个简单的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()函数。请帮帮我。
发布于 2014-10-28 19:44:03
发布于 2014-10-28 18:55:32
一种可能的解决方案涉及ptrace
。提纲如下:
让孩子调用ptrace(PTRACE_TRACEME)
。让父级在子级上启用PTRACE_O_TRACEEXEC
选项和waitpid
。在此设置中,waitpid
将在execl
成功后返回。测试状态以查看是否设置了SIGTRAP
标志。让孩子继续使用PTRACE_DETACH
。
https://stackoverflow.com/questions/26615737
复制相似问题