如何从/ proc的C代码中提取信息

我一直在做这个为期5天,每天超过7个小时,我不是最好的编码器,所以我需要一些帮助,我需要知道如何从/ proc,与C代码为Linux获取信息。 所需要的信息可以用下面的例子来表示。

  • 进程的完整命令行。
  • 进程的状态。
  • 父级的PID。
  • 优先。
  • 好的价值。
  • 实时调度优先级。
  • 最后执行的CPU号码。
  • 这个过程在用户模式下被调度的时间量。
  • 此进程已在内核模式下计划的时间量。
  • 虚拟内存大小以字节为单位
  • 程序总大小以页面为单位。
  • 驻留集大小(RSS)以字节为单位。
  • 驻留集大小(RSS):进程在页面中的实际内存页数。
  • 文本(代码)大小以页面为单位。
  • 数据+堆栈大小以页面为单位。
  • 页表项的大小以KB为单位。
  • 以KB为单位的数据大小。
  • 以KB为单位的堆栈大小。
  • 文本段KB的大小。

这听起来像你不知道从哪里开始。 让我试着解释/proc的信息:

如果我们cat /proc/29519/stat ,我们得到这个信息:

29519 (vim) S 5997 29519 5997 34835 29519 24576 1275 0 47 0 5 0 0 0 20 0 2 0 49083340 188043264 3718 18446744073709551615 4194304 6665820 140737488349264 140737488347024 140737280970147 0 0 12288 1837256447 18446744073709551615 0 0 17 3 0 0 21 0 0 8764120 8861948 8925184 140737488349925 140737488349929 140737488349929 140737488351211 0

这些数字代表什么? 答案是在man proc中 ,在/proc/[pid]/stat 。 由此我们看到前四件事是:

pid%d

(1)进程ID。

通讯%s

(2)可执行文件的文件名,括号内。 无论可执行文件是否被换出,这都是可见的。

状态%c

(3)字符串“RSDZTW”中的一个字符,其中R正在运行,S睡眠在可中断的等待中,D在不间断磁盘睡眠中等待,Z是僵尸,T被跟踪或停止(在一个信号上),W是分页。

ppid%d

(4)父母的PID。

有了这些知识,我们可以用fscanf(f, "%d %s %c %d", ...)解析出来fscanf(f, "%d %s %c %d", ...)

 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> void main(int argc, char **argv) { int pid; sscanf(argv[1], "%d", &pid); printf("pid = %d\n", pid); char filename[1000]; sprintf(filename, "/proc/%d/stat", pid); FILE *f = fopen(filename, "r"); int unused; char comm[1000]; char state; int ppid; fscanf(f, "%d %s %c %d", &unused, comm, &state, &ppid); printf("comm = %s\n", comm); printf("state = %c\n", state); printf("parent pid = %d\n", ppid); fclose(f); } 

现在,如果我编译该文件并运行./a.out 29519 ,我会得到

 pid = 29519 comm = (vim) state = S parent pid = 5997 

这是否给你足够的信息开始?