我一直在做这个为期5天,每天超过7个小时,我不是最好的编码器,所以我需要一些帮助,我需要知道如何从/ proc,与C代码为Linux获取信息。 所需要的信息可以用下面的例子来表示。
这听起来像你不知道从哪里开始。 让我试着解释/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
这是否给你足够的信息开始?