这里先说一下为什么用fork:
- 例如:Web服务器,当许多浏览器来访问的时候,如果服务器等一个处理完再处理另一个,那这样就太慢了,服务器可以为每一个请求开一个进程,这样就实现了多进程,提高处理速度。
- 例如:有一个大工程,可以分为许多个模块,就可以为每一个模块创建一个线程,当然有的模块之间有先后顺序,这可以进行特殊处理。
1. 概念:
fork是在Linux中使用的一个分叉函数。若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记,出错则返回-1。可以把父进程和子进程的关系看做一个链表,父进程指向子进程,子进程如果还有子进程就再指向子进程,否则为空。
2. 特性:
- 每个进程都有一个非负整数表示的唯一进程ID;
- fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程;
3. 特殊进程:
- ID为0的是调度进程,该进程是内核的一部分,不执行任何磁盘上的程序 ;
- ID为1的是Init进程,init通常读取与系统有关的初始化文件(/etc/rc*文件、/etc/inittab文件、/etc/init.d/中的文件) ;
- ID为2的是页守护进程,负责支持虚拟存储器系统的分页操作;
常用的操作函数:
#include <unistd.h> //头文件
pid_t getpid(void); //返回调用进程的ID
pid_t getppid(void); //当前进程父进程ID
4. 举个栗子
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
int main(){
int count = 0;
pid_t pid = fork();
if(pid < 0)
printf("error\n");
else if(pid == 0){
printf("Child Id = %d\n", getpid());
count++;
}else{
printf("Parent Id = %d\n", getpid());
count++;
}
prinf("count = %d\n", count);
return 0;
}
输出结果为:
Parent Id = 3496
count = 1
Child Id = 3497
count = 1
父进程和子进程没有执行的先后顺序,再加个图,加深一下理解:
图 1 程序示意图