background image

Linux 下的多进程编程初步 

摘要:多线程程序设计的概念早在六十年代就被提出,但直到八十年代中期,Unix 系

统中才引入多线程机制,如今,由于自身的许多优点,多线程编程已经得到了广泛的应用。
本文我们将介绍在 Linux 下编写多进程和多线程程序的一些初步知识。   

 

1  引言   

对于没有接触过 Unix/Linux 操作系统的人来说,fork 是最难理解的概念之一:它执行

一次却返回两个值。fork 函数是 Unix 系统最杰出的成就之一,它是七十年代 UNIX 早期的
开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管
理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。与 DOS
和早期的 Windows 不同,Unix/Linux 系统是真正实现多任务操作的系统,可以说,不使用
多进程编程,就不能算是真正的 Linux 环境下编程。   

 
多线程程序设计的概念早在六十年代就被提出,但直到八十年代中期,Unix 系统中才

引入多线程机制,如今,由于自身的许多优点,多线程编程已经得到了广泛的应用。   

 
下面,我们将介绍在 Linux 下编写多进程和多线程程序的一些初步知识。   

 

2  多进程编程   

什么是一个进程?进程这个概念是针对系统而不是针对用户的,对用户来说,他面对

的概念是程序。当用户敲入命令执行一个程序的时候,对系统而言,它将启动一个进程。但
和程序不同的是,在这个进程中,系统可能需要再启动一个或多个进程来完成独立的多个任
务。多进程编程的主要内容包括进程控制和进程间通信,在了解这些之前,我们先要简单知
道进程的结构。   

 

2.1 Linux 下进程的结构   

Linux 下一个进程在内存里有三部分的数据,就是"代码段"、"堆栈段"和"数据段"。其

实学过汇编语言的人一定知道,一般的 CPU 都有上述三种段寄存器,以方便操作系统的运
行。这三个部分也是构成一个完整的执行序列的必要的部分。   

 

"代码段",顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的

一个程序,那么它们就可以使用相同的代码段。"堆栈段"存放的就是子程序的返回地址、子
程序的参数以及程序的局部变量。而数据段则存放程序的全局变量,常数以及动态数据分配
的数据空间(比如用 malloc 之类的函数取得的空间)。这其中有许多细节问题,这里限于篇
幅就不多介绍了。系统如果同时运行数个相同的程序,它们之间就不能使用同一个堆栈段和
数据段。   

 

2.2 Linux 下的进程控制   

在传统的 Unix 环境下,有两个基本的操作用于创建和修改进程:函数 fork( )用来创建

一个新的进程,该进程几乎是当前进程的一个完全拷贝;函数族 exec( )用来启动另外的进程
以取代当前运行的进程。Linux 的进程控制和传统的 Unix 进程控制基本一致,只在一些细
节的地方有些区别,例如在 Linux 系统中调用 vfork 和 fork 完全相同,而在有些版本的 Unix
系统中,vfork 调用有不同的功能。由于这些差别几乎不影响我们大多数的编程,在这里我