发布时间:
来源:CSDN
(资料图)
这里先说一下为什么用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//头文件pid_t getpid(void); //返回调用进程的IDpid_t getppid(void); //当前进程父进程ID
4. 举个栗子
#include#include #include 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 = 3496count = 1Child Id = 3497count = 1
父进程和子进程没有执行的先后顺序,再加个图,加深一下理解:
图 1 程序示意图