进程fork和vfork函数复习

来源:互联网 发布:卷皮折扣和淘宝那个好 编辑:程序博客网 时间:2024/06/10 07:26

1.fork函数的使用;
fork( )函数的作用是创建一个新的进程。
在应用程序调用fork( )函数后,会创建一个新的进程,称为子进程,原来的进程叫做父进程。从此,运行的已经是两个进程了。
子进程和父进程都可以得到fork函数的返回值。子进程中,fork返回0;父进程中,fork返回子进程的进程号。若创建失败,返回-1.
pid_t fork(void);
功能:创建子进程
fork的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值:
1.在父进程中,fork返回新创建的子进程的PID;
2.在子进程中,fork返回0;
3.如果出现错误,fork返回一个负值
这里重点是上面的黑体部分,案例代码如下:

#include <sys/types.h>#include <unistd.h>main(){pid_t pid; //pid_t是一个宏定义,其数据类型为unsigned int/*此时仅有一个进程*/pid=fork();/*此时已经有两个进程在同时运行*/if(pid<0)printf("error in fork!");else if(pid==0)printf("I am the child process, ID is %d\n",getpid());elseprintf("I am the parent process,ID is %d\n",getpid());}

先来看运行结果:

 ~/LinuxC$ ./createProgress I am the parent process,ID is 3186I am the child process, ID is 3187

在上述代码中,只有一个if判断语句,结果确实输出了两条判断值,可见,fork函数的确是被调用一次,却返回两次.
2.父子进程共享代码
在pid=fork()之前,只有一个进程在执行,但在这条语句执行之后,就变成两个进程在执行了,这两个进程的共享代码段,将要执行的下一条语句都是if(pid==0)。两个进程中,原来就存在的那个进程被称作“父进程”,新出现的那个进程被称作“子进程”,父子进程的区别在于进程标识符(PID)不同
示例代码:

#include <unistd.h>#include <stdio.h>int main(void){pid_t pid;int count=0;pid = fork();count++;printf( “count = %d\n", count );return 0;}

返回结果如下:

wulongjian@wulongjian-Inspiron-5557:~/LinuxC$ ./createProgress2count = 1count = 1

这里,代码上面只有一个printf,但是却输出了两边count值,可见,父子进程共享代码片段,但是,子进程的数据空间、堆栈空间都会从父进程得到一个拷贝,而不是共享。.
3.vfork函数
fork:子进程拷贝父进程的数据段
vfork:子进程与父进程共享数据段
fork:父、子进程的执行次序不确定
vfork:子进程先运行,父进程后运行
示例代码:

# include <unistd.h># include <stdio.h>int main(void){ pid_t pid; int count=0; pid = vfork(); count++; printf( “count = %d\n", count ); _exit(0);//这里要加退出函数,不然父进程会一直阻塞,程序报错. return 0;}

输出如下:

count=1count=2