我看资料说vfork会保证子进程先调子进程,并且子进程调用exit或者exec后父进程才可能被调用,那我既不调用exit又不调用exec,我用return会怎么样,或者我什么也不调用又会出现什么情况呢?
我的代码是这样的:
#include <stdio.h>
#include <stdlib.h>
int g_val=0;
int main()
{
int val = 0;
// pid_t id = fork();
pid_t id = vfork();
if(id < 0)
{
printf("error\n");
exit(0);
}
else if(id ==0)
{
printf("child val:%d g_val:%d\n",val,g_val);
sleep(1);
++val;
++g_val;
// exit(0); //子进程必须调用exec或exit后父进程才可能被调度
// return 0;
}
else
{
g_val++;
printf("father val:%d g_val:%d\n",val,g_val);
sleep(1);
}
return 0;
}
[admin@localhost vfork]$ ./vfork
child val:0 g_val:0
father val:1 g_val:2
[admin@localhost vfork]$
2. 子进程中使用return的时候:
[admin@localhost vfork]$ ./vfork
child val:0 g_val:0
father val:7790715 g_val:2
child val:0 g_val:2
father val:7790715 g_val:4
child val:0 g_val:4
father val:7790715 g_val:6
child val:0 g_val:6
father val:7790715 g_val:8
child val:0 g_val:8
father val:7790715 g_val:10
child val:0 g_val:10
father val:7790715 g_val:12
child val:0 g_val:12
father val:7790715 g_val:14
^C
[admin@localhost vfork]$
3.子进程中既不调用exit也不调用return的时候:
[admin@localhost vfork]$ ./vfork
child val:0 g_val:0
father val:7790715 g_val:2
child val:0 g_val:2
father val:7790715 g_val:4
child val:0 g_val:4
father val:7790715 g_val:6
child val:0 g_val:6
father val:7790715 g_val:8
child val:0 g_val:8
father val:7790715 g_val:10
^C
[admin@localhost vfork]$
调用exit和预想的结果一样,父进程的空间被修改。但是调用return则有些不解。
刚刚开始的时候我也觉得不可思议,不是说了子进程没有调用exit或者exec父进程不会被调用吗?怎么父进程还是被调用了,而且他们怎么还成了死循环了呢?或者说我什么既不调用return又不调用exit怎么也成了死循环了。
结合网上的资料,我自己也想了一下,return 的时候程序的栈空间会释放,清理资源。而且是子进程调用的return啊,子进程还先调用啊,过河拆桥?这真是“坑爹”啊,父进程运行的栈都被破坏了,还怎么执行啊。至于什么都不调用我想和这个差不多吧,子进程实在父进程空间上运行的,子进程运行结束后会自动清理资源,和return一样。
现在想想这个确实不是什么很难的问题,但是就当是写给自己和那些还没弄懂的人看吧,万一哪天我忘记了,还可以回头来再看看
我是看了这位大神的 http://coolshell.cn/articles/12103.html
他写了很多文章,大家也可以去看看的