2017-06-02 57 views
0

我发现poll()函数对多路复用管道和套接字非常有用,但是我想扩展它并轮询我自己的介质,就像在实现我自己的管道中一样,并且使用poll对于POLLIN和POLLOUT事件,我该怎么做?为轮询函数做一个描述符

int self = GenerateMyPipe(); 
int sock = socket(...); 
struct pollfd fd[2]; 
//Init Pollfd and Stuff... 
poll(fd, 2, -1); 
... 

感谢您的阅读...

+0

您使用的是Linux吗?参见[eventfd()](http://man7.org/linux/man-pages/man2/eventfd.2.html) – Barmar

回答

0

有这个没有标准的POSIX的方法,但在Linux上,你可以使用eventfd()

eventfd()创建一个可以用作 “eventfd对象”事件 用户空间应用程序的等待/通知机制,以及内核 通知用户空间应用程序的事件。该对象包含 内核维护的无符号64位整数(uint64_t)计数器。该计数器初始值为 参数initval中指定的值。
...
返回文件描述符支持poll(2)(和类似 epoll(7))和select(2),如下所示:

  • 的文件描述符是可读的(在select(2)readfds 参数;所述poll(2)POLLIN标志)如果该计数器具有大于0的 值。

  • 该文件描述或可写(select(2)writefds 参数; poll(2)POLLOUT标志)如果有可能 写入一个至少为“1”的值而没有阻塞。

您通过写描述符改变计数器。