Linux下fork()函数

一个现有进程可以调用fork函数创建一个新进程,由fork创建的新进程被称为子进程!

fork函数返回值: 若成功调用一次则返回两个值,子进程返回0,父进程回子进程ID;否则,出错返回-1

什么情况下会出错:

  • 当前的进程数已经达到了系统规定的上限
  • 系统内存不足

实例:

#include <unistd.h>
#include <stdio.h> 
int main () 
{ 
    pid_t fpid; //fpid表示fork函数返回的值
    int count=0;
    fpid=fork(); 
    if (fpid < 0) 
        printf("error in fork!"); 
    else if (fpid == 0) {
        printf("我是子进程,我的进程ID是: %d\n",getpid()); 
        count++;
    }
    else {
        printf("我是父进程,我的进程ID是: %d\n",getpid()); 
        count++;
    }
    printf("统计结果是: %d\n",count);
    return 0;
}


注释:pid_t是Linux下的进程号类型,也就是Process ID_Type的缩写,其实是宏定义的unsigned int类型。


运行结果:

我是父进程,我的进程ID是: 30723
统计结果是: 1
我是子进程,我的进程ID是: 30724
统计结果是: 1


为什么两行都打印出来了?

在我想来,不管pid是多少,都应该只有一行才对。原因在于fork之后,操作系统会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像兄弟关系,这2个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,但只有一点不同,如果fork成功,子进程中fork的返回值是0,父进程中fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。

可以这样想象,2个进程一直同时运行,而且步调一致,在fork之后,他们分别做不同的工作,也就是分岔了,这也是fork为什么叫fork(分叉)的原因。 


在语句fpid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的几乎完全相同,将要执行的下一条语句都是if(fpid<0)……如下图所示:

这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。

Linux下fork()函数



每个进程都有一个独特(互不相同)的进程ID(process ID),可以通过getpid()函数获得







Linux下fork()函数,布布扣,bubuko.com

Linux下fork()函数

上一篇:《linux 内核完全剖析》 chapter 5 Linux内核体系结构


下一篇:linux bash 学习