c - 在等待时中断 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,有没有办法只从另一个(生产者)线程中断一个(消费者)线程?
解决方案
我认为这个问题在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
推荐阅读
- angular - Angular4+主题不断循环到回调函数
- php - 如何从数组中获取每个 question_id 和答案?
- java - maven-jetty-plugin 的 Maven 传递依赖问题
- java - 如何将 JavaFX javafx.scene.shape.Path 的实例保存到文件中
- python - 使用 CherryPy 设置代码覆盖率?
- linux - 是否有任何约定可以可持续地将不同软件的位放在一个文件中
- css - 在 Bootstrap 4 的表格单元格中对齐两个按钮(其中一个在表单中)
- ruby - Ruby - 读取文件并打印行号
- python - 如何添加距离方法
- azure-functions - v2 函数在运行时不再看到函数