当命中主程序中的CTRL-C时,线程变量/句柄会发生什么?

时间:2011-11-10 17:18:47

标签: c

我使用Websphere MQ 6在AIX 6.1上运行了一个C应用程序。

应用程序的高级别是:

  • 主C应用程序产生一个单独的THREAD,它执行LOOP以从队列中获取消息。
  • 当CTRL-C被命中时,我有一个关闭钩子(通过信号),优雅地将“线程运行变量”设置为FALSE并且线程结束。

问题是每当我按下CTRL-C时,我都会得到以下原因代码:

2009 - MQRC_CONNECTION_BROKEN

所以即使Websphere MQ上的MQGET当前正在运行,当我按下CTRL-C时,“连接句柄”似乎“死”

我是否需要将线程中的连接句柄声明为volatile或static或其他内容?

我认为我的线程关闭都是100%....而且这个连接断开的问题导致在MQSeries上生成可怕的日志......

我已经向mqseries.net发布了一个类似的问题,但我只是想知道当CTRL-C被击中并且我的关闭钩子被触发时我是否缺少一些基本概念....

非常感谢任何帮助

林顿

1 个答案:

答案 0 :(得分:1)

使用POSIX线程模型考虑:

对于调用pthread_sigmask()并阻止SIGINT的任何线程,该线程将不会收到CTRC / C.包括主线程在内的任何未阻塞信号的线程都会收到它。在父线程和您创建的线程或LWP之间处理信号是不同的。

因此在主程序中,调用sigprocmask()来设置处理SIGINT。如你所述。 所有其他线程本身都必须通过调用pthread_sigmask()来阻止SIGINT。