8

我正在实现一个在用户空间中调用的系统调用,比如说 foo。系统调用访问 foo 的 task_struct(通过全局指针 current),打印它的名称和 pid,然后继续到 foo 的父进程,foo 的父进程的父进程等。打印它们的所有名称和 pid,直到并包括 init 进程。

pid=1 为 init 保留,pid=0 为 swapper 保留。

根据swapper的task_struct,它的父进程就是它自己。

Swapper(或 sched)总是 pid=0 并且总是 init 的父进程?

所有的pid都是非负的吗?我可以做这个假设吗?

4

3 回答 3

6

为了更简洁地回答您的问题:

  • IBM 的Inside the Linux boot process将 swapper 进程描述为 PID 值为 0 的进程。在启动时,该进程运行/sbin/init(或引导加载程序作为参数给出的另一个进程),通常是 PID 为 1 的进程。
  • 在 Unix 系统中,PID 值是按顺序分配的,从第一个进程开始,一直到/proc/sys/kernel/pid_max. 因此,您可以安全地假设所有有效的 PID 都具有正值,而负值归结为错误值等。
  • 考虑僵尸进程也是一个好主意,因为当/如果它们被 init 采用时,它们可以在进程树中接受“特殊处理”。
于 2012-04-04T20:51:36.313 回答
2

是的,他们实际上总是积极的。

您可以通过几个 POSIX 系统调用(例如 wait)来验证这一点,这些调用使用负值来表示您自己的所有子进程等事物,并且只有正值表示有效的 PID。

示例: http: //linux.die.net/man/2/wait

于 2012-03-06T15:17:00.677 回答
2

它始终为正数或 0。内核源将其定义为pid_t类型,afaik 被认为是无符号的(尽管它被定义为有符号是为了能够进行调用,例如fork在出现错误时返回负数) .

于 2012-03-06T13:06:45.040 回答