【问题标题】:Are process ids non-negative in Linux?Linux中的进程ID是非负的吗?
【发布时间】:2012-03-23 23:06:26
【问题描述】:

我正在实现一个在用户空间中调用的系统调用,比如说 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 都是非负数吗?我可以做出这样的假设吗?

【问题讨论】:

    标签: linux pid negative-number


    【解决方案1】:

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

    • IBM 的 Inside the Linux boot process 将交换进程描述为 PID 值为 0 的进程。在启动时,此进程运行 /sbin/init(或引导加载程序作为参数提供的另一个进程),通常是 PID 为 1 的进程.
    • 在 Unix 系统中,PID 值分配给 sequentially,从第一个进程开始,一直到 /proc/sys/kernel/pid_max 指定的最大值。因此,您可以放心地假设所有有效 PID 都具有正值,而负值归结为错误值等。
    • 考虑zombie 进程也是一个好主意,因为当/如果它们被init 采用时,它们可以在进程树中接受“特殊处理”。

    【讨论】:

      【解决方案2】:

      它总是正数或 0。内核源将它定义为 pid_t 类型,afaik 被认为是无符号的(尽管它被定义为有符号以便能够进行诸如 @987654322 之类的调用@ 出错时返回负数)。

      【讨论】:

      • 谢谢,我会立即检查 pid_t 是如何定义的。
      • 我认为它已签名,fork 返回pid_t,可以是-1。另外我想我记得在某些标题中看到过它。需要检查。 Ofc,这并不意味着进程 id 可以为负数
      • 已签名,刚刚查看。但它是为了返回错误:D
      • 所以它会使用负 pid 的 -1 向父进程返回错误?但一个进程永远不会“实际上”有负 id
      • 小心。有效的 pid 永远不会是零
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多