fork和vfork函数
fork:
fork用于派生一个进程。如果成功,父进程返回子进程的ID,子进程中返回0,若出错则返回-1。
主要用途:
一个进程希望复制自身,从而子父进程能同时执行不同的代码段。
进程想要执行另一个程序
例如:
#include<stdio.h>#include<sys/types.h>#include<stdio.h>intmain(){intcount=0;pid_tpid;pid=fork();//创建一个子进程if(pid<0){printf("errorinfork!");exit(1);}elseif(pid==0){printf("Iamthechildprocess,thecountis%d,myprocessID%d,pid=%d\n",++count,getpid(),pid);exit(0);}elseprintf("Iamtheparentprocess,thecountis%d,myprocessID%d,pid=%d\n",count,getpid(),pid);return0;}
输出结果:
Iamtheparentprocess,thecountis0,myprocessID13981,pid=13982Iamthechildprocess,thecountis1,myprocessID13982,pid=0
从中可以看出,两个进程中,原先就存在的那个被称为父进程,新出现的那个被称为子进程。父子进程的区别除了进程标识符(ID)不同外,变量pid的值也不同,pid存放的是fork的返回值。fork调用的一个奇妙之处就是它仅仅被调用一次,却能返回两次,它可能有三中不同的返回值
父进程中,返回新建子进程的ID
子进程中,返回0
若出错,则返回一个负值。
fork出错的原因有两种:
1. 当前的进程数已经达到系统规定的上限,
2.系统内存不足,
fork出错的可能性很小,一般为第一种情况
vfork与fork相同,父进程返回子进程的ID,子进程中返回0,若出错则返回-1。
不同的是:
fork要拷贝父进程的数据段;而vfork则不需要完全拷贝父进程的数据段,在子进程没有调用exec或exit之前,子进程与父进程共享数据段。
fork不对父子进程的执行次序进行任何限制,而在vfork调用中,子进程先运行,父进程挂起,直到子进程调用了exec或exit之后,父进程的执行次序才不再有限制。
例如:
#include<stdio.h>#include<sys/types.h>#include<unistd.h>intmain(void){intcount=1;intchild;printf("Beforecreateson,thefather'scountis%d\n",count);child=vfork();//创建了一个新的进程,此时有两个进程在运行if(child<0){printf("errorinvfork!\n");exit(1);}if(child==0){printf("Thisisson,hispidid%dandthecountis%d\n",getpid(),++count);exit(1);}else{printf("Afterson,Thisisfather,hispidis%dandthecountis%d,andthechildis%d\n",getpid(),count,child);}return0;}
运行结果:
Beforecreateson,thefather'scountis1Thisisson,hispidid14049andthecountis2Afterson,Thisisfather,hispidis14048andthecountis2,andthechildis14049
从运行结果中,我们可以看出,在子进程中修改了count的值,但是父进程中输出了修改后的值2,而不是初始值1.说明子进程和父进程是共享count的,也就是说,由vfork创建出来的子进程与父进程之间是共享内存区的。另外,有vfork创建的子进程还会导致父进程的挂起,除非子进程执行了exit或者execve才会唤醒父进程。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。