gpt4 book ai didi

c -/proc/pid/stat 中有哪些字段,以便我可以在 C 中解析它们并获取我自己的程序的内存使用情况?

转载 作者:行者123 更新时间:2023-11-30 14:33:23 30 4
gpt4 key购买 nike

在我自己的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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com