下面的代码会尽可能多地生成孩子。一旦父进程退出,它们将不会进一步分叉,并且将成为僵尸 父进程会产生多少子进程?
int main(int argc, char *arg[])
{
while(fork() > 0);
}
答案 0 :(得分:4)
使用RLIMIT_NPROC
setrlimit(2)可以限制子进程的数量。请注意,fork(2)可能由于多种原因而失败。您可以使用bash
builtin ulimit
来设置该限制。
您可以使用getrlimit
(或解析/proc/self/limits
,请参阅proc(5))以获取该信息。
在整个系统范围内,您可以使用/proc/sys/kernel/threads-max
,因为:
此文件指定线程数的系统范围限制 (任务)可以在系统上创建。
还有/proc/sys/kernel/pid_max
此文件指定PID环绕的值(即, 此文件中的值大于最大PID)。的PID 超过此值不分配;因此,这个价值 文件也可作为系统范围内的总数限制 进程和线程。此文件的默认值32768, 导致与早期内核相同的PID范围。在32位 平台,32768是pid_max的最大值。在64位 系统,pid_max可以设置为最大2 ^ 22的任何值(PID_MAX_LIMIT, 大约400万)。
但是,可能存在其他限制(特别是交换空间)。
内核的任务是单线程进程或某些进程内的某个线程 - 例如由低级系统调用clone(2)(或某些kernel thread创建,例如kworker
,ksoftirqd
等...。
答案 1 :(得分:3)
更新 - 我可能很快,没有看到没有fork循环。然后,它可能取决于在该机器上分叉的成本。僵尸也可能使用系统资源,这些资源在某些时候会耗尽。下面提到的ulimit命令当然仍然有效.--
更新2:我在some copy of /linux/kernel/fork.c中看到了这一点,它应该保持一台机器可用(max_threads显然也限制了进程数量,因为每个进程至少有一个线程):
/*
272 * The default maximum number of threads is set to a safe
273 * value: the thread structures can take up at most half
274 * of memory.
275 */
276 max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
- 原始答案:
它将创建尽可能多的进程,实际上可能(也就是说,它会快速冻结机器 - 我已经完成了),或者当前用户或shell允许的数量,如果施加了这样的限制。在bash中,可以通过内置shell命令ulimit -u <number>
强加限制。请注意,一个过程可能不必通过bash启动(也许一个cron作业赢了)。