在C中是否有一种编程方式来确定Linux下一组进程中曾经使用过的进程数?

时间:2016-10-15 21:03:08

标签: c linux process

我知道sysinfo()函数返回一个procs参数,表示当前在Linux系统上运行的进程总数。

但是,RLIMIT_NPROCsetrlimit()函数的getrlimit()参数限制了进程可以拥有的子进程数。

为了让系统强制执行该号码,我想它会知道该中当前的进程数。这个数字是否易于获取?

2 个答案:

答案 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(&current_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_credhttp://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行的那些文件。)但这可能效率低下,或者实现起来很烦人。