【发布时间】:2017-07-21 14:29:53
【问题描述】:
我有一个应用程序,它具有信号处理程序并创建了一个线程来处理消息队列。 下面是信号处理程序,
/*! \Register handle on SIGINT. */
signal(SIGINT, CloseHandler);
VOID CloseHandler(INT32 sig)
{
if(sig == SIGINT)
gAppExitFlag = 1;
return;
}
我创建了一个可连接线程来接收消息队列,
/* Initialize and set thread detached attribute */
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
if(0 != (count = pthread_create(&ModemDetectionHandel, &attr, &ModemDetectionOperation, (void *)&gAppContext)))
{
DS3_ERROR(DS3_TELEMETRY_APP, "Error in creating thread ModemDetectionOperation");
}
在线程中,我创建了一个消息队列并使用 msgflg 0 调用 msgrcv。 所以它会阻塞,直到收到任何消息。 现在,当我将 SIGINT 发送到进程但 msgrcv 不回来并在 msgrcv 中阻止线程时。
我的应用程序卡在加入线程中。
根据 msgrcv 手册页“ * 调用进程捕获一个信号。在这种情况下,系统调用失败,errno 设置为 EINTR。(msgrcv() 在被中断后永远不会自动重新启动 信号处理程序,无论在建立信号处理程序时是否设置了 SA_RESTART 标志。)"
为什么线程/msgrcv 没有收到信号? 如果我将线程作为主循环,那么它会返回并成功退出应用程序。
【问题讨论】:
-
如何发送
SIGINT信号?您是否更改了任何信号掩码? -
不,我没有更改信号掩码
-
SIGINT信号呢?你如何生成它? -
执行命令kill -2
标签: c multithreading pthreads signals message-queue