c++定时进程

C++ Timed Process

本文关键字:进程 定时 c++      更新时间:2023-10-16

我正在尝试为已经编写的代码设置一些测试软件(我无法更改)。我遇到的问题是,它在某些调用上挂起了,所以我想尝试实现一些东西,如果它在x秒内没有完成,就会杀死进程。

我试图解决这个问题的两种方法是使用fork或pthread,但到目前为止这两种方法都没有为我工作。我不确定为什么pthread不起作用,我假设这是因为我用来设置线程的静态调用在运行我正在调用的函数所需的内存方面有一些问题(当我正在测试的函数正在运行时,我不断地得到一个段错误)。Fork最初可以工作,但是当我第二次Fork进程时,它将无法检查子进程是否已经完成。

对于半伪代码,这是我写的

test_runner()
{
    bool result;
    testClass* myTestClass = new testClass();
    pid_t pID = fork();
    if(pID == 0) //Child
    {
        myTestClass->test_function(); //function in question being tested
    }
    else if(pID > 0) //Parent
    {
        int status;
        sleep(5);
        if(waitpid(0,&status,WNOHANG) == 0)
        {
            kill(pID,SIGKILL); //If child hasn't finished, kill process and fail test
            result = false;
        }
        else
            result = true;
    }
}

这个方法在初始测试中有效,但是当我去测试第二个函数时,if(waitpid(0,&status,WNOHANG) == 0)将返回子进程已经完成,即使它还没有完成。

pthread方法沿着这些行查看

bool result;
test_runner()
{
    long thread = 1;
    pthread_t* thread_handle = (pthread_t*) malloc (sizeof(pthread_t));
    pthread_create(&thread_handle[thread], NULL, &funcTest, (void *)&thread); //Begin class that tests function in question
    sleep(10);
    if(pthread_cancel(thread_handle[thread] == 0))
        //Child process got stuck, deal with accordingly
    else
        //Child process did not get stuck, deal with accordingly
}
static void* funcTest(void*)
{
    result = false;
    testClass* myTestClass = new testClass();
    result = myTestClass->test_function();
}

显然还有比我所展示的更多的东西,我只是想把大概的想法写下来。我想我正在寻找的是是否有更好的方法来处理这样的问题,或者如果有人看到我正在尝试做的任何明显的问题(我对c++比较陌生)。就像我提到的,我不允许进入我正在设置测试软件的代码,这阻止了我将信号处理程序放入我正在测试的函数中。我只能调用这个函数,然后从那里处理它。

如果c++11是合法的,您可以使用futurewait_for来实现此目的。

例如(现场演示):

std::future<int> future = std::async(std::launch::async, [](){ 
    std::this_thread::sleep_for(std::chrono::seconds(3));
    return 8;  
});
std::future_status status = future.wait_for(std::chrono::seconds(5));
if (status == std::future_status::timeout) {
    std::cout << "Timeout" <<endl ;
} else{
    cout << "Success" <<endl ;
} // will print Success
std::future<int> future2 = std::async(std::launch::async, [](){ 
    std::this_thread::sleep_for(std::chrono::seconds(3));
    return 8;  
});
std::future_status status2 = future2.wait_for(std::chrono::seconds(1));
if (status2 == std::future_status::timeout) {
    std::cout << "Timeout" <<endl ;
} else{
    cout << "Success" <<endl ;
} // will print Timeout

的另一件事:

根据使用waitpid0的文档:

表示等待进程组ID等于的子进程

避免使用pthread_cancel,这可能不是一个好主意。