创建一个程序来计算系统中的最大进程数

Create a program to calculate the maximum number of processes in the system

我有以下代码,我正在尝试计算所有过程。我不明白如何计算最大进程数。

#include <stdio.h>
#include <stdlib.h>

int main() 
{
   int pid, pidmax = 0;
   while(1) 
   {
       pid = fork();
       pidmax = getpid();
       if(pid == 0){
           if(pidmax < getpid())
               pidmax = getpid();
           printf("pid: %d, max: %d\n", getpid(), pidmax);  
           return 0;
       }

       if(pid == -1) {
        printf("Maximum process: %d\n", pidmax);
        exit(-1);
       }
    }
    return 0;
}

有比通过实验更简单的方法来做到这一点。

大多数 Unix 系统都提供 ulimit 来向您展示您帐户的各种软(即用户定义的)和硬(即管理员定义的)限制。例如,这是我对 OS X.

的软硬限制
$ ulimit -a -S
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 256
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

$ ulimit -a -H
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) unlimited
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 65532
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1064
virtual memory          (kbytes, -v) unlimited

虽然系统可能支持更多进程,但您的程序将受到这些限制。我限制在709(多奇数)个进程,可以提高到1064个。

单次最大进程数受限于pid_t的大小,并且通常受内核中定义的限制。有关详细信息,请参阅 this answer and also this answer

这可以通过计算 /proc 目录中存在的编号目录的数量来实现。这些编号的目录是当前 运行.

进程的 PID

/proc简称进程信息伪文件系统。 欲了解更多信息,您可以访问, http://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html

我写了一些小代码,给出了进程数 运行。

#include <stdio.h>
#include <dirent.h>

int main()
{
        DIR* proc = opendir("/proc");
        struct dirent* ent;
        int count = 0;

        if(proc == NULL) {
                perror("opendir(/proc)");
                return 1;
        }       

        while(ent = readdir(proc)) {
            if(!isdigit(*ent->d_name))
                continue;
            count++; //if directory name is number then increment the count.
        }

        closedir(proc);

        printf("Number of Processes=%d\n",count);
        return 0;
}

查看 proc(5) 的文档,您会在进程字段中看到:

Number of forks since boot.

所以这根本不是您要查找的号码。 ps 会给你,正如你已经知道的那样,计算 /proc 下名称中只有数字的目录是另一种方法。

ulimit 可能会将每个用户的最大进程限制为小于最大 pid。

ulimit -u 表示用户在特定时间可以拥有的总进程数。上面的命令 returns 我的输出为 63203。这意味着对于用户在某个时间点创建的所有进程,用户可以拥有 63203 个进程 运行。

您将获得给定机器上 运行 个进程的总数

 ps -e | wc -l