Linux提供了fork()系统调用,其传统功能是复制一个进程。

Linux还提供了使用clone()系统调用创建线程的能力。

但是,Linux不区分进程和线程。实际上,当提到程序中的控制流时,Linux使用术语任务( task),而不是进程(process)或线程(thread)。

在调用clone()时,它会被传递一组标记,以决定在父任务和子任务之间进行多少共享。其中一些标记如下。

标记 意思
CLONE_FS 文件系统信息被共享
CLONE_VM 共享相同的内存空间
CLONE_SIGHAND 共享信号处理器
CLONE_FILES 共享打开的文件

例如,假设向clone()传递了CLONE_FS , CLONE_VM , CLONE_SIGHAND , 和CLONE_FILES。然后,父进程和子任务将共享相同的文件系统信息(如当前工作目录)、相同的内存空间、相同的信号处理器和相同的打开的文件。在这种方式下使用clone()就相当于创建了本章中描述的线程,因为父任务与子任务共享大部分资源。但是,如果在调用clone()时没有设置这些标记,则不会发生共享,导致类似于fork()系统调用提供的功能。

不同级别的共享是可能的,因为在Linux内核中有一个任务表示的方式。系统中每个任务都存在一个唯一的内核数据结构(struct task_struct)。这个数据结构,并不是存储任务的数据,而是指向其他存储这些数据的数据结构的指针——例如,表示打开文件列表、信号处理信息和虚拟内存的数据结构。当调用fork()时,将创建一个新任务,它具有父进程的所有相关数据结构的副本。当调用clone()系统调用时,也会创建一个新任务。但是,新任务不是复制所有数据结构,而是根据传递给clone()的标记位集合,决定指向父任务的哪些数据结构

results matching ""

    No results matching ""