【问题标题】:Sometimes signal not received to signal handler有时信号未收到信号处理程序
【发布时间】: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


【解决方案1】:

大多数Linux实现不支持信号排队,所以如果一个进程接收到相同的信号'x'次,它只会被调用一次。

你也不应该在信号处理程序中使用像 printf 这样的函数(而是使用一些计数器(一个整数),每次调用都会递增)

除外

POSIX.1 允许系统传递信号一次或多次,以防在进程解除阻塞信号之前多次生成阻塞信号。如果系统不止一次传递信号,我们说信号是排队的。然而,大多数 UNIX 系统不会对信号进行排队,除非它们支持对 POSIX.1 的实时扩展。相反,UNIX 内核只传递信号一次。 [p336]

https://notes.shichao.io/apue/ch10/#reliable-signal-terminology-and-semantics

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多