这是一段自己测试fork()和vfork()的代码,代码不长,有一些疑问向高手请教
#include
#include
#include
#include
int main()
{
pid_t pid;
int i;
int j=0;
pid_t pid0;
pid0=getpid();
printf("now_id=%d\nnow_id=%d\n",pid0,getpid());
for(i=0;i<2;i++)
{
if((pid=fork())<0)/*此处第一个程序用fork(),第二个程序用vfork()*/
{
printf("fork error !\n");
exit(1);
}
else if (pid==0)
{
printf("child process is printing.\nreturn_id=%d\n",pid);/*返回0*/
printf("j=%d\n",j++);
printf("now_id=%d\n",getpid());/*输出当前进程ID*/
}
else
{
printf("parent process is printing.\nreturn_id=%d\n",pid);/*返回子进程ID*/
printf("pj=%d\n",j++);
printf("now_id=%d\n",getpid());
}
}
exit(0);
}
运行结果:
第一个程序,fork():
zhangxiong@zhangxiong-desktop:~/c_code$ ./a.out
now_id=6411
now_id=6411
child process is printing.
return_id=0
j=0
now_id=6412
child process is printing.
return_id=0
j=1
now_id=6413
parent process is printing.
return_id=6412
pj=0
now_id=6411
parent process is printing.
return_id=6413
pj=1
now_id=6412
child process is printing.
return_id=0
j=1
now_id=6414
parent process is printing.
return_id=6414
pj=1
now_id=6411
第二个程序,vfork():
zhangxiong@zhangxiong-desktop:~/c_code$ ./a.out
now_id=6396
now_id=6396
child process is printing.
return_id=0
j=0
now_id=6397child
child process is printing.
return_id=0
j=1
now_id=6398
parent process is printing.
return_id=6398
pj=2
now_id=6397
parent process is printing.
return_id=6397
pj=3
now_id=6396
疑问:
1、对于第一个程序使用fork()产生的运行结果有些不理解,j的数值的变化为(0,1),而第二个程序使用vfork(),j的数值的变化为(0,1,2,3),是因为这个原因么(“fork()同父进程使用不同的数据段,vfork()和父进程共享数据段”),所以第一个程序中父子进程中相同的变量名j却是代表了不同的变量,在内存中有不同的内存空间,是不是这样呢,对这句话理解的不是十分清楚,不知道这是怎样一个过程,请教,请教;
2,第一个程序执行了2次fork(自己的理解,如果错了还请包涵,呵呵),却弄出了三个子进程,6411有两个(6412,6414)子进程,这是怎么回事呢?最后这个6414是怎么产生的呢?
3、书上说“调用fork()时,系统将创建一个与当前进程相同的新的子进程,但是同父进程使用不同的数据段和堆栈段,属性有稍微差异”,请教高手解释一下“使用不同的数据段和堆栈”,并能详细描述一下此程序的运行过程;
4、对于第一个程序,如果增加循环的次数,会有更复杂的情况出现,比如当循环的控制条件为(i<3)时,有一段混乱的输出:
child process is printing.
parent process is printing.
return_id=0
j=1
now_id=6481
return_id=6480
pj=2
now_id=6477
子进程和父进程交互着输出,怎么回事呢?
5、第一个程序fork(),似乎有一个规律:
循环控制条件,“->”符号意义(父进程-(产生)->子进程)
(i<2):6411->6412->6413
6411->6414
(i<3):6476->6477->6478->6479
6477->6480
6476->6481->6482
6476->6483
执行两此循环第一个父进程有两个子进程,第一个子进程有子进程,第二个子进程没子进程;
执行三次循环第一个父进程有三个儿子,其中大儿子有两个儿子(这兄弟俩老大有一个儿子,老二没儿子),二儿子有一个有儿子的儿子,三儿子没儿子;(为了方便描述和理解,所以这么说,见谅,见谅)
这是一个什么样的规律呢,又是怎样运行出来的呢?
6、向高手请教,非常感谢!
阅读(1427) | 评论(1) | 转发(0) |