fork()与vfork()的区别
概述
1.fork():子进程拷贝父进程的数据段和代码段。
vfork():子进程与父进程共享地址空间。
2.fork():父子进程的执行次序不确定。
vfork():保证子进程先运行,在调用 exec 或 exit 之前与父进程数据是共享的。父进程在子进程调用 exec 或 exit 之后才可能被调度运行,如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
详解
fork()
函数原型:
pid_t fork(void);
返回值为整型,参数为空。
调用fork 函数后会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。在调用fork函数时,有一个值得注意的问题就是,子进程与父进程的并发问题,处理不当就会产生僵死进程,也就是父进程先与子进程一步结束,此时,子进程就将成为僵死进程,占用pid,解决方法就是父进程调用wait()函数,进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
fork返回值
在父进程中,fork() 返回新创建子进程的进程ID;
在子进程中,fork() 返回0;
如果出现错误,fork返回一个负值;
getppid():得到一个进程的父进程的PID;
getpid():得到当前进程的PID;
*注意:在fork()函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是
子进程,一个是父进程。在子进程中,fork()函数返回0,在父进程中,fork()返
回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还
是父进程。
vfork()
函数原型:
pid_t vfork(void);
返回值为整型,参数为空。
vfork()函数和fork()函数一样都是在已有的进程中创建一个新的进程,但它们创建的子进程是有区别的。
vfork的特点 — 创建子进程:
①子进程必定先运行,等到子进程调用exit或者exec后,父进程才能运行
②父子进程共享空间(共享内存数据)
vfork()返回值
成功:子进程中返回 0,
父进程中返回子进程 ID。pid_t为无符号整型。
失败:返回 -1。
注:仅供参考!!!