当前位置: 技术问答>linux和unix
fork()卡住了不走了,什么回事?
来源: 互联网 发布时间:2016-08-29
本文导语: /*test.c*/ printf("fork beforen"); pid = fork(); printf("fork after, pid->[%d]n", pid); execl("/bin/ls", "/bin/ls", NULL); 执行正常的话, 应该是一个名为test的父进程,一个名为ls的子进程。 放到开发板上,居然出问题了,看到的是两...
/*test.c*/
printf("fork beforen");
pid = fork();
printf("fork after, pid->[%d]n", pid);
execl("/bin/ls", "/bin/ls", NULL);
执行正常的话, 应该是一个名为test的父进程,一个名为ls的子进程。
放到开发板上,居然出问题了,看到的是两个test进程
"fork after ,pid->[1259] "有这条父进程打印的信息
但是子进程没有打印“ork after ,pid->[0]”, 貌似fork()子进程的时候卡住了,但是明明又有进程copy出来,有没有人知道什么回事呢????
printf("fork beforen");
pid = fork();
printf("fork after, pid->[%d]n", pid);
execl("/bin/ls", "/bin/ls", NULL);
执行正常的话, 应该是一个名为test的父进程,一个名为ls的子进程。
放到开发板上,居然出问题了,看到的是两个test进程
"fork after ,pid->[1259] "有这条父进程打印的信息
但是子进程没有打印“ork after ,pid->[0]”, 貌似fork()子进程的时候卡住了,但是明明又有进程copy出来,有没有人知道什么回事呢????
|
围观围观,职业围观。
|
叽。。。。。。。。。。。。。。。。。。。。。
|
printf("fork beforen");
pid = fork();
if (pid == 0) {
execl("/bin/ls", "ls", (char *)0);
exit(1);
}
printf("fork after, pid->[%d]n", pid);
|
再试试上面的代码,特别要注意:
1. fork之后,在子进程里,不要调用任何除_exit()和execl外的函数。
2. fork之后,在子进程里,不要调用修改任何变量。(pid = fork()除外)
3. fork之后,在子进程里,不要return。
原因是嵌入式系统上的fork, 大多数实际上是vfork,如果楼主知道vfork和fork的区别在,应该能明白上面提到的3个不能。
http://www.opengroup.org/onlinepubs/7990989775/xsh/vfork.html
|
fork就是分叉,把进程一分为二,两个一样的进程,所以你是把进程分成了两个一样的test,然后每个test再分叉(execl也会fork的)做个ls再返回自己的test;
要让fork的两个进程做不同的事,要通过"if(pid>0){父进程 }else if(pid==0){子进程 } else {错误处理}"来控制,fork出来的两个进程的返回值不一样,大于0是父进程,0是子进程,小于0是出错,两个进程都会执行fork后的所有语句,直到exit;但是由于两个进程的返回值pid不一样,他们执行同一个if语句判断的结果也不一样,就会去做不同的事情,如果不判断pid,两个进程做的事情完全没有区别;
如果错误的话,(比如进程不够等等),系统是不会把你要的进程分给你的,该进程后面的语句就是废话;
要让fork的两个进程做不同的事,要通过"if(pid>0){父进程 }else if(pid==0){子进程 } else {错误处理}"来控制,fork出来的两个进程的返回值不一样,大于0是父进程,0是子进程,小于0是出错,两个进程都会执行fork后的所有语句,直到exit;但是由于两个进程的返回值pid不一样,他们执行同一个if语句判断的结果也不一样,就会去做不同的事情,如果不判断pid,两个进程做的事情完全没有区别;
如果错误的话,(比如进程不够等等),系统是不会把你要的进程分给你的,该进程后面的语句就是废话;