我研究了关于创建进程/线程的Linux内核代码(2.6.11),然后是do_fork() - > alloc_pidmap()
一旦前一个pid达到最大pid,似乎alloc_pidmap总是返回pid> 300,而实际守护进程的pid总是<300(这是正确的吗?) .
守护进程是否使用alloc_pidmap()以外的函数获取其pid?如果是这样,是否暗示守护进程不是使用do_fork创建的?
AFAIK pid由内核分配;您所看到的300的限制(即 #define RESERVED_PIDS 300 private in kernel/pid.c )可能是因为在大多数系统中,几个进程在引导程序的早期分叉(例如,可能来自 initrd ) .
#define RESERVED_PIDS 300
kernel/pid.c
initrd
您可以通过使用 init=/bin/sh 从GRUB直接启动到内核来进行测试
init=/bin/sh
一些进程是内核进程(没有用户空间代码,例如 kworker 或 kauditd ),它们不是从init或后代通过fork启动的 . 它们可能是在内核中启动 kthread_create (并且没有任何系统调用) .
kworker
kauditd
kthread_create
你应该解释为什么要问这个问题 . 您是否有关于确定流程是否为deamon的问题?
1 回答
AFAIK pid由内核分配;您所看到的300的限制(即
#define RESERVED_PIDS 300
private inkernel/pid.c
)可能是因为在大多数系统中,几个进程在引导程序的早期分叉(例如,可能来自initrd
) .您可以通过使用
init=/bin/sh
从GRUB直接启动到内核来进行测试一些进程是内核进程(没有用户空间代码,例如
kworker
或kauditd
),它们不是从init或后代通过fork启动的 . 它们可能是在内核中启动kthread_create
(并且没有任何系统调用) .你应该解释为什么要问这个问题 . 您是否有关于确定流程是否为deamon的问题?