我正在实现一个在用户空间中调用的系统调用,比如说由 foo 调用。 系统调用访问 foo 的 task_struct(通过全局指针 current),打印它的名称和 pid,然后继续到 foo 的父进程、foo 的父进程的父进程等。打印它们的所有名称和 pid,直到并包括 init 进程的名称和 pid。
pid=1 为 init 保留,pid=0 为 swapper 保留。
根据swapper的task_struct,它的父进程就是它自己。
Swaper(或 sched)始终具有 pid=0 并且始终是 init 的父进程?
所有 pid 都是非负数吗?我可以做出这样的假设吗?
更简洁地回答您的问题:
/sbin/init
(或由引导加载程序作为参数给出的另一个进程),通常是带有PID 1./proc/sys/kernel/pid_max
指定的最大值。因此,您可以放心地假设所有有效的 PID 都具有正值,而负值则归结为错误值等。它始终为正数或 0。内核源代码将其定义为
pid_t
类型,据我所知,该类型被认为是无符号的(尽管它被定义为有符号以便能够进行诸如 fork
return 之类的调用出现错误时为负数)。
是的,他们实际上总是积极的。
您可以通过几个 POSIX 系统调用来验证这一点,例如 wait,它使用负值来表示您自己的所有子进程等,并且只有正值表示有效的 PID。