对 fork 函数的理解

这里先说一下为什么用fork:

  • 例如:Web服务器,当许多浏览器来访问的时候,如果服务器等一个处理完再处理另一个,那这样就太慢了,服务器可以为每一个请求开一个进程,这样就实现了多进程,提高处理速度。
  • 例如:有一个大工程,可以分为许多个模块,就可以为每一个模块创建一个线程,当然有的模块之间有先后顺序,这可以进行特殊处理。

1. 概念:

    fork是在Linux中使用的一个分叉函数。若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记,出错则返回-1。可以把父进程和子进程的关系看做一个链表,父进程指向子进程,子进程如果还有子进程就再指向子进程,否则为空。

2. 特性:

  1. 每个进程都有一个非负整数表示的唯一进程ID;
  2. 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  程序示意图


猜你喜欢

转载自blog.csdn.net/u011074149/article/details/81006830
今日推荐