因此,我遇到了这个问题,我有很多线程在不同的文件描述符上调用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()返回-1并将errno设置为EINTR。该信号显然不应导致进程终止,因此您可能需要获取一些sigaction()sigprocmask()。但是,在调用任何一个和poll()之间收到的任何信号都可能丢失,类似于select()/pselect()。因此,某些系统可能会为poll()提供其他非标准替代品,例如ppoll(),其中包括sigset_t来自动改变信号的布置。

10-08 07:37