首页 > 解决方案 > 在等待时中断 pselect - 多线程

问题描述

因此,根据手册,pselect可以有一个超时参数,如果没有文件描述符发生变化,它将等待。此外,它还可以选择被信号中断:

sigemptyset(&emptyset);    /* Signal mask to use during pselect() */
res = pselect(0, NULL, NULL, NULL, NULL, &emptyset);
if (errno == EINTR) printf("Interrupted by signal\n");

然而,从手册中哪些信号能够中断 pselect并不明显?

如果我有线程(生产者和消费者),并且每个(消费者)线程都使用 pselect,有没有办法只从另一个(生产者)线程中断一个(消费者)线程?

标签: cmultithreadingsignals

解决方案


我认为这个问题在https://lwn.net/Articles/176911/中进行了分析

出于这个原因,POSIX.1g 委员会设计了一个增强版本 select(),称为pselect(). select()和 之间的主要区别在于pselect()后一个调用有一个信号掩码(sigset_t)作为附加参数:

int pselect(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);

pselect使用sigmask参数来配置哪些信号可以中断它

当前被阻塞的信号集合称为信号掩码。每个进程都有自己的信号掩码。当您创建一个新进程时(请参阅创建进程),它会继承其父进程的掩码。通过修改信号掩码,您可以完全灵活地阻止或取消阻止信号。

来源:https ://www.gnu.org/software/libc/manual/html_node/Process-Signal-Mask.html

https://linux.die.net/man/2/pselect

https://www.linuxprogrammingblog.com/code-examples/using-pselect-to-avoid-a-signal-race

由于您的第二个问题,进程同步有多种算法,请参见https://www.geeksforgeeks.org/introduction-of-process-synchronization/以及此页面上的链接或https://en.wikipedia.org/ wiki/Sleeping_barber_problem和相关页面。所以基本上信号只是 linux 中 IPC 的一种路径,cf IPC using Signals on linux


推荐阅读