【问题标题】:How to exit a process run with C++ if it takes more than 5 seconds?如果需要超过 5 秒,如何退出使用 C++ 运行的进程?
【发布时间】:2011-01-01 10:59:34
【问题描述】:

我正在用 C++ 实现一个检查系统。它运行具有不同测试的可执行文件。如果解决方案不正确,它可能需要很长时间才能完成某些严格的测试。这就是为什么我想将执行时间限制为 5 秒。

我正在使用 system() 函数来运行可执行文件:

system("./solution");

.NET 有一个很棒的 WaitForExit() 方法,那么原生 C++ 呢?我也在使用 Qt,因此欢迎使用基于 Qt 的解决方案。

那么有没有办法将外部进程的执行时间限制为 5 秒?

谢谢

【问题讨论】:

    标签: c++ process execution-time


    【解决方案1】:

    使用QProcessQTimer,这样你就可以在 5 秒后杀死它。类似的东西;

    QProcess proc;
    QTimer timer;
    
    connect(&timer, SIGNAL(timeout()), this, SLOT(checkProcess());
    proc.start("/full/path/to/solution");
    timer.start(5*1000);
    

    并实施checkProcess()

    void checkProcess()
    {
        if (proc.state() != QProcess::NotRunning())
            proc.kill();
    }
    

    【讨论】:

      【解决方案2】:

      使用单独的线程来完成所需的工作,然后从另一个线程发出 pthread_cancle () 在一段时间(5 秒)后调用工作线程。确保注册正确的处理程序和线程的可取消选项。

      更多详情请参考:http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_cancel.3.html

      【讨论】:

        【解决方案3】:

        查看Boost.Thread,让您可以在单独的线程中进行系统调用,并使用timed_join 方法来限制运行时间。

        类似:

        void run_tests()
        {
            system("./solution");
        }
        
        int main()
        {
            boost::thread test_thread(&run_tests);
        
            if (test_thread.timed_join(boost::posix_time::seconds(5)))
            {
                // Thread finished within 5 seconds, all fine.
            }
            else
            {
                // Wasn't complete within 5 seconds, need to stop the thread
            }
        }
        

        最难的部分是确定如何很好地终止线程(注意 test_thread 仍在运行)。

        【讨论】:

        • timed_join 已弃用,将在 boost 1.56 中消失,最好使用“test_thread.try_join_for(boost::chrono::seconds(5))”
        【解决方案4】:
        void WaitForExit(void*)
        {
            Sleep(5000);
            exit(0);
        }
        

        然后使用它(特定于 Windows):

        _beginthread(WaitForExit, 0, 0);
        

        【讨论】:

        • 抱歉,我忘了说我使用的是 Mac OS X,我希望它独立于平台。
        【解决方案5】:

        Windows 上的解决方案测试系统应该使用Job objects 来限制它对系统的访问和执行时间(不是实时,顺便说一句)。

        【讨论】:

        • 我在 Mac OS 上 :) 我想让它跨平台。
        • 无论如何,基于实时测量终止进程是错误的:如果某个后台进程在您的“解决方案”运行时唤醒并开始使用大量 CPU 时间,您将提前终止它.
        【解决方案6】:

        如果您正在使用符合 Posix 的系统(通常是 MacOS 和 Unix),请使用 fork execv 和 ``waitpidinstead ofsystem`。可以在 here 找到示例。现在唯一真正棘手的一点是如何获得带有超时的waitpid。看看here 的想法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-24
          • 2023-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多