正确关闭C应用程序以确保完成CRITICAL部分的方法?
我有一个在SINGLE线程C应用程序中定义的关闭钩子处理程序。
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)”循环只是连续运行。 ..
基本上在BIG服务器上如果我点击CRTL-C,则以下是连续输出到屏幕:
Transaction still running Transaction still running Transaction still running Transaction still running Transaction still running Transaction still running ...
也许我需要在这里创建线程并在它们之间进行相互通信,但它们是否更容易优雅地允许“共享库中的循环”结束它的“关键代码/事务”,即使在非常快的服务器上关闭之前也是如此? 为什么它在我的linux笔记本电脑上运行?
如果我需要使用线程什么是他们最好和最快的方式来进行comminucate? 目前我正在使用CALLBACKS ….但我不确定最好的IPC是什么线程?
感谢您的帮助,非常感谢
林顿
确保将running
(和transactionRunning
)声明为volatile
。 否则,C编译器可能会在某些情况下缓存其值。 现在,将volatile
视为“信号处理程序可以更改此值”。
请注意,您必须小心这样的代码:
rc = wmq_sender_stop(errorStr);
如果你在信号处理程序中这样做,你最好希望从信号处理程序调用该函数是安全的。 大多数function都没有。 (即使从多个线程调用安全的函数也不安全,无法从信号处理程序调用。)
最后一个问题是如果你的代码是单线程的,但你永远不会从信号处理程序返回,你的主循环应该如何退出? 信号处理程序在您的应用程序的一个现有线程中运行。 通常,您希望在信号处理程序中执行的唯一操作是更改标记为volatile
的全局变量的值,然后返回。
为什么不调用wmq_sender_stop()
而不是通过return
信号处理程序。 共享库中的循环将退出,因此您的应用程序将执行,不是吗?