新进程的 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,但不要求更大。