如果超过5秒,如何使用C ++退出进程?

时间:2011-01-01 10:59:35

标签: c++ process execution-time

我正在用C ++实现一个检查系统。它使用不同的测试运行可执行文件。如果解决方案不正确,可能需要永远完成某些硬测试。这就是我想将执行时间限制在5秒的原因。

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

system("./solution");

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

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

由于

6 个答案:

答案 0 :(得分:5)

QProcess使用QTimer,以便在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();
}

答案 1 :(得分:2)

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

有关详细信息,请参阅:http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_cancel.3.html

答案 2 :(得分:1)

void WaitForExit(void*)
{
    Sleep(5000);
    exit(0);
}

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

_beginthread(WaitForExit, 0, 0);

答案 3 :(得分:1)

签出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仍然在运行)。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果您正在使用Posix兼容系统(通常是MacOS和Unix),请使用fork execv和``waitpid instead of system`。可以找到一个示例{ {3}}。现在唯一真正棘手的一点是如何获得一个超时的waitpid。看看here的想法。