我试图为已编写的代码(我无法更改)设置一些测试软件。我遇到的问题是它在某些调用中被挂起,所以我想尝试实现一些如果它在x秒内没有完成就会终止进程的东西。
我试图解决这个问题的两种方法是使用fork或pthread,但到目前为止这两种方法对我都没有用。我不确定为什么pthread不起作用,我假设它是因为我用来设置线程的静态调用有一些问题需要运行函数所需的内存我正在调用(当我正在测试的功能正在运行时,我不断得到一个段错误)。 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();
}
显然,有一些事情比我所展示的更多,我只是想把这个概念放下来。我想我正在寻找的是,如果有更好的方法来处理这样的问题,或者如果有人看到任何明显的问题与我试图做的事情(我' m)相对较新的C ++)。就像我提到的那样,我不允许进入我设置测试软件的代码,这阻止了我将信号处理程序放入我测试的功能中。我只能调用该函数,然后从那里处理它。
答案 0 :(得分:2)
如果c ++ 11合法,您可以将future
与wait_for
用于此目的。
例如(live demo):
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
另一件事:
根据waitpid
使用0
的文档:
表示等待进程组ID等于的任何子进程 调用过程的那个。
避免使用pthread_cancel
这可能不是一个好主意。