unix - 如何在子进程终止之前读取子进程的 /proc/PID/maps
问题描述
当子进程即将终止时,我试图通过读取其 proc 文件系统来读取子进程的内存使用情况(特别是 PSS)。
按照这个和这个答案,我设法挂钩子进程的 SIGCHLD 信号并从 proc 文件系统读取一些数据。我发现它适用于大多数 proc 文件系统,但不适用于 /proc/PID/maps 和 /proc/PID/smaps。当发出 SIGCHLD 信号时,maps 和 smaps 看起来都已经是空的了。如果在发出 SIGCHLD 时读取地图和地图为时已晚,我还有什么替代方法?任何提示将不胜感激。谢谢。
以下是从我上面链接的第二个答案复制的示例代码。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>
pthread_mutex_t mutex;
void sigchldhandler(int s) {
// signals to the main thread that child has exited
pthread_mutex_unlock(&mutex);
}
int main() {
// init and lock the mutex
pthread_mutex_init(&mutex, NULL);
pthread_mutex_lock(&mutex);
// install signal handler
signal(SIGCHLD, sigchldhandler);
pid_t child_pid = fork();
if (child_pid > 0) {
// parent
// wait for the signal
pthread_mutex_lock(&mutex);
char buffer[0x1000];
sprintf(buffer, "/proc/%d/io", child_pid);
FILE * fp = fopen(buffer, "r");
if (!fp) {
perror("fopen");
abort();
}
while (fgets(buffer, sizeof(buffer), fp)) {
printf("%s", buffer);
}
// clean up child
wait(0);
return 0;
} else if (child_pid < 0) {
perror("fork");
abort();
} else {
// child
char* args[] = { "cat", "test.txt" };
execv(args[0], args);
}
}
解决方案
推荐阅读
- arrays - 将包含 60 个项目的数组制作成一个数组数组,每个数组包含 20 个项目
- git - 无法通过 SSH 克隆
- sql-server - SQL Server 2012 - 消息 8114 - 错误?
- android - 初学者 android 应用程序在旧手机 (ZTE) 上崩溃
- c# - ORA-01036: 非法变量名称/编号,在 select 和 from 之间绑定参数
- android - 如何在 Flutter 上更新 Google Play Developer API?
- arrays - 如何打开切片
- firebase - 如何授权 Firebase 域确认电子邮件?
- cen-xfs - 如何使用 XFS 查找 ATM 显示器是否为触摸屏?
- python - 如何在 Pandas 中将 sing 列除以多列?