vfork程序无限循环

来源:互联网 发布:狗狗淘宝网 编辑:程序博客网 时间:2024/05/16 18:04

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

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

0 0
原创粉丝点击