c++定时进程
C++ Timed Process
我正在尝试为已经编写的代码设置一些测试软件(我无法更改)。我遇到的问题是,它在某些调用上挂起了,所以我想尝试实现一些东西,如果它在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是合法的,您可以使用future
和wait_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
的另一件事:
根据使用waitpid
和0
的文档:
表示等待进程组ID等于的子进程
避免使用pthread_cancel
,这可能不是一个好主意。
相关文章:
- boost::进程间消息队列引发错误
- Ardunio UNO解决了多个重叠的定时器循环
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 是否可以通过C++扩展强制多个python进程共享同一内存
- IPC使用多个管道和分支进程来运行Python程序
- 异常属于C++中的线程还是进程
- WMI检测进程创建事件-c++
- c++多进程编写一个唯一的文件
- 如何在C++中将函数发送到另一个进程
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 终止 QProcess 不会终止子进程
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- Windows 进程间同步类似事件?
- 在挂钩启动新线程时解除挂钩进程
- pclose() 不会给我进程退出代码
- 我们能否在stm32f中使用硬件定时器控制两个独立的进程
- 在 Windows/C++ 上使用多进程应用程序的高精度定时操作
- c++定时进程
- c++ Qt异步进程的快速定时建议