C++ 从C+执行另一个程序+;具有指定的运行超时

C++ 从C+执行另一个程序+;具有指定的运行超时,c++,linux,unix,gcc,posix,C++,Linux,Unix,Gcc,Posix,我正在编写一个程序(一个遗传算法实现),它使用“系统”方法执行另一个程序来计算适应度。问题是另一个程序有时会无限期地挂起。如何执行一个具有C++时间限制的程序? < Posix和C++解决方案都很受欢迎。或多或少,这将运行一次应用程序,所以解决方案不必非常优雅 我正在运行Linux CentOS发行版,并在Cygwin上进行测试。对于编译器,我使用GCC4.1.2和boost库 谢谢你的帮助 如果这个“另一个”程序是您的,或者您拥有公共许可证下的源代码,那么最好不要让它成为一个单独的程序,而是在

我正在编写一个程序(一个遗传算法实现),它使用“系统”方法执行另一个程序来计算适应度。问题是另一个程序有时会无限期地挂起。如何执行一个具有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,有时会进入无限循环。因此,在这种情况下,最好的方法是什么?可以终止其他进程,但终止线程会使整个进程处于不一致的状态。