OS 内核版本: Linux 2.6.x
每个进程都有一个进程号(PID),进程号是一个正数,用以唯一标识系统中的某个进程。对
各种系统调用而言,进程号有时可以作为传入参数,有时可以作为返回值。
比如,系统调用 kill()
允许调用者向拥有特定进程号的进程发送一个信号。当需要创建一个对某进程而言唯一的标识符时,进程号就会派上用场。常见的例子是将进程号作为与进程相关文件名的一部分。系统调用 getpid()返回调用进程的进程号。
getpid()返回值的数据类型为 pid_t,该类型是由 SUSv3 所规定的整数类型,专用于存储进
程号。
除了少数系统进程外,比如 init 进程(进程号为 1),程序与运行该程序进程的进程号之
间没有固定关系。
Linux 内核限制进程号需小于等于 32767。新进程创建时,内核会按顺序将下一个可用的
进程号分配给其使用。每当进程号达到 32767 的限制时,内核将重置进程号计数器,以便从
小整数开始分配。
一旦进程号达到 32767,会将进程号计数器重置为 300,而不是 1。之所以如此,是因
为低数值的进程号为系统进程和守护进程所长期占用,在此范围内搜索尚未使用的进程号
只会是浪费时间。
在 Linux2.4 版本及更早版本中,进程号的上限 32767,由内核常量 PID_MAX 所定义。
在 Linux 2.6 版本中,情况有所改变。尽管进程号的默认上限仍是 32767,但可以通过 Linux
系统特有的/proc/sys/kernel/pid_max 文件来进行调整(其值=最大进程号+1)。
在 32 位平台中, pid_max 文件的最大值为 32768, 但在 64 位平台中, 该文件的最大值可以高达到 222(约400 万),系统可能容纳的进程数量会非常庞大。
getppid()可以检索到父进程的进程号
每个进程的父进程号属性反映了系统上所有进程间的树状关系。每个进程的父进程又有自己的父进程,以此类推,回溯到 1 号进程—init 进程,即所有进程的始祖。
pstree命令可以查看到这一“家族树”( family tree)。
如果子进程的父进程终止,则子进程就会变成“孤儿”, init 进程随即将收养该进程,子进程后续对 getppid()的调用将返回进程号 1。
通过查看由 Linux 系统所特有的/proc/PID/status 文件所提供的 PPid 字段,可以获知每个进程的父进程