首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用C从Linux上的/proc文件内容中提取信息?

如何使用C从Linux上的/proc文件内容中提取信息?
EN

Stack Overflow用户
提问于 2015-10-21 18:31:10
回答 1查看 13.1K关注 0票数 1

我一天工作超过7个小时,已经做了5天了。我不是完全最好的编码器,所以我需要一些帮助。我需要知道如何使用Linux上的C程序从/proc获取信息。信息必须打印出来,并包括以下内容:

  • 较完整的指令线,用于再加工。
  • 再生产过程的状态。
  • 准亲的准PID。
  • 优先级。
  • 很好的价值。
  • 实时调度并行优先。
  • CPU副号最后一次被执行。
  • 这一过程所涉及的再分配的时间金额已被安排为更多的、更多的、最基本的用户模式。
  • 这一过程已被安排在较强的准核模式下的再加工时间的量。
  • 虚拟内存大小(以字节为单位)
  • 总副程序尺寸,以页为单位。
  • 常驻数据集大小(RSS)以字节为单位。
  • 常驻机集大小(RSS):相当大的页面数量,更好的加工,在真实的内存中有很好的一致性,更接近于页面。
  • 页面中的文本(代码)大小相当。
  • Data + stack size in pages。
  • 页副表条目,以KB为单位。
  • 较高的数据容量(以KB计)。
  • 以KB为单位的堆栈的大小。
  • 相应文本段的大小表示知识库。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-21 18:59:57

听起来你不知道从哪里开始。让我试着用/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

这些数字代表什么?答案在人事部中,在名为/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", ...)解析它。

代码语言:javascript
运行
复制
#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,我将得到

代码语言:javascript
运行
复制
pid = 29519
comm = (vim)
state = S
parent pid = 5997

这能给你足够的信息开始吗?

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33266678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档