如何使用/ proc中的C代码在linux中提取信息

时间:2015-10-21 18:31:11

标签: c linux fedora

我每天工作超过7小时5天,我不是最好的编码器,所以我需要一些帮助,我需要知道如何从/ proc获取信息,用C代码对于Linux。 需要以下面的示例数学方式输出信息。

  • 用于该方法的完整的命令行。
  • 的处理的状态。
  • 父的PID。
  • 优先级。
  • nice值。
  • 实时调度优先级。
  • CPU数目上次执行上。
  • 的时间,这个过程在用户模式被调度金额。
  • 的时间,这一过程已在内核模式下被调度金额。
  • 以字节为单位
  • 虚拟存储器的大小。
  • 在网页
  • 总的程序规模。
  • 驻留集以字节大小(RSS)。
  • 驻留集大小(RSS):页数的方法具有在实际存储器 页。
  • 在网页
  • 文本(代码)的大小。
  • 数据+堆栈大小在网页上。
  • 页表条目大小(KB)。
  • 数据中的KB大小。
  • 堆的KB大小。
  • 文本段KB的大小。

1 个答案:

答案 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

这是否能为您提供足够的信息以便开始使用?