如何获得C程序中的进程数和线程数?

如何获得C程序中的进程数和线程数?,c,linux,linux-kernel,C,Linux,Linux Kernel,我想获得linux系统中所有正在运行的进程和所有正在运行的线程的数量。我需要C应用程序中的此信息。从终端,我可以得到他的信息 $ ps -A --no-headers | wc -l 对于流程和 $ ps -AL --no-headers | wc -l 对于包括任务在内的流程 我在/proc中未找到此信息。 有什么建议吗?您问题中的ps示例并没有真正提供您所询问的信息:第一个示例列出了系统上的所有进程,而不仅仅是特定程序生成的进程,第二个示例同样列出了每个进程中的线程数 如果要查找特定进程

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

$ ps -A --no-headers | wc -l
对于流程和

$ ps -AL --no-headers | wc -l
对于包括任务在内的流程

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

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

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

bash-4.4$ ls /proc/15355/task/
15355
这里有一个有三个线程(除了主线程之外):

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

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

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

bash-4.4$ ls /proc/15355/task/
15355
这里有一个有三个线程(除了主线程之外):

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

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

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


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

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

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


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

最简单的方法是使用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);

}

最简单的方法是使用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);

}

?linux的一种方法是查看虚拟文件夹
proc/self/
eg
ls/proc/self/task-lL
显示ls已启动的1个线程。您是否正在查找作为给定(C)进程子进程的进程/线程?或者您想从C进程中查询进程/线程的总数?我把你的问题解释为后者,但其他人似乎把它解释为前者。@Sanderedycker我不够清楚。它希望在我的linux系统上运行所有进程和线程的数量。这必须在我的C应用程序中完成。linux的一种方法是查看虚拟文件夹
proc/self/
eg
ls/proc/self/task-lL
显示ls已启动的1个线程。您是否正在查找作为给定(C)进程子进程的进程/线程?或者您想从C进程中查询进程/线程的总数?我把你的问题解释为后者,但其他人似乎把它解释为前者。@Sanderedycker我不够清楚。它希望在我的linux系统上运行所有进程和线程的数量。这必须在我的C应用程序中完成。我不够清楚,编辑了我的问题。我确实要求所有进程和线程都在运行。我不够清楚,编辑了我的问题。我确实要求所有进程和线程都在运行。运行此函数一段时间后,我遇到了以下问题:错误:无法访问/proc错误:无法访问/proc错误:无法访问/proc错误打开管道!sscanf错误过程计数错误打开管道!sscanf错误螺纹\u计数错误打开管道!sscanf错误过程计数错误打开管道!sscanf错误线程\u计数分段故障
过一段时间后
<代码>螺纹计数<代码>sscanf错误进程计数<代码>分段故障?这段代码只运行一次并且存在。这些看起来不像来自此代码的消息。也许最好的做法是创建一个新问题,包括一个MCVE和你发布的错误