【问题标题】:How to get number of processes and threads in a C program?如何获取 C 程序中的进程数和线程数?
【发布时间】:2018-10-11 10:45:59
【问题描述】:

我想获取我的 Linux 系统中所有正在运行的进程和所有正在运行的线程的数量。我在 C 应用程序中需要这些信息。从终端,我可以得到他的信息与

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

用于进程和

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

用于包括任务在内的流程。

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

【问题讨论】:

  • 一种 linux 方法是查看虚拟文件夹 proc/self/ 例如 ls /proc/self/task -lL 显示 ls 已启动 1 个线程。
  • 您是否正在寻找作为给定 (C) 进程子进程的进程/线程?或者您是否要查询来自 C 进程的进程/线程总数?我将您的问题解释为后者,但其他人似乎将其解释为前者。
  • @SanderDeDycker 我不够清楚。它希望在我的 linux 系统上运行所有进程和所有线程的数量。这必须在我的 C 应用程序中完成。

标签: c linux linux-kernel


【解决方案1】:

您问题中的ps 示例并没有真正提供您所询问的信息:第一个列出所有系统上的进程,而不仅仅是由特定程序产生的进程,同样第二个列出每个进程中的线程数。

如果您想查找有关特定进程产生的线程的信息,您可以查看/proc/<pid>/task 下的/proc。例如,这里有一个单线程的进程:

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 之类的东西来获取此信息,但该输出并不是真正设计为可机器解析的。

【讨论】:

  • 我不够清楚并编辑了我的问题。我确实要求所有进程和所有线程都在运行。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    最简单的是使用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
    

    【讨论】:

    • 运行此函数一段时间后,我遇到了这个问题:错误:无法访问 /proc 错误:无法访问 /proc 错误:无法访问 /proc 打开管道时出错! sscanf 错误进程计数错误打开管道! sscanf error thread_count 错误打开管道! sscanf 错误进程计数错误打开管道! sscanf error thread_count 分段错误
    • after a while? thread_count ? sscanf error process count? Segmentation fault?此代码只运行一次并存在。这些看起来不像来自此代码的消息。最好的做法可能是创建一个新问题,包括 MCVE 和您发布的错误。
    猜你喜欢
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    相关资源
    最近更新 更多