模拟虚拟内存限制

题目介绍

本题目要求编写一个C程序,用于演示如何在Unix-like系统中设置进程的内存限制,并运行一个子进程来测试这个限制。这涉及到资源限制的概念,是操作系统中进程管理的一个重要方面。

本题可参考Linux系统编程基础

题目要求

  • 实现 set_memory_limit 函数,设置进程的内存限制。
  • 实现 run_child_process 函数,创建并运行一个子进程,并为其设置内存限制。
  • 子进程应尝试分配超出限制的内存,并观察结果。

输入

  • 子进程尝试分配的内存大小(在 child_program.c 中硬编码为120MB)。

输出

  • 子进程因超出内存限制而失败的信号或退出状态。

代码介绍

child_program.c

子进程的程序,尝试分配指定大小的内存。

void allocate_memory(size_t size_in_mb) {
    // ...
}

int main() {
    allocate_memory(120); // 尝试分配120MB内存
    return 0;
}

main.c

主进程的程序,设置内存限制并运行子进程。

void set_memory_limit(rlim_t memory_limit) {
    // 设置内存限制
}

void run_child_process(rlim_t memory_limit, const char *program_path) {
    // 运行子进程并设置内存限制
}

int main() {
    // 设置内存限制为100MB并运行子进程
    run_child_process(memory_limit, program_path);
    return 0;
}

详细提示信息

设置内存限制

  • 使用 setrlimit 函数设置进程的资源限制,具体是 RLIMIT_AS(进程的地址空间限制)。

运行子进程

  • 使用 fork 创建子进程。
  • 在子进程中调用 set_memory_limit 设置内存限制。
  • 使用 execl 替换子进程的映像,运行 child_program
  • 在父进程中等待子进程结束,并根据其退出状态给出相应的输出。

注意事项

  • 确保 setrlimit 正确设置内存限制,注意资源限制的结构体 rlimit 的设置方式。
  • 子进程的内存分配失败时,应正确捕捉并输出错误信息。
  • 父进程应正确解释子进程的退出状态,并给出清晰的输出。
  • 参与者需要根据题目要求,完成内存限制设置和子进程运行的相关函数实现。通过这个练习,可以加深对操作系统资源限制和进程管理的理解。