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的时候的结果如下:
[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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值