小编alp*_*332的帖子

为什么 sem_wait 在中断时不会解除阻塞(并返回 -1)?

我有一个使用sem_wait. 该POSIX规范说:

sem_wait()功能可通过信号传送中断。

此外,在关于错误的部分中,它说:

[EINTR] - 一个信号中断了这个功能。

但是,在我的程序中,发送信号不会解除调用的阻塞(并-1按照规范中的指示返回)。

一个最小的例子可以在下面找到。该程序sem_wait在发送信号后挂起并且永远不会解除阻塞。

#include <semaphore.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

sem_t sem;

void sighandler(int sig) {
  printf("Inside sighandler\n");
}

void *thread_listen(void *arg) {
  signal(SIGUSR1, &sighandler);
  printf("sem_wait = %d\n", sem_wait(&sem));
  return NULL;
}

int main(void) {

  pthread_t thread;

  sem_init(&sem, 0, 0); 

  pthread_create(&thread, NULL, &thread_listen, NULL);

  sleep(1);
  raise(SIGUSR1);

  pthread_join(thread, NULL);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

程序输出Inside sighandler然后挂起。

还有另外一个问题在这里关于这一点,但它并没有真正提供任何清晰。

我误解了规范所说的内容吗?仅供参考,我的电脑使用 Ubuntu GLIBC …

c semaphore pthreads interrupt interrupt-handling

9
推荐指数
2
解决办法
456
查看次数

标签 统计

c ×1

interrupt ×1

interrupt-handling ×1

pthreads ×1

semaphore ×1