簡體   English   中英

如何獲取C程序中的進程數和線程數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM