我想编写一个具有以下功能的 C/C++ 程序:
- 将二进制可执行 C 程序作为子进程运行。
- 观察子进程的内存使用情况,当子进程过度使用内存时可以终止子进程,比如超过 100MB。
- 当子进程运行了给定时间(例如 1 秒)时,我可以终止它。
- 让它远离任何 linux 内核函数,这意味着当子进程请求不属于标准 C 库的函数时,我可以阻止它并终止该进程。
关于如何实现这些的任何想法?或者你可以给我一个提示,我可以自己找出来!谢谢!
首先,你应该有一些基本的 Linux 编程知识,所以请仔细阅读Advanced Linux Programming。研究一些简单 shell 的源代码,如sash,并使用strace(1)(例如在现有命令上)来猜测使用了哪些系统调用。
然后你可能想使用setrlimit(2)和ptrace(2)系统调用。
你写:
让它远离任何 linux 内核函数,这意味着当子进程请求不属于标准 C 库的函数时,我可以阻止它并终止该进程。
我不确定这有什么意义。任何 Linux 程序(除了无意义的永不终止while(true);
循环)都在执行一些syscalls,特别是write(2)一些输出(请参阅syscalls(2)以获取它们的列表)。系统调用是应用程序要求内核做某事的手段(因此系统调用以受控方式使用 linux 内核函数)。
请注意,程序可以在不使用 GlibC 的情况下进行系统调用。还有其他的 libc 实现,例如MUSL-Libc。
您可能还对LD_PRELOAD 技巧感兴趣。
/proc/
文件系统肯定是有用的。阅读proc(5)。