天天看点

vfork程序无限循环

我看资料说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;
}
           

1. 其中子进程使用exit的时候的结果如下:

[[email protected] vfork]$ ./vfork 

child val:0 g_val:0

father val:1 g_val:2

[[email protected] vfork]$ 

2. 子进程中使用return的时候:

[[email protected] 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

[[email protected] vfork]$ 

3.子进程中既不调用exit也不调用return的时候:

[[email protected] 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

[[email protected] vfork]$ 

调用exit和预想的结果一样,父进程的空间被修改。但是调用return则有些不解。

刚刚开始的时候我也觉得不可思议,不是说了子进程没有调用exit或者exec父进程不会被调用吗?怎么父进程还是被调用了,而且他们怎么还成了死循环了呢?或者说我什么既不调用return又不调用exit怎么也成了死循环了。

结合网上的资料,我自己也想了一下,return 的时候程序的栈空间会释放,清理资源。而且是子进程调用的return啊,子进程还先调用啊,过河拆桥?这真是“坑爹”啊,父进程运行的栈都被破坏了,还怎么执行啊。至于什么都不调用我想和这个差不多吧,子进程实在父进程空间上运行的,子进程运行结束后会自动清理资源,和return一样。

现在想想这个确实不是什么很难的问题,但是就当是写给自己和那些还没弄懂的人看吧,万一哪天我忘记了,还可以回头来再看看

我是看了这位大神的 http://coolshell.cn/articles/12103.html

他写了很多文章,大家也可以去看看的