我有一个使用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 …