如何查看/ proc /子进程的信息?

时间:2014-09-15 12:44:14

标签: c linux

具体来说,我想查看fork()创建的子进程的/ proc / PID / io文件。我只能想到尝试在父进程中访问它,但它始终无法访问。

pid_t pid = fork();
if (pid < 0) // failed
{
    return;
}
else if (pid == 0) // child process
{
    char* args[] = { "cat", "test.txt" };
    execv(args[0], args);
}
else // parent process
{
    wait(NULL);
}

在等待调用之前可以访问该文件,但它当然不包含任何非零值,因为孩子还没有完成。在等待调用之后文件无法访问,因为子节点已终止。那么,我该怎么做呢?

不可否认,这是一个项目,但我们没有涵盖基本分叉以外的任何内容。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

当您的孩子终止时,您会收到信号SIGCHLD。致电wait将等待此事,然后清理孩子。

你需要做的是为SIGCHLD安装一个信号处理程序,当它到达时,子进程已经是一个僵尸,但它的/proc条目仍然存在。然后阅读/proc/[child pid]/io,之后只有wait给孩子,以便清理它。

编辑:

这是一些代码(需要root(sudo)权限:

#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);
    }

}