linux——浅谈fork与vfork的使用与区别

来源:互联网 发布:音乐在线剪切软件 编辑:程序博客网 时间:2024/06/10 21:30

进程创建—fork

#include<unistd.h>

pid_t fork(void)

功能:创建子进程

fork的奇妙之处在于它被调用一次 ,却返回两次,它可能有三种不同的返回值

1.    在父进程中,fork返回新创建的子进程的PID。

2.    在子进程中,fork返回0;

3.    如果出现错误,fork返回一个负值。

例:fork.c


运行结果:

分析原因:

在pid=fork()之前,只有一个进程在执行,但在这条语句执行之后,就变成两个进程在执行了,这两个进程的共享代码段,将要执行的下一条语句都是if(pid==0)。两个进程中,原来存在的那个进程被称作“父进程“,新出现的那个进程被称作“子进程”,父子进程的区别在于进程标识符(PID)不同。

进程创建——思考运行结果


运行结果:

分析原因:

子进程的数据空间,堆栈空间都会从父进程得到一个拷贝,而不是共享。在子进程中对count进行加1的操作,并没有影响到父进程的count值,父进程中的count值仍然是0。

进程创建—vfork

#include<sys/types.h>

#include<unistd.h>

pid_t vfork(void)

功能:创建子进程

fork vs vfork

区别:1.fork:子进程拷贝父进程的数据段

vfork:子进程与父进程共享数据段

2.fork:父,子进程的执行次序不确定

vfork:子进程先运行,父进程后运行

实例分析:

运行结果:

从上图发现我们运行到最后程序挂掉,对此,我找了下vfork的用法,才发现子进程一般要调用exec或exit函数。对此我在这段程序中修改了一个地方,(将return改为exit)为什么挂掉了呢?(好奇怪呀!!!)

运行结果:

分析下原因:原来main()函数return后,程序的函数栈发生了变化,而main()函数return后,通常会调用 exit()或相似的函数,这时,父进程收到子进程exit(),开始从vfork返回,但是父进程栈都被子进程给return干废掉了,总之就是子进程调用exit() 没有修改函数栈,不会发生上述的情况,所以,父进程得以顺利运行。



0 0