如何在C程序中获取进程数和线程数?

时间:2018-10-11 10:46:00

标签: c linux linux-kernel

我想获取Linux系统上所有正在运行的进程和所有正在运行的线程的数量。我在C应用程序中需要此信息。在终端上,我可以通过

获取他的信息
$ ps -A --no-headers | wc -l

用于流程和

$ ps -AL --no-headers | wc -l

用于包括任务的过程。

我在/ proc中找不到此信息。 有什么建议吗?

3 个答案:

答案 0 :(得分:3)

您问题中的ps示例并没有真正为您提供所要询问的信息:第一个列表列出了系统中所有 all 个进程,而不仅仅是列出了由系统生成的进程特定程序,第二个类似地列出了每个进程中的线程数。

如果要查找有关特定进程生成的线程的信息,可以在/proc下的/proc/<pid>/task中查找。例如,这是一个单线程进程:

bash-4.4$ ls /proc/15355/task/
15355

这里有三个线程(除了主线程):

bash-4.4$ ls /proc/15295/task/
15295  15296  15297  15298

该过程的相应ps -L输出如下:

bash-4.4$ ps -L -p 15295
  PID   LWP TTY          TIME CMD
15295 15295 pts/4    00:00:00 python
15295 15296 pts/4    00:00:00 python
15295 15297 pts/4    00:00:00 python
15295 15298 pts/4    00:00:00 python

/proc获取正在运行的进程数需要花费更多的工作,因为Linux仅维护有关进程的父级而不是子进程的信息。这意味着您将需要遍历/proc并找到每个以父进程为目标进程的进程...然后对这些进程中的每一个进行递归重复。

您当然可以使用诸如pstree之类的信息来获取此信息,但是该输出并不是真正可机器解析的。

答案 1 :(得分:0)

每个运行的进程都有对应的目录/proc/<pid>。您可以使用它来计算正在运行的进程数(通过计算/proc的所有数字子目录)。

在每个目录中,您可以检查/proc/<pid>/status以获取有关该过程的信息。具体来说,第Threads: <cnt>行为您提供了该进程的线程数。

有关/proc(伪)文件系统的更多信息,请参考man proc

答案 2 :(得分:0)

最简单的方法是使用popen解析命令的输出。

以下内容:

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

void parse_output(char *buf, size_t bufsize, const char cmd[]) 
{
    assert(buf != NULL);
    assert(cmd != NULL);

    FILE *fp;

    // add dynamic allocation here
    memset(buf, 0, bufsize);

    if ((fp = popen(cmd, "r")) == NULL) {
        printf("Error opening pipe!\n");
        exit(-__LINE__);
    }

    // worst speed ever. And strlen is called twice...
    while (fgets(&buf[strlen(buf)], bufsize - strlen(buf), fp) != NULL);

    if(pclose(fp))  {
        printf("Command not found or exited with error status\n");
        exit(-__LINE__);
    }
}


int main() {
    char buf[256];
    long num;

    parse_output(buf, sizeof(buf), "ps -A --no-headers | wc -l");
    if (sscanf(buf, "%ld", &num) != 1) {
        exit(-__LINE__);
    }
    printf("Number of processes: %ld\n", num);

    parse_output(buf, sizeof(buf), "ps -AL --no-headers | wc -l");
    if (sscanf(buf, "%ld", &num) != 1) {
        exit(-__LINE__);
    }
    printf("Number of processes including tasks: %ld\n", num);

}

将在我的系统上输出:

$ gcc 1.c && ./a.out
Number of processes: 241
Number of processes includeing tasks: 867