读取proc stat信息

Jon*_*nzi 6 c unix pid stat proc

您好,我需要有关具有某些 PID 的进程的以下信息:

名称、ppid、状态、#ofOpenFiles、#ofThreads

我知道 /proc/pid/stat 文件的示例如下:

15(看门狗/1) S 2 0 0 0 -1 69239104 0 0 0 0 0 69 0 0 -100 0 1 0 6 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 1844674407370 9551615 0 0 17 1 99 1 0 0 0 0 0 0 0 0 0 0 0

我当前尝试解析此类文件:

FILE *fp;
           char buff[255];
           fp= fopen("/proc/123/stat", "r");
           if(fp == NULL){

           }else{

             fscanf(fp, "%d %s %c %d %d %d %d %d %u %lu ....", &pid, &name, &ppid......)
             fclose(fp);
           }
Run Code Online (Sandbox Code Playgroud)

我觉得这个方法不太好。这个怎么做?

Mat*_*ieu 4

您描述的解决方案看起来不错(特别是使用@kaylum 的*格式说明符的想法)。请注意,您可以多次使用同一变量来忽略参数:

fscanf(fp, "%d %s %c %d %d %d %d %d %u %lu ...", &pid, &name, &ppid, &dummy, &dummy, &dummy, ...);
Run Code Online (Sandbox Code Playgroud)

您还可以查看按strtok标记读取每一行“标记”。您可以使用它创建一个返回char*类似于另一个问题中的数组的函数,并获取第 i 个元素(进行所有正确NULL和大小检查)。

编辑:如果文件名包含空格,那么您必须使用正则表达式或使用例如手动解析字符串以strtok()检测正确的格式。

  • 如果 stat 文件如下所示,会发生什么情况: 49102 (Name with space) S 3249 3506 3506 0 -1 1077936192 573 0 0 0 671 575 0 0 20 0 11 0 10835724 808615936 13699 1844674407370 9551615 4194304 8101684 140732335739408 140538183277872 140538250385161 0 4 4096 1260 1 0 0 -1 7 0 0 0 0 0 10201672 10213228 40337408 140732335748225 140732335748579 140732335748579 140732335751059 0 此处的名称为“(Name”和以下读数fscanf 将是不正确的。 (4认同)
  • 另请注意,如果是内核进程,则字符串本身可以超过 16 个字符。该进程也可以包装在“()”内,而不需要任何“\”,例如“(sd-pam)”。所以你需要匹配所有的递归`)`。这有效: `fscanf(f, "%*llu (%*[^)]%*[)] %c", _s) ;​​` 同样,这会忽略前 2 个值。您无法可靠地说出第二个字段的长度,因为它不限于内核空间程序的“TASK_COMM_LEN”。 (2认同)