2.2.3 进程的标识信息
task_struct中的pid、ppid等项描述了进程的标识信息。pid是进程标识号(Process Idenity Number),ppid是其父进程标识号(parent process ID)。pid、ppid都是非零正整数。一个pid惟一地标识一个进程。一个进程创建新进程称为创建子进程(child process)。相反地,创建子进程的进程称为父进程。所有进程追溯其祖先最终都会落到1号进程身上,这个进程叫做init进程。是内核自举后第一个真正有用的进程。init进程作用是扮演终结父进程的角色。因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了父进程的子进程就都会以init作为它们的父进程。
和其他Unix一样,Linux使用用户和组标识号来检查对系统中文件和可执行映像的访问权限。Linux系统中所有的文件都有所有者和允许的权限,这些权限描叙了系统使用者对文件或者目录的使用权。基本的权限是读、写和可执行,这些权限被分配给三类用户:文件的所有者,属于相同组的用户以及系统中所有用户。每类用户具有不同的权限,例如一个文件允许其拥有者读写,但是同组的只能读而其他用户不允许访问。
Linux使用组将文件和目录的访问特权授予一组用户,而不是单个用户或者系统中所有用户。如可以为某个软件项目中的所有用户创建一个组,并将其权限设置成只有他们才允许读写项目中的源代码。一个进程可以同时属于多个组(最多为32个),这些组都被放在进程的task_struct中的group数组中。只要某组用户的进程可以存取某个文件,则由此组派生出的进程对这个文件有相应的组访问权限。
task_struct结构中还有四对进程和组标识号:
uid和gid:表示运行进程的用户标识号和组标识号。
euid和egid:表示运行进程的有效用户标识号和有效组标识号。有些程序可以在执行过程中将执行进程的uid和gid改成其程序自身的uid和gid(保存在描叙可执行映像的VFS inode属性中)。这些程序被称为setuid程序,它是限制系统服务(service)权限的一个方法,常在严格控制对某些服务的访问时使用,特别是那些为别的用户而运行的进程,例如网络后台进程。有效uid和gid是那些setuid执行过程在执行时变化出的uid和gid。有效的uid和gid来自程序的映像文件本身,和启动它的用户无关。当进程试图访问特权数据或代码时,内核将检查进程的有效gid和uid。
fsuid和fsgid:表示运行进程的文件系统用户标识号和文件系统组标识号。它们和有效uid和gid相似,当检查文件系统存取权限时会用上。这两个标识号是为了建立NFS(Network File System)而使用的,因为用户模式的NFS服务器需要像一个特别的进程一样来访问文件。在这种情况下,只有file system uid和gid被改变(有效的uid和gid不变)。这样可以防止恶意的用户向NFS服务器发送Kill信号。Kill信号会被以一个特别的有效uid和gid发送到进程。
suid和sgid:表示运行进程的备份用户标识号和备份组标识号。这是POSIX标准中要求实现的两个标识号,它们被那些通过系统调用改变进程uid和gid的程序使用。当进程的原始uid和gid变化时,它们被用来保存真正的uid和gid。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。