首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消阻塞` `poll`‘?

取消阻塞` `poll`‘?
EN

Stack Overflow用户
提问于 2015-08-09 23:13:00
回答 2查看 1.8K关注 0票数 1

因此,我遇到了这个问题,在这个问题上,有许多线程在不同的文件描述符上调用轮询。当我想要添加一个新的,我需要取消其中一个投票,添加一个新的,并继续。这听起来很糟糕,但我连怎么做都看不出来。

一些相关守则:

代码语言:javascript
复制
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使用这个)。

我想我可以在投票中设置一个非常小的延迟,然后一遍又一遍地重复,但我认为这将开始达到这个目的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-09 23:32:24

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

票数 3
EN

Stack Overflow用户

发布于 2015-08-09 23:20:28

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31909718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档