因此,我遇到了这个问题,在这个问题上,有许多线程在不同的文件描述符上调用轮询。当我想要添加一个新的,我需要取消其中一个投票,添加一个新的,并继续。这听起来很糟糕,但我连怎么做都看不出来。
一些相关守则:
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使用这个)。
我想我可以在投票中设置一个非常小的延迟,然后一遍又一遍地重复,但我认为这将开始达到这个目的。
发布于 2015-08-09 23:32:24
您可以向进程发送信号,导致poll()返回-1并将errno设置为EINTR。信号显然不会导致进程终止,因此您可能需要获得一些sigaction()或sigprocmask()。但是,在呼叫这些信号和poll()之间接收到的任何信号都可能丢失,类似于select()/pselect()。由于这个原因,一些系统可能会为poll()提供额外的、非标准的替换,比如ppoll(),其中包括一个sigset_t来原子地更改信号处理。
发布于 2015-08-09 23:20:28
您可以这样做:打开一个套接字或管道,当有一个新的文件描述符添加到轮询集时,另一个线程发送一些数据。因此,轮询将返回,您将检查这个保留文件描述符。如果有数据,这意味着要添加一个新的文件描述符。
https://stackoverflow.com/questions/31909718
复制相似问题