为什么新的pid比旧的小?

为什么新的pid比旧的小?

新进程的 pid 是否有可能小于现有进程的 pid?我有一个守护进程,被杀死后会重新启动,我记录了pid,发现pid先变小,然后变大。

可能的原因是什么?

=================================================== =============

抱歉询问并感谢您的回答。

我想我已经找到答案了。 /proc/sys/kernel/pid_max显示32768(手机上的android操作系统),经过长时间的测试,肯定超过了这个,并重新分配。再次感谢。

答案1

在 Linux 上,PID 是按顺序分配的,但最终系统将达到 PID 限制并重新开始,跳过已分配的 PID。

答案2

我认为 PID 是随机分配的,以防止攻击者猜测临时文件名,临时文件名通常包含进程 PID 的字符串表示形式。但是我错了。我编写了以下小 C 程序并在 RHEL 5 x86_64 上运行它来检查:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int
main(int ac, char **av)
{
        int cnt;
        pid_t firstpid = getpid();

        long diff = 32768 - firstpid;
        cnt = diff;

        printf("Going to fork %d times\n", cnt);

        while (cnt)
        {
                pid_t mypid = getpid();
                printf("cnt %d, pid %d\n", cnt, mypid);
                switch (fork())
                {
                case 0: break;
                case -1:
                        fprintf(stderr, "fork() problem: %s\n", strerror(errno));
                        _exit(9);
                        break;
                default:
                        _exit(0);
                        break;
                }
                --cnt;
        }
        return 0;
}

我能得到的最大 PID 数字是 32767,即 2^15-1,可以容纳在有符号的 2 字节短整型中。我要当猴子的叔叔

答案3

它消除了可预测性,这是一个安全问题。

答案4

这个是正常的。当一个新进程启动时,它有一个新的进程ID,但不要求更大。

相关内容