【发布时间】:2017-07-30 06:42:57
【问题描述】:
我在 while 循环中连续从终端发送 100 信号(SIGINT),因为我有该信号的注册信号处理程序,所以任何信号都来自辅助线程或主线程(因为信号处理由所有线程共享) 每次我发送信号时都应该打印“caught signal: ...”消息作为输出。但我观察到 100 次,一些随机的次数少了 95 次,打印了 84 次这条消息。有人可以解释一下为什么没有打印所有 100 个信号以及如何使用以下代码打印所有 100 个信号。
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
// Signal Handler for entire Process (shared by all threads)
void signalHandler(int param)
{
printf("Caught signal: %d ", param);
}
void *childFun(void *arg)
{
// Register signal Handler here
struct sigaction childpsa;
childpsa.sa_handler = signalHandler;
sigaction(SIGTERM, &childpsa, NULL);
sigaction(SIGHUP, &childpsa, NULL);
sigaction(SIGINT, &childpsa, NULL);
sigaction(SIGCONT, &childpsa, NULL);
sigaction(SIGTSTP, &childpsa, NULL);
while (1) {
// doSomething in while loop
}
}
int main(void)
{
// create a auxiliary thread here
pthread_t child_threadId;
int err = pthread_create(&child_threadId, NULL, &childFun, NULL);
while (1) {
// main program do something
}
return 1;
}
【问题讨论】:
-
请发布实际示例。由于行缓冲,您的代码不会向终端打印任何内容,并且在信号处理程序中使用
printf通常是无效的,因为它不是异步信号安全函数。 -
你好弗洛里安,。 signalHandler 被主线程和辅助线程并行调用,甚至这个函数也可以被同一个线程并行调用。我对吗 ?我如何跟踪/打印号码。这个函数有时会被所有线程整体调用。 ?绝对互斥锁将无法跟踪计数器。 (我也尝试过使用互斥锁,)。例如.. // 全局变量 int count = 0; pthread_mutex_t 互斥体; void signalHandler(int param) { pthread_mutex_lock(&mutex); count++ pthread_mutex_unlock(&mutex); }
-
另请注意,“正常”POSIX 信号和实时信号不同。请参阅信号 (7) 联机帮助页:'可以对多个实时信号实例进行排队。相比之下,如果一个标准信号的多个实例被传递而该信号当前被阻塞,那么只有一个实例被排队。不过,不确定这是否与您的情况相关。
-
@LawKumar,您可以使用原子来计算信号,并使用
write(异步信号安全函数)写入标准输出。
标签: linux multithreading pthreads signals signal-handling