分类: 系统运维
2012-03-29 13:12:57
每个进程都有一个独一无二的进程ID,一个非负整型。因为进程ID是一个总是独一无二的进程的仅有的被熟知的标识,所以它经常用来作为其它标识符的一部分,来保证唯一性。例如,应用程序有时包含进程ID作为文件名的一部分,来产生独一无二的文件名。
尽管唯一,进程ID是被重用的。当进程终止后,它们的ID变为可重用的侯选者。然而,多数UNIX系统实现算法来延迟重用,以便新创建的进程会分配一个与最近终止的进程不一样的ID。这避免了一个新的进程因为相同的ID被错当成之前的进程。
虽然有一些特殊的进程,但是各个实现上的细节都不同。进程ID
0通常是调用进程,并经常被熟知为对换程序(swapper)。在硬盘上没有对应于这个进程的程序,它是内核的一部分而被熟知为一个系统进程。进程ID
1通常是init进程,在启动过程结束后被内核调用。这个进程的程序文件在UNIX系统的早期版本是/etc/init,而在更新的版本在/sbin
/init。这个进程负责在内核已经被启动后引入一个UNIX系统。init通常读取系统相关初始化文件--/etc/rc*文件或/etc
/inittab和在/etc/init.d里的文件--和把系统引入一个特殊的状态,比如多用户。init进程绝对不死。这是普通的用户进程,不是内核
的系统进程,不像swapper,尽管它需要超级用户权限来运行。本章稍后,我们将看到init是如何变为任何孤立的子进程的父进程。
每个UNIX系统实现有它自己的内核进程集,来提供操作系统服务。例如,在UNIX系统上的一些虚拟内存实现,进程ID 2是换页后台。这个进程负责支持虚拟内存系统的换页。
除了进程ID,每个进程还有其它的标识符。以下的函数返回这些标识符。
注意这些函数中没有一个有错误返回。我们将在下节讨论fork函数时回到父进程ID。真实和有效有户和组ID在4.4节讨论过了。