在Linux系统中,使用C语言获取进程内存的相关信息可以通过多种方式实现。以下是一些基础概念和相关方法:
/proc
文件系统每个进程在 /proc
目录下都有一个以其PID命名的目录,通过读取这个目录下的文件可以获得进程的内存使用情况。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get_memory_usage(pid_t pid) {
char path[64];
char buffer[128];
FILE *statusf;
snprintf(path, sizeof(path), "/proc/%d/status", pid);
if ((statusf = fopen(path, "r")) == NULL) {
perror("fopen");
return;
}
while (fgets(buffer, sizeof(buffer), statusf)) {
if (strncmp(buffer, "VmSize:", 7) == 0 || strncmp(buffer, "VmRSS:", 6) == 0) {
printf("%s", buffer);
}
}
fclose(statusf);
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <pid>\n", argv[0]);
return 1;
}
pid_t pid = atoi(argv[1]);
get_memory_usage(pid);
return 0;
}
sysinfo
和 getrusage
这些系统调用可以提供更详细的系统级和进程级的内存使用信息。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/sysinfo.h>
#include <sys/time.h>
#include <sys/resource.h>
void print_memory_usage(pid_t pid) {
struct rusage usage;
if (getrusage(pid, &usage) == -1) {
perror("getrusage");
return;
}
printf("Memory usage for PID %d:\n", pid);
printf(" User CPU time used: %ld.%06ld seconds\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec);
printf(" System CPU time used: %ld.%06ld seconds\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec);
printf(" Max resident set size: %ld KB\n", usage.ru_maxrss);
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <pid>\n", argv[0]);
return 1;
}
pid_t pid = atoi(argv[1]);
print_memory_usage(pid);
return 0;
}
通过上述方法,可以有效地获取Linux系统中C语言编写的进程的内存使用情况。
云+社区技术沙龙[第10期]
腾讯云数据库TDSQL(PostgreSQL版)训练营
腾讯云数据库TDSQL训练营
DBTalk
腾讯云数据库TDSQL(PostgreSQL版)训练营
第四期Techo TVP开发者峰会
Techo Day
Elastic 中国开发者大会
DB-TALK 技术分享会
DB TALK 技术分享会
领取专属 10元无门槛券
手把手带您无忧上云