我每天工作超过7小时5天,我不是最好的编码器,所以我需要一些帮助,我需要知道如何从/ proc获取信息,用C代码对于Linux。 需要以下面的示例数学方式输出信息。
答案 0 :(得分:0)
听起来你不知道从哪里开始。让我试着解释/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。
comm%s
(2)括号中可执行文件的文件名。这是可见的 是否可以删除可执行文件。
州%c
(3)字符串“RSDZTW”中的一个字符,其中R正在运行,S是 在一个可中断的等待中睡觉,D正在等待不间断的 磁盘休眠,Z是僵尸,T被跟踪或停止(在信号上)和W 正在传呼。
ppid%d
(4)父母的PID。
有了这些知识,我们可以用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
这是否能为您提供足够的信息以便开始使用?