我想获取Linux系统上所有正在运行的进程和所有正在运行的线程的数量。我在C应用程序中需要此信息。在终端上,我可以通过
获取他的信息$ ps -A --no-headers | wc -l
用于流程和
$ ps -AL --no-headers | wc -l
用于包括任务的过程。
我在/ proc中找不到此信息。 有什么建议吗?
答案 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