【发布时间】:2012-03-16 18:34:22
【问题描述】:
我有一个用 C 编写的程序,它使用 popen 打开另一个程序。我想获取该程序的 pid 或某种处理程序,以便在一定时间限制后杀死它,或者如果它超过了一些 ram 和 stdout 限制。我觉得这必须用ptrace来完成,它需要PID,我不知道如何获取。
【问题讨论】:
我有一个用 C 编写的程序,它使用 popen 打开另一个程序。我想获取该程序的 pid 或某种处理程序,以便在一定时间限制后杀死它,或者如果它超过了一些 ram 和 stdout 限制。我觉得这必须用ptrace来完成,它需要PID,我不知道如何获取。
【问题讨论】:
您还可以使用 ulimits 和其他技巧来实现所需的功能,而无需使用 ptrace。你可以通过将你的命令写成类似于"sh -c 'ulimit [ulimit strings]; whatever-command'" 来做到这一点。 ulimit -v 负责 RAM 限制。 CPU 时间限制 (ulimit -t) 可能能够接近时间限制;如果没有,并且如果你愿意重写popen,那么你可以在那里拨打setitimer。 stdout 不那么简单;但如果您使用 shell 重定向记录标准输出,那么我认为 ulimit -f 会这样做。如果您在父母中读取孩子的标准输出,您可以自己跟踪它,如果时间过长,则用信号杀死。
【讨论】:
只需编写您自己的 popen 实现即可返回 PID。它比现有的popen 周围的一些疯狂的黑客要丑得多。你可以在网上找到popen 实现的源代码。 Here's one.
【讨论】: