- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,它具有信号处理程序并创建了一个线程来处理消息队列。下面是信号处理程序,
/*! \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 标志的设置如何。)”
为什么 thread/msgrcv 没有收到信号?如果我将线程作为主循环,那么它会返回并且应用程序成功退出。
最佳答案
如果一个信号被发送到一个进程,一个没有阻塞它的线程将会处理它,但是没有指定这将是哪个线程。您说过您没有在所有其他线程上阻止 SIGINT
。因此,对您看到的行为最可能的解释是信号是由主线程处理的,而不是调用 msgrcv
的线程。
要解决此问题,您可以在除调用 msgrcv
的线程之外的所有线程上阻止 SIGINT
。这将确保信号由该线程处理。
如果你有多个线程需要中断,这将不起作用。在这种情况下,您可能需要阻止所有线程的 SIGINT
,并在特殊的中断处理线程中使用 sigwait
来接收 SIGINT
信号。然后,该线程可以向所有需要中断的线程发送另一个信号(可能是 SIGUSR1
),每个此类线程都有一个 pthread_kill
。或者,您也可以使用 pthread_cancel
,具体取决于您的需求。
关于c - System V msgrcv 在线程中阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45230259/
我是一名优秀的程序员,十分优秀!