Lip*_*eka 2 c linux fork execve
我运行了几个程序,fork()然后execve()是第三个程序.这些程序的所有内容都已完成,但最后第三个程序没有返回...即命令提示符不会出现.
如果我wait()在调用程序中使用一个命令,那么execve只有当wait语句的顺序与execve程序结束的顺序匹配时,程序才会返回.为什么会这样?
这是简化的代码:
int main()
{
int child1,child2,status;
char*newargv1[] = {./xyz",NULL};
char *newargv2[] = {./abc",NULL};
if((child1 = fork())==0)
execve(newargv1[0],newargv1,NULL);
if((child2 = fork())==0)
execve(newargv2[0],newargv2,NULL);
while(wait(&status) != child1);
while(wait(&status) != child2);
}
Run Code Online (Sandbox Code Playgroud)
如果child1首先完成,它可以正常工作../xyz和./abc有一些简单的处理和控制到达终点.
while(wait(&status) != child1);
while(wait(&status) != child2);
Run Code Online (Sandbox Code Playgroud)
在此代码中 - 您将等到child1完成,但如果child2先完成 - 您将获得状态并将其丢弃.然后,当child1完成时 - 你将进入下一个循环,但是你将永远不会获得状态child2因为你已经丢弃了它.
相反,保留一个子数组,并循环打开,wait直到您在一个while循环中获得数组的每个成员的状态,然后您将不会死锁.