- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我自己的Linux程序中,我想监视进程自己的内存使用情况(监视内存泄漏等),手动执行此操作的方法是在命令行上执行cat/proc/pid/stat (例如cat /proc/2421/stat
)并以某种方式破译所有值。
执行此操作的笨拙方法类似于 system("cat /proc/getpid()/stat | sed bla bla")
但我想用 C 代码正确打开文件并解析正确的值。
哪里可以找到 /proc/pid/stat
中字段的定义所以我可以用 C 来解析它们?
最佳答案
这些字段在 Linux 内核的 fs/proc/array.c
中定义,下面是如何解析它们的示例:
这是运行这个简单程序的示例:
$ ./main
My pid[7562]
Stat file [/proc/7562/stat]
Virtual Memory usage: ret[1] scanned[23] result[2342912]
这是main()
函数:
int main (int argc, char *argv[])
{
// Get the current PID's virtual memory usage via /proc/pid/stat
// for example /proc/4231/stat
//
// The fields are defined in the kernel source code:
// fs/proc/array.c
//
// static int do_task_stat()
//
// line 463:
// seq_printf(m, "%d (%s) %c", pid_nr_ns(pid, ns), tcomm, state); // 1, 2, 3
// seq_put_decimal_ll(m, ' ', ppid); // 4
// seq_put_decimal_ll(m, ' ', pgid); // 5
// seq_put_decimal_ll(m, ' ', sid); // 6
// seq_put_decimal_ll(m, ' ', tty_nr); // 7
// seq_put_decimal_ll(m, ' ', tty_pgrp); // 8
// seq_put_decimal_ull(m, ' ', task->flags); // 9
// seq_put_decimal_ull(m, ' ', min_flt); // 10
// seq_put_decimal_ull(m, ' ', cmin_flt); // 11
// seq_put_decimal_ull(m, ' ', maj_flt); // 12
// seq_put_decimal_ull(m, ' ', cmaj_flt); // 13
// seq_put_decimal_ull(m, ' ', cputime_to_clock_t(utime)); // 14
// seq_put_decimal_ull(m, ' ', cputime_to_clock_t(stime)); // 15
// seq_put_decimal_ll(m, ' ', cputime_to_clock_t(cutime)); // 16
// seq_put_decimal_ll(m, ' ', cputime_to_clock_t(cstime)); // 17
// seq_put_decimal_ll(m, ' ', priority); // 18
// seq_put_decimal_ll(m, ' ', nice); // 19
// seq_put_decimal_ll(m, ' ', num_threads); // 20
// seq_put_decimal_ull(m, ' ', 0); // 21
// seq_put_decimal_ull(m, ' ', start_time); // 22
// seq_put_decimal_ull(m, ' ', vsize); // 23 <---- THIS IS THE ONE WE WANT!
pid_t mypid = getpid();
FILE *mypidstat = NULL;
char filename[100] = {0};
printf("My pid[%d]\n", mypid);
snprintf(filename, sizeof(filename), "/proc/%d/stat", mypid);
printf("Stat file [%s]\n", filename);
mypidstat = fopen(filename, "r");
if (mypidstat == NULL) {
fprintf(stderr, "Error: Couldn't open [%s]\n", filename);
return -1;
}
int i = 0;
int ret = 0;
unsigned long long val = 0;
char strval1[100] = {0};
char strval2[100] = {0};
ret = fscanf(mypidstat, "%lld %s %s ", &val, strval1, strval2);
//printf("ret[%d] scanned[%d] result[%lld] [%s] [%s]\n", ret, i, val, strval1, strval2);
// We already scanned 3 params, so start i at the 4th
for (i = 4; i < 24; i++) {
ret = fscanf(mypidstat, "%lld ", &val);
if (i == 23) {
printf("Virtual Memory usage: ret[%d] scanned[%d] result[%lld]\n", ret, i, val);
}
}
fclose(mypidstat);
return 0;
}
还有一个简单的Makefile
$ cat Makefile
CXX = gcc
COMPFLAGS = -c -Wall -g
main: main.o
$(CXX) main.o -o main
main.o: main.c
$(CXX) $(COMPFLAGS) main.c
clean:
rm main main.o
关于c -/proc/pid/stat 中有哪些字段,以便我可以在 C 中解析它们并获取我自己的程序的内存使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59359677/
在经历了DDOS攻击后,不知何故/proc/kcore非常巨大,我使用一个小的php类来检查当前的磁盘空间,以及已经使用了多少。 它显示以下内容: Total Disk Space: 39.2 GB
所以我从 ruby 移植了一个工具,可以在对象上定义回调 block ,我希望在设置回调的情况下调用它。所以基本上是这样的。 def set_block(&block) @new_kid_on
我定义了两个脚本:第一个脚本调用第二个脚本中的 proc。第二个脚本定义了一个命名空间 fooSpace , 定义了一个变量 fooValue内fooSpace , 并定义了一个过程 myProc内f
使用一个 proc 时,我的脚本工作正常(检索 sftp 提示)。但是当我尝试在 proc 中使用 proc 时,脚本卡住了,我不知道为什么。 请不要重构代码,这不是重点,我需要了解这里的问题。 工作
我想知道是否有一种方法可以识别某些proc文件中用于DMA映射的内存,例如mtrr和iomem,或者通过lspic -vv . 在我的/proc/mtrr中,只有一个无法缓存区域,它似乎几乎指向3.5
我有 2 个过程,它们一个接一个地调用。第一个过程使用 diff 功能并创建 file.txt。压缩文件后的过程。问题是当我运行脚本时,file.txt 是空的。当我注释掉压缩过程时,文件中打印了差异
我曾经认为 /proc/self 和 /proc/$$ 在 bash 终端中是一样的,但现在我发现它们是不同的。 我知道$$是当前进程的pid,/proc/self是当前运行的进程,应该是bash终端
在下面的程序中,我想在第 2 个过程中捕获数据包,而 ping 在第 1 个过程中运行。现在,如果我执行这个程序,proc 正在运行 ping 并退出它。有解决此问题的想法吗? 我的 TCL 代码:
在 proc 中,您可以获得 proc 名称(无需对其进行硬编码)吗?例如 proc my_proc { some_arg } { puts "entering proc [some way
我有一个自定义的 A10 存储库,我试图在其中创建一个能够读取 /proc/[pid]/some-file 的应用程序文件,例如stat和 status ,有点像 ps做。 看完这篇 answer很明
我是 TCL 的新人。我通过 Windows Vista 下的 DOS 窗口“tclsh85 FOD/Scripts/program1.tcl”执行 TCL 代码。 program1.tcl 包含“s
我想查看每个进程的精确内存量用作匿名页,因为匿名内存不能调出,因此精确跟踪此使用情况非常重要。 获取匿名页面总数的一种方法是读取/proc/meminfo AnonPages。 另一种方法是将 sma
在 Ruby 中,Proc.new { 'waffles' } 和 proc { 'waffles' } 之间有什么区别吗?我发现很少有人提到第二种语法。 使用 irb 进行测试,我没有发现任何明显的
我正在寻找有关Linux系统上/proc/net/nf_conntrack和/或/proc/net/ip_contrack文件内容的详细文档。 是的,我知道,有许多实用程序可以用人类可读的格式向我显示
而不是执行多个单独的 PROC FREQ一个非常大的数据集上的程序,我想通过执行单个 PROC FREQ 来提高效率与多个 TABLE声明。我们的 QA 流程需要表格标题,这很简单,只需一个 TABL
我想在 /proc/driver 下创建一个文件目录。我想使用像 proc_root_driver 这样的宏(或提供的其他东西)而不是明确使用“驱动程序/模块名称”。我用 create_proc_en
在 SQL Server 2005 中,我希望名为 LimitedUser 的用户只能运行一个过程: GRANT EXEC ON [usp_RunETL] TO [LimitedUser] 但是,该
考虑到以下两个过程: proc firstOne(): void = echo "X" proc secondOne(): void = echo "X" discard 它们
我想使用 PROC TABULATE 复制 PROC MEANS 的输出。原因是我希望将利润百分比(或利润率)作为 PROC MEANS 输出中的变量之一,但希望抑制一个或多个统计数据的计算,即会有一
我的目标是使数据适合具有正支持的任何分布。 (威 bool (2p)、 Gamma (2p)、帕累托 (2p)、对数正态 (2p)、指数 (1P))。第一次尝试,我使用了 proc univariat
我是一名优秀的程序员,十分优秀!