【发布时间】:2016-07-06 13:59:10
【问题描述】:
在我的程序中,我希望线程 A 定期向线程 B 发送 SIGUSR1。在线程 B 中,它将阻塞在 sigwait。至于收到SIGUSR1 时该怎么做,我还没有定义。下面是我的代码。但是,程序立即终止,输出为User defined signal 1。
void usr1_handler();
int main(int argc, char const *argv[])
{
pthread_t tid;
pthread_attr_t attr_obj;
void *thread(void *);
pthread_attr_init(&attr_obj);
pthread_attr_setdetachstate(&attr_obj, PTHREAD_CREATE_DETACHED);
pthread_create(&tid, &attr_obj, thread, (void *)NULL);
while(1)
{
int ret = pthread_kill(tid, SIGUSR1);
sleep(5);
}
return 0;
}
void *thread(void *dummy)
{
int sig;
sigset_t sigmask;
struct sigaction action;
/* set up signal mask to block all in main thread */
sigfillset(&sigmask);
pthread_sigmask(SIG_BLOCK, &sigmask, (sigset_t *)0);
for (;;)
{
int err = sigwait(&sigmask, &sig);
/* define what to do with sig here */
printf("sig is %d\n", sig);
}
pthread_exit((void *)NULL);
}
【问题讨论】:
-
SIGUSR信号很可能在子线程阻塞所有信号并到达sigwait()之前传递。 -
@AndrewHenle 感谢您的回复。但是主线程会永远在while(1)循环中发送信号,即使第一个信号丢失了,其余的还是会传递的,对吧?
-
@HuangJie 如果确实是这样的话,你的程序在第一个信号发出后就已经崩溃了
-
@IshayPeled 感谢您的回复。是的,我想是这样。我在 while(1) 循环中添加了一些打印。但是,在main函数第一次执行pthread_kill后,程序就终止了。
-
这就解释了,发生的情况是你发送了一次信号,另一个线程还没有设置阻塞,导致你的应用程序崩溃
标签: c multithreading signals