在与我的朋友强烈讨论后,我们决定询问我们的直觉是否在正确的道路上。问题在于fork()函数或者更确切地说是子进程。 这是代码:
int main()
{
int status;
if(!fork()) execl("pp1",NULL);
if(!fork()) execl("pp2",NULL);
if(!fork()) execl("pp3",NULL);
wait(&status);
return status;
}
作者解释说,这个程序只会创建3个子进程,但是当它到达第一个子进程时,它将进入第一个“if”并执行pp1作为一个新进程,但使用与子进程相同的pid,那没关系。问题在于第二个和第三个孩子,它将如何运行此代码。我们的直觉是我们不会达到第二和第三“如果”。程序pp1将由所有3个子进程运行3次。
你怎么看?结果会是什么?答案 0 :(得分:2)
请注意fork()
的返回值。来自man 2 fork
:
成功时,子进程的PID在父进程中返回,并在子进程中返回0。失败时,在父项中返回-1,不创建子进程,并且设置了errno- ately。
表示子进程在成功fork之后收到0
。当!0
评估为true
时,孩子会执行execl
,然后父亲会前进到下一个fork()
。
答案 1 :(得分:0)
此代码将执行pp1,然后执行pp2,最后执行pp3。好的。但是,验证execl的返回值也可能是一个好主意。如果失败,它将不会退出(是的,执行功能退出运行过程)。
但我不知道你想做什么。但是要从C程序启动二进制文件(即使你只是想得到这个程序的返回值),它可以(我说“可以”;))更好地使用'system()'函数。它返回参数中传递的程序的值,并且在执行后不会退出程序,与exec函数不同。
我只是提供另一种解决方案。我不批评那个;)