一.进程创建有三种方式(这里主讲fork及vfork)
1.fork
2.vfork
3. clone
二.fork函数
1.fork用于创建一个新进程;
2.fork函数没有参数,且有两个返回值,如果fork失败返回-1,如果成功,父进程返回子进程pid,子进程返回0; (pid_t fork( ));
3.当进程调用fork时,内核会做如下的事情:
- 分配新的控制块和内核数据结构给子进程;
- 将父进程的部分数据和代码拷贝至子进程,且采用写时拷贝;
- 然后将子进程添加到系统进程列表中;
- fork返回之后,开始调度器调度。
4.fork之前只有父进程在执行,fork之后,父子进程同时执行fork之后的代码。
例如:
#include<stdio.h>
2 #include<unistd.h>
3
4 int main()
5 {
6 printf("Before : pid=%d\n",getpid());
7 pid_t id = fork();
8
9 if(id<0)
10 {
11 perror("fork()");
12 }
13
14 printf("After: pid=%d, fork return %d\n",getpid(),id);
15 sleep(1);
16 return 0;
17 }
运行结果如下:(可以发现在执行fork之前,当前只有一个进程,也就只有一个进程输出“Before...”,fork之后父进程创建了一个子进程,父子进程同时执行fork之后的代码
5.fork调用失败的原因
1.内存不够;
2.创建进程数超过限制
三.vfork的使用及两种进程创建方式的区别
1.vfork创建的进程,保证子进程先执行,当子进程调用exec之后父进程才执行;而fork创建的子进程和父进程谁先执行并不确定,是由操作系统的调度器决定的。