提问人:Siddharth Mohanty 提问时间:10/28/2023 更新时间:10/28/2023 访问量:37
跟踪子进程的内存使用情况
Tracking Memory Usage for Child Process
问:
我正在我的子进程中执行一个 c++ 程序,我想在父进程中跟踪它的内存使用情况。 我尝试过的事情:
- 使用 SIGCHLD
- 使用 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。但我不认为这是实际的程序使用大小,因为无论我在代码中进行任何形式的内存分配,我都会获得相同的输出。
任何帮助将不胜感激
我尝试过的事情:
- 使用 SIGCHLD
- 使用 waitpid
答: 暂无答案
评论
wait4()
获取每个子项的资源使用情况。或者
getrusage()
将所有等待的子进程加在一起。