[英]How to get number of processes and threads in a C program?
我想獲得所有運行進程的數量和我的linux系統的所有運行線程。 我需要在C應用程序中使用此信息。 從終端,我可以得到他的信息
$ ps -A --no-headers | wc -l
對於流程和
$ ps -AL --no-headers | wc -l
包括任務在內的流程
我沒有在/ proc中找到這個信息。 有什么建議么?
你問題中的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
這樣的信息來獲取此信息,但該輸出並非真正設計為機器可解析的。
每個正在運行的進程都有一個相應的目錄/proc/<pid>
。 您可以使用它來計算正在運行的進程數(通過計算/proc
所有數據子目錄)。
在每個目錄中,您可以檢查/proc/<pid>/status
以獲取有關該過程的信息。 具體來說, Threads: <cnt>
為您提供該進程的線程數。
有關/proc
(偽)文件系統的更多信息,請參閱man 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);
}
將在我的系統上輸出:
$ gcc 1.c && ./a.out
Number of processes: 241
Number of processes includeing tasks: 867
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.