Linux系统fork函数介绍

fork函数通过拷贝当前进程创建一个子进程。

在fork之前,我们先了解一些别的知识。传统的fork系统调用直接把所有的资源复制给新创建的进程。这种实现过于简单并且效率低下,因为它拷贝的数据也许并不共享,更糟的情况是,如果新进程打算立即执行一个新的映像,那么所有的拷贝都将前功尽弃。Linux的fork使用写时拷贝页实现。

写时拷贝:写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。

fork函数:一个现有进程可以调用fork函数创建一个新进程

返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1

由fork创建的新进程被称为子进程。fork函数被调用一次,但返回两次。两次返回的唯一区别是子进程的返回值为0,而父进程的返回值则是新子进程的进程ID。将子进程ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得其所有子进程的进程ID。fork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid以获得其父进程的进程ID。

我们使用一个进程演示

先声明变量后父子进程都使用,可以成功就是因为写时拷贝。

因为fork返回给父子进程的pid变量不同,所以可以通过pid的值来区分父子进程。父进程执行7次,子进程执行3次。

使用sleep让程序沉睡一秒,体现父子进程的并发执行。

猜你喜欢

转载自blog.csdn.net/HDong99/article/details/84994843