跟踪子进程的内存使用情况

Tracking Memory Usage for Child Process

提问人:Siddharth Mohanty 提问时间:10/28/2023 更新时间:10/28/2023 访问量:37

问:

我正在我的子进程中执行一个 c++ 程序,我想在父进程中跟踪它的内存使用情况。 我尝试过的事情:

  1. 使用 SIGCHLD
  2. 使用 waitpid

您可以查看注释的代码以了解我尝试过的内容。

int get_memory_usage(pid_t pid) { 
    int fd, data, stack; 
    char buf[4096], status_child[100000]; 
    char *vm; 
 
    sprintf(status_child, "/proc/%d/status", pid); 
    if ((fd = open(status_child, O_RDONLY)) < 0) 
        return -1; 
 
    read(fd, buf, 4095); 
    buf[4095] = '\0'; 
    close(fd); 
 
    data = stack = 0; 
 
    vm = strstr(buf, "VmData:"); 
    if (vm) { 
        sscanf(vm, "%*s %d", &data); 
    } 
    vm = strstr(buf, "VmStk:"); 
    if (vm) { 
        sscanf(vm, "%*s %d", &stack); 
    } 
 
    return data + stack;     
} 

// void handler(int sig){
//     cout<<"Sig handler caught";
// }

int main() {
    // signal(SIGCHLD,handler);
    int pid = fork();
    if(pid == -1){
        perror("fork"); 
        exit(EXIT_FAILURE); 
    }
    else if(pid == 0){
        cout<<"I am the child process"<<endl;
        const char* command = "/bin/sh";
        const char* arg1 = "sh";
        const char* arg2 = "-c";
        const char* arg3 = "/user_code/myprogram < /user_code/input.txt > /user_code/output1.txt";

        execlp(command, arg1, arg2, arg3, (char*)NULL);

        perror("execl");
        exit(EXIT_FAILURE);
    }
    else{
        cout<<"I am the parent process";

        //What am I supposed to do here?

        //child pid
        // time_t t;
        // int status;
        // pid_t childpid = pid;
        
        // do {
        //     if ((pid = waitpid(pid, &status, WNOHANG)) == -1) perror("wait() error");
        //     else if (pid == 0) {
        //         time(&t);
        //         printf("child is still running at %s", ctime(&t));
        //         cout<<"Memory used: "<<get_memory_usage(childpid)<<endl;
        //     }
        //     else {
        //         if (WIFEXITED(status)){
        //             printf("child exited with status of %d\n", WEXITSTATUS(status));
        //         }
        //         else puts("child did not exit successfully");
        //     }
        // } while (pid == 0);
    }
}

第二次尝试使用 waitpid 给我输出,但我得到的恒定值约为 300KB。但我不认为这是实际的程序使用大小,因为无论我在代码中进行任何形式的内存分配,我都会获得相同的输出。

任何帮助将不胜感激

我尝试过的事情:

  1. 使用 SIGCHLD
  2. 使用 waitpid
c linux unix fork waitpid

评论

0赞 Shawn 10/29/2023
使用 wait3() 或 wait4() 获取每个子项的资源使用情况。或者 getrusage() 将所有等待的子进程加在一起。
0赞 Siddharth Mohanty 10/29/2023
getrusage 不会在 prod/pid/status 中搜索。我正在寻找一种从 proc 文件中获取内存的方法
0赞 Siddharth Mohanty 10/29/2023
我实际上希望我的父进程不断轮询子进程文件并获取内存。但我做不到。我总是得到 364KB 的恒定内存。

答: 暂无答案