getrusage() 没有为 Child 进程提供正确的 rss 值

getrusage() not giving the correct rss value for the Child process

提问人:Siddharth Mohanty 提问时间:10/29/2023 更新时间:10/29/2023 访问量:44

问:

我在 C++ 中编写了以下代码,以在沙盒环境中运行 C++ 代码,然后获取其内存使用情况

int main() {
    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"<<endl;

        int status;
        struct rusage ru;

        wait(&status);

        if (WIFEXITED(status)) {
            getrusage(RUSAGE_CHILDREN, &ru);
            cout << "Memory usage (in KB): " << ru.ru_maxrss << endl;
        } else {
            cout << "Child process did not exit as expected." << endl;
        }
    }
}

上面的代码打印:

I am the parent process
I am the child process
Memory usage (in KB): 3584

那是非常少的RSS。当我在 python 中运行相同的逻辑时,我得到的 rss 为 9440 KB,与我在 codeforces 上提交的相比是准确的

我厌倦了在 python 上运行逻辑。在那里,它给出了正确的响应。

我的python代码给出了正确的响应:

import subprocess
import resource



p = subprocess.Popen("/user_code/myprogram < /user_code/input.txt > /user_code/output2.txt", shell=True)
p.wait()
print(resource.getrusage(resource.RUSAGE_CHILDREN).ru_maxrss)

这打印了 9440 KB。

c linux unix fork getrusage

评论

1赞 Some programmer dude 10/29/2023
首先,您需要检查是否失败。其次,Python 类将分叉整个 Python 解释器本身,这当然比你的小而简单的测试程序使用更多的内存。getrusagePopen
0赞 Siddharth Mohanty 10/30/2023
它不是一个小而简单的测试程序。就是这个代码。这已经足够体面了:codeforces.com/contest/1888/submission/229438258。getrusage 并没有失败。
0赞 Siddharth Mohanty 10/30/2023
如果您看到第一个测试用例,您将看到以下内容: .我需要一个接近那个的记忆Time: 0 ms, memory: 9300 KB
0赞 Some programmer dude 10/30/2023
为什么呢?为什么需要“接近该值的内存”?应该解决的原始和根本问题是什么?为什么只使用所需的内存不是更好?为什么需要浪费内存?请编辑您的问题以向我们提供更多详细信息,并确保该问题是独立的。
0赞 Some programmer dude 10/30/2023
另外,请花时间阅读帮助页面,参加 SO 导览,并阅读如何提问。然后,请阅读有关如何编写“完美”问题的信息,尤其是其清单

答: 暂无答案