取消阻止 `poll`?
Cancel blocking `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 就会return,你检查这个保留的文件描述符。如果有数据,说明有新的文件描述符要添加。
您可以向进程发送一个信号,使 poll()
变为 return -1
并将 errno
设置为 EINTR
。该信号显然不应导致进程终止,因此您可能需要获取一些 sigaction()
或 sigprocmask()
。但是,在调用其中任何一个和 poll()
之间收到的任何信号都可能丢失,类似于 select()/pselect()
。出于这个原因,某些系统可能会为 poll()
提供额外的非标准替代品,例如 ppoll()
,其中包括 sigset_t
以自动更改信号配置。
所以,我已经 运行 解决了这个问题,我有很多线程在不同的文件描述符上调用轮询。当我想添加一个新的时,我需要取消其中一个民意调查,添加一个新的,然后继续。仅此一项听起来很糟糕,但我什至不知道该怎么做。
一些相关代码:
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 就会return,你检查这个保留的文件描述符。如果有数据,说明有新的文件描述符要添加。
您可以向进程发送一个信号,使 poll()
变为 return -1
并将 errno
设置为 EINTR
。该信号显然不应导致进程终止,因此您可能需要获取一些 sigaction()
或 sigprocmask()
。但是,在调用其中任何一个和 poll()
之间收到的任何信号都可能丢失,类似于 select()/pselect()
。出于这个原因,某些系统可能会为 poll()
提供额外的非标准替代品,例如 ppoll()
,其中包括 sigset_t
以自动更改信号配置。