对于MacOS pthread,sigwait()不处理信号

时间:2019-02-06 21:03:05

标签: macos pthreads signals

运行以下命令时,sigwait()永远不会处理SIGUSR1信号。基本设置是:main产生两个pthread:一个是处理程序线程,一个是工作线程。主线程和两个派生线程均阻塞SIGUSR1。工人在两次延迟时间内将SIGUSR1举起两次。处理程序线程永远看不到它。

这是在MacOS上。从Xcode运行时,我插入了一个执行pro hand -p true -s false SIGUSR1的连续断点。如果我从命令行运行可执行文件,则会出现相同的输出。

为什么sigwait()看不到凸起的SIGUSR1?

以下是输出:

SigHandlerThread: Waiting: 30
Raise
Raise
Program ended with exit code: 0

代码如下:

//
// Signal Test
//
typedef void* (*ThreadRoutine) (void*);         // pthread_create

void workerRaise (int signum) {
  sleep (2);
  printf ("Raise\n");
  raise (signum);
}

void sigBlock (sigset_t *set, int signum) {
  sigemptyset(set);
  sigaddset(set, signum);
  pthread_sigmask(SIG_BLOCK, set, NULL);
}

void *sigHandlerThread (void *ignore) {
  int signal;

  sigset_t blockSignalSet;
  sigBlock(&blockSignalSet, SIGUSR1);

  printf ("SigHandlerThread: Waiting: %d\n", SIGUSR1);

  while (0 == sigwait(&blockSignalSet, &signal))
    printf ("SigHandlerThread: %d\n", signal);

  printf ("SigHandlerThread: Exit (0 != sigwait())\n");
  return NULL;
}

void *workerThread (void *ignore) {
  sigset_t blockSignalSet;
  sigBlock(&blockSignalSet, SIGUSR1);

  workerRaise(SIGUSR1);
  workerRaise(SIGUSR1);

  pthread_exit(NULL);
}

// Called from main.
void testSignal () {
  sigset_t blockSignalSet;
  sigBlock(&blockSignalSet, SIGUSR1);

  pthread_t worker, handler;
  pthread_create (&handler, NULL, (ThreadRoutine) sigHandlerThread, NULL);
  pthread_create (&worker,  NULL, (ThreadRoutine) workerThread, NULL);
  pthread_join(worker, NULL);
  sleep (2);
}

1 个答案:

答案 0 :(得分:1)

raise()函数发送专门针对调用线程的信号-进程中的其他线程将不会接收到该信号。 raise(signum)等同于pthread_kill(pthread_self(), signum)

您需要的是过程控制信号,而不是线程控制信号。代替使用raise(signum),而使用kill(getpid(), signum)