一个现有进程可以调用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)……如下图所示:
这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。
每个进程都有一个独特(互不相同)的进程ID(process ID),可以通过getpid()函数获得。