Я пытаюсь прочитать использование памяти (в частности, PSS) дочернего процесса, читая его файловую систему proc, когда дочерний процесс вот-вот будет завершен.
После этого и этого ответы, мне удалось перехватить сигнал SIGCHLD дочернего процесса и прочитать некоторые данные из файловой системы proc. Я обнаружил, что он хорошо работает для большинства файловых систем proc, но не работает для /proc/PID/maps и /proc/PID/smaps. Похоже, что и карты, и карты уже пусты, когда выдается сигнал SIGCHLD. Если слишком поздно читать карты и 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);
}
}