我有一个在单线程C应用程序中定义的关闭钩子处理程序。关闭C应用程序以确保完成CRITICAL部分的正确方法?
int main(int argc, char * argv[]){
//Shutdown hook for CTRL-C
(void) signal(SIGINT, shutdownHook);
...
...
}
因此,当用户点击CTRL-C关闭钩启动...
void shutdownHook(int sig){
rc = wmq_sender_stop(errorStr);
if (rc != 0){
printf("\n%s\n", errorStr);
}
while(transactionRunning == TRUE){
sleep(1);
printf("Transaction still running\n");
}
....
....
}
你可以看到上面我所说的“wmq_sender_stop”程序(在共享库)基本上将变量设置为FALSE以结束该共享库中的循环。
int wmq_sender_stop(char errorStr[ERROR_STR_LEN]){
running = FALSE;
...
}
并且变量“running”将停止(希望)在该共享库中运行的主循环。
while(running == TRUE){
...
...
}
我遇到的问题是,在我的Linux系统中所有的工程100%...但是,当我一个很大的功能强大的服务器上安装应用程序,它调用“wmq_sender_stop”,并设置可变细,但似乎就像应用程序在服务器上运行速度太快以允许“while(running == TRUE)”变量退出.....或者它只是简单地返回到主应用程序,并且“while(transactionRunning == TRUE )”循环只是连续运行...
本质的大型服务器上,如果我打CRTL-C以下是时间可持续输出到屏幕:
Transaction still running
Transaction still running
Transaction still running
Transaction still running
Transaction still running
Transaction still running
...
也许我需要在这里创建线程,并在它们之间进行相互通信,但是它们没有更简单的方法来优雅地允许“共享库中的循环”在关闭之前结束它的“关键代码/事务”,即使在极速服务器?为什么它在我的linux笔记本电脑上工作?
如果我需要使用线程什么是最好的和最快的方式,他们comminucate?目前我正在使用CALLBACKS ....但不确定最适合线程的IPC是什么?
感谢您的帮助,非常感谢
林顿
什么在您的Linux机器上将'transactionRunning'设置为FALSE?如果它是一个单线程应用程序,它不会改变它的'sleep/printf'循环... –
通常,在信号处理程序(或I/O)中执行长时间运行的任务并不是一个好主意。而是在信号处理程序中发送一个“信号”给主线程并完成所有工作。 –
正如你所说的应用程序是单线程的,当应用程序在SIGINT处理程序中循环并等待时,共享库没有机会退出其循环。一个明显的事实是,它看起来好像它会按照你希望它应该在你的Linux机器上那样工作,尽管它不应该。服务器上的行为对我来说看起来完全没问题。 – alk