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;}
[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
他写了很多文章,大家也可以去看看的
- vfork程序无限循环
- 通过while实现程序的无限循环
- vfork死循环问题
- 无限循环
- 关于Ctrl-C中断无限循环程序的记录
- vfork为什么会出现死循环
- 无限循环出错原因
- javascript无限循环滚动
- 实现gallery无限循环
- Android Gallery无限循环
- viewpager无限循环
- 无限循环陷阱
- 嵌入式 shell无限循环
- scrollview 无限循环
- Gallery无限循环
- 删除无限循环目录
- 无限循环的ViewPager
- 无限循环的计时器
- iOS开发:网络参考模型
- 在UNIX中关于RM 命令的警示
- lucene5.5根据现有分词器改造做同义词分词器
- 虚拟机+ubuntu 图形界面和终端界面的切换
- 函数调用的区别:_cdecl以及_stdcall
- vfork程序无限循环
- Comparable 和 Comparator
- Android开发之获取APP的应用程序名称以及版本名称信息java工具类
- linux下的vim/vi永久显示行号
- ARM、8051、AVR、MSP430、Coldfire、DSP、FPGA七种体系比较区别
- Linux命令之大文件切分与合并
- iOS 图片大小压缩 图片尺寸处理
- java.util.concurrent.CyclicBarrier
- 在HTML中URL、src、href分别代表什么?如何使用?