C++ 从C+执行另一个程序+;具有指定的运行超时
我正在编写一个程序(一个遗传算法实现),它使用“系统”方法执行另一个程序来计算适应度。问题是另一个程序有时会无限期地挂起。如何执行一个具有C++时间限制的程序? < Posix和C++解决方案都很受欢迎。或多或少,这将运行一次应用程序,所以解决方案不必非常优雅 我正在运行Linux CentOS发行版,并在Cygwin上进行测试。对于编译器,我使用GCC4.1.2和boost库 谢谢你的帮助C++ 从C+执行另一个程序+;具有指定的运行超时,c++,linux,unix,gcc,posix,C++,Linux,Unix,Gcc,Posix,我正在编写一个程序(一个遗传算法实现),它使用“系统”方法执行另一个程序来计算适应度。问题是另一个程序有时会无限期地挂起。如何执行一个具有C++时间限制的程序? < Posix和C++解决方案都很受欢迎。或多或少,这将运行一次应用程序,所以解决方案不必非常优雅 我正在运行Linux CentOS发行版,并在Cygwin上进行测试。对于编译器,我使用GCC4.1.2和boost库 谢谢你的帮助 如果这个“另一个”程序是您的,或者您拥有公共许可证下的源代码,那么最好不要让它成为一个单独的程序,而是在
- do fork(),记住PID,调用exec*(“我的程序”,…)
- 使用计时器在主程序中创建线程李>
- 当时间触发时,使用kill()和PID命令终止进程
使用
fork
/exec
习惯用法执行程序,而不是system
。在执行exec
之前,将RLIMIT_CPU
设置为子级中的最大值
确保子进程没有忽略
SIGXCPU
(这是不太可能的)。您可以创建一个计时器(例如),然后尝试将子进程。。。这假设您使用并启动所有子进程,并存储每个pid。您能否解释有关确保不忽略SIGXCPU的更多信息?@Sergej:大多数信号默认情况下会导致程序终止,但程序员可以决定使用sigaction
显式捕获或忽略信号。我从未见过任何程序捕获或忽略SIGXCPU
,我也不确定这是否可能,但明智的做法是运行该程序并对其执行kill-XCPU
命令以防万一。这衡量CPU时间,但根据我对这个问题的理解,Sergej正在寻找墙上时钟时间的限制。@Ben:你说得对,如果程序继续不必要地使用CPU时间,则此操作有效。如果它挂起等待,Errata的解决方案更好。我的第二个程序挂起。它使用CPU,但它永远不会产生任何结果,因此应该在一段时间后被杀死。根据我的主观判断,第二个程序中使用的GLPK库中的presolver有一个bug,有时会进入无限循环。因此,在这种情况下,最好的方法是什么?可以终止其他进程,但终止线程会使整个进程处于不一致的状态。