(一)fork
#include <unistd.h>
pid_t fork(void);
返回值:有两个,一个是子进程的ID,另一个为零。当返回值为0时,进入子进程,大于0进入父进程,返回-1时创建进程错误。
子进程与父进程的比较:
(1)子进程与父进程的进程ID不同。且父进程ID不同。
(2)内存布局: 子进程是父进程的副本,其中子进程的数据空间,堆,栈是父进程的副本,但是共享真正文段。
(3)执行顺序:子进程与父进程执行顺序不确定,取决于内核所使用的调度算法。
(4)文件共享:父进程所有打开的文件描述符都会赋值到子进程,父进程与子进程每个相同的打开文件描述符共享一个文件表项。即子进程操作文件直接影响父进程对该文件的操作,最明显的是文件偏移量收到影响。其图如下所示:
例如:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x = 33,y = 44;
pid_t pid;
if( (pid = fork()) == -1 )
{
perror("fork err\n");
exit(EXIT_FAILURE);
}
else if( pid == 0 )
{
x ++;
y ++;
printf("child : x = %d y = %d\n",x,y);
exit( EXIT_SUCCESS);
}
wait();
printf("parent: x = %d y = %d\n",x,y);
return 0;
}
fork的使用场景:
(1)父进程希望复制自己,使得父进程和子进程同时执行不同的代码段,即在网络服务中是最常见的,父进程等待客户端的服务请求,当请求到来时,父进程fork一个子进程来处理子进程的请求,这时父进程可以继续等待下一个服务请求。
(2)使得子进程执行一个不同的程序,需要fork一个子进程,在此子进程中执行exec执行新的程序。
(二)vfork函数
#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void);
返回值为:与fork几乎相同
与fork函数的不同:
(1)vfork一般是创建一个进程来执