05-进程能力
39.3.1 进程能力
内核会为每个进程都维护3个能力集(实现为位掩码),每个能力集中都包含表39-1中列出的已经启用的零个或多个能力。这3个能力集如下所示。
- 许可的——这些是一个进程可能使用的能力。许可的集合是能够被添加到有效的和可继承的集合中的能力的受限超集。如果一个进程从其许可集中删除了一个能力,那么将永远也无法再重新获取该能力(除非它执行了一个再次授予该能力的程序)。
- 有效的——内核会使用这些能力来对进程执行权限检测。只有进程在其许可集中维护着一个能力,那么进程才能通过从有效集中删除这个能力来临时禁用该能力,之后再将该能力还原到这个集合中。
- 可继承的——当这个进程执行一个程序时可以将这些权限带入许可集中。
通过Linux特有的/proc/PID/status文件中的CapInh、CapPrm以及CapEff三个字段能够查看任意进程的3个能力集的十六进制表示。
可以使用getpcap程序(第39.7节中介绍的libcap包的一部分)以更易阅读的格式显示一个进程的能力。
通过fork()创建的子进程会继承其父进程的能力集的副本。在39.5节中描述了在exec()调用中能力集的处理方式。
实际上,能力是一个线程级的特性,进程中的每个线程的能力都可以单独进程调整。在/proc/PID/task/TID/status文件中可以查看一个多线程进程中某个具体线程的能力。/proc/PID/status文件显示了主线程的能力。 在2.6.25之前的内核中,Linux使用32位来表示能力集,而在2.6.25内核中因为加入了更多的能力导致需要64位来表示能力集。