我知道sysinfo()
函数返回一个procs
参数,表示当前在Linux系统上运行的进程总数。
但是,RLIMIT_NPROC
和setrlimit()
函数的getrlimit()
参数限制了进程可以拥有的子进程数。
为了让系统强制执行该号码,我想它会知道该组中当前的进程数。这个数字是否易于获取?
答案 0 :(得分:1)
要强制执行RLIMIT_NPROC
限制,linux内核会在&p->real_cred->user->processes
函数中读取copy_process
字段(例如,在fork()
上)
http://lxr.free-electrons.com/source/kernel/fork.c?v=4.8#L1371
1371 if (atomic_read(&p->real_cred->user->processes) >=
1372 task_rlimit(p, RLIMIT_NPROC)) {
或sys_execve
(fs / exec.c中的do_execveat_common
):
1504 if ((current->flags & PF_NPROC_EXCEEDED) &&
1505 atomic_read(¤t_user()->processes) > rlimit(RLIMIT_NPROC)) {
1506 retval = -EAGAIN;
1507 goto out_ret;
因此,如果processes
大于RLIMIT_NPROC,则函数将失败。此字段被定义为struct user_struct
的一部分(在struct cred
real_cred中使用sched.h访问
atomic_t processes; /* How many processes does this user have? */
因此,进程计数会计是按用户进行的。
如果失败,copy_process中的字段会减少:
1655 bad_fork_cleanup_count:
1656 atomic_dec(&p->cred->user->processes);
字段的增量位于copy_cred
:http://code.metager.de/source/xref/linux/stable/kernel/cred.c#313
313 /*
314 * Copy credentials for the new process created by fork()
315 *
316 * We share if we can, but under some circumstances we have to generate a new
317 * set.
318 *
319 * The new process gets the current process's subjective credentials as its
320 * objective and subjective credentials
321 */
322 int copy_creds(struct task_struct *p, unsigned long clone_flags)
339 atomic_inc(&p->cred->user->processes);
372 atomic_inc(&new->user->processes);
手册页说它是按用户限制:http://man7.org/linux/man-pages/man2/setrlimit.2.html
RLIMIT_NPROC The maximum number of processes (or, more precisely on Linux, threads) that can be created for the real user ID of the calling process. Upon encountering this limit, fork(2) fails with the error EAGAIN.
答案 1 :(得分:0)
我认为你的最后陈述不一定是真的。组中的进程可能多于RLIMIT_NPROC
,例如,如果子进程创建自己的子进程。尽管没有违反限制,但这些都属于同一组。
但无论如何,你绝对可以通过阅读和解析procfs
来获取信息。给定进程的组,您可以搜索其他/proc/<pid>/stat
伪文件,以查找页面中具有相同组(pgrp
行的那些文件。)但这可能效率低下,或者实现起来很烦人。