fork
pid_t fork(void);
功能:创建一个新进程。
返回值:一次调用两次返回,子进程返回0,父进程返回子进程ID,出错返回-1。
1、两次返回分别是进程ID和0,父进程会拿到子进程的ID,子进程返回0,借此可以分别出父子进程,编写不同的处理分支。
2、通过fork创建的子进程就是父进程的副本(拷贝),子进程会获取父进程数据段、bss段、堆、栈、IO流(共享文件指针和文件描述符)、缓冲区的拷贝,与父进程共享代码段。
3、子进程会继承父进程的信号处理方式。
4、fork函数调用后,父子进程各自执行,谁先返回不一定。
注意:pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中
返回两次的原因:由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。
vfork
pid_t vfork(void);
功能:创建一个新的进程,与fork功能基本一致。
区别:通过vfork创建的进程不复制父进程的地址空间(数据段、bss段、堆、栈、IO流、缓冲区的拷贝),必须通过exec系列函数加载自己的可执行程序。
注意:当执行vfork时,子进程先返回,此时它占用了父进程的地址空间,当子进程成功创建后(通过exec加载可执行程序),父进程才返回。