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