取消阻塞' poll '

Cancel blocking `poll`?

本文关键字:poll 取消      更新时间:2023-10-16

所以,我遇到了这个问题,我有许多线程在不同的文件描述符上调用poll。当我想添加一个新的民意调查时,我需要取消其中一个民意调查,添加一个新的,然后继续。这听起来很糟糕,但我甚至不知道该怎么做。

相关代码:

struct pollfd fds[size];
for(int i = 0;i<size;i++) {
    struct pollfd fd;
    fd.fd = body[i];
    fd.events = POLLIN;
    fd.revents = 0;
    fds[i] = fd;
}
if(poll(&fds[0], (nfds_t)size, -1) < 0) return NULL;

(我也通过JNI使用)。

我想我可以在poll上设置一个非常低的延迟,然后一次又一次地调用它,但我认为这会开始破坏目的。

您可以这样做:打开一个套接字或管道,当有一个新的文件描述符添加到轮询集时,另一个线程发送一些数据。因此,poll将返回,您检查此保留的文件描述符。如果有数据,这意味着有一个新的文件描述符要添加。

您可以向进程发送一个信号,使poll()返回-1,并将errno设置为EINTR。该信号显然不会导致进程终止,因此您可能需要获得一些sigaction()sigprocmask()。然而,在呼叫它们中的任何一个和poll()之间接收到的任何信号都可能丢失,类似于select()/pselect()。由于这个原因,一些系统可能会提供额外的,非标准的poll()替代品,如ppoll(),其中包括一个sigset_t来自动改变信号配置。