系统调用函数 fork() 入门

先了解进程概念

1,进程 : 

进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。[来源于 百度百科]

fork() 函数的主要作用是在父进程调用的基础上创建一个其的子进程。子进程是一个相对的概念,他会复制父进程的数据代码等部分,是完全复制一份而不是共用相同的变量相当于克隆。fork() 函数有一个特点就是只调用一次却会返回两次,一次是父进程返回的值 一个大于0的数 (即他创建的子进程的PID,PID 是操作系统中进程的唯一标识 ),而另外一次则是子进程返回的值 为0。还有一种情况就是父进程调用该函数的时候如果返回的 <0 的数则说明创建进程失败(失败的原因有很多)。另外一个值得注意的是调用 fork() 函数 的时候 子进程是接着该调用后的代码继续执行的,如果其后还存在调用fork() 函数 子进程也可以作为父进程创建它的子进程。

具体过程我们来看下面的代码:

   

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	pid_t pid; 
	int i = 0;
	 
   	for(i =0 ; i < 2 ; i++)
      	{
	   pid = fork();
	 
	   if (pid == 0) {
		printf("PID: %d\nreturned: %d\n",
		getpid(), pid);
	    } else {
		printf("PID: %d\nreturned: %d\n",
		getpid(), pid);
	    }
	    
      	}
	 return 0;
}

\\代码我在 VS2017 上运行不了 找不到 unistd.h 该头文件的意思是 unix stdio 的意思 . (没有解决 哈哈 )所以我直接在 linux系统上编译执行的 . 

运行结果大概是这个样子的

1,首先我通过 gcc 编译该源文件 forkT.c 并且将其命令为 FT , 然后执行 FT 文件 , 得到打印结果 。

2,第一个打印的 PID  4807  和 return 4808 是父进程(PID = 4807)调用 fork() 函数 创建的一个 子进程(PID = 4808)

3,第二个打印的 PID  4808 和  return 0 是子进程(PID = 4808)复制的变量 pid 被赋值为0 , 我们前面讲过fork() 函数的一个特点,就是父进程被调用一次,会返回两次,一次是父进程的创建的子进程的pid ,另外一次则是子进程的返回值 为 0,这里直接赋给 子进程中的 pid 了 .

4,第三次打印的PID 4807 和 return 4809 说明了一个父进程(PID 4807)进入for循环第二次循环 i=1,此时再次调用fork() 函数并且创建另外的一个新的进程(PID = 4809).

5,第四次打印的PID 4808 和 return 4810 说明进程(PID 4807)的子进程(PID 4808)进入for循环的第二次循环 i =1,此时调用了fork() 函数 创建一个新的进程(PID 4810)。此时该进程(PID 4808)即是子进程又是父进程。

6,第五次打印的PID 4809 和 return 0 是 进程(PID 4807)的创建的另外一个子进程进程(PID 4809)执行的结果,此时该进程(PID 4809)在for循环的第二次循环里 i=1,并且pid=0.

7 ,第六次打印的PID 4810 和 return 0 是进程(PID 4808)的子进程。

如果看的有点懵不慌我们来看下下面的图,或许就明白了。

猜你喜欢

转载自blog.csdn.net/weixin_41237676/article/details/98069136