如何在 Linux 中使用 poll C 函数监视命名管道?
我正在尝试编写一个程序,在其中我应该观察一些命名管道的末端 使用轮询功能。 我有一个 for 循环来检查每个管道,每当 poll 返回 > 0 时,我知道当管道从另一端的过程关闭时,我将得到 POLLHUP 或 POLLIN | POLLHUP 在 pollfd 结构的 revents 字段中。
我的问题是:当一个管道确实关闭并向我返回 POLLHUP 时,下一个循环会发生什么?它是否会在下一个循环和任何后续循环中一次又一次地返回 POLLHUP,或者 poll 函数是否会在第一个 POLLHUP 之后忽略它?
I am trying to write a program where i am supposed to watch the ends of some named pipes
using poll function.
I have a for loop to check every pipe whenever poll returns >0 and i know that when a pipe gets closed from the procedure at the other end, i will get POLLHUP or POLLIN | POLLHUP in the revents field of the pollfd struct.
My question is: when one pipe does indeed get closed and returns POLLHUP to me, what will happen on the next loop? Is it going to return POLLHUP again and again in the next and any subsequent loop or is poll function going to ignore it after the first POLLHUP?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
最小示例
来源如下。用法:
在另一个 shell 上:
输出:
请注意 poll 如何等待读取而不循环。
更酷的示例:
0
每隔一秒写入一次,1
每两秒写入一次,这显示了poll()
如何同时处理两个输入,而不互相拖延。来源:
poll.c
编译:
在 Ubuntu 14.04 中测试。
GitHub 上游。
回答原来的问题:
删除这些行:
您将看到它在
POLLHUP
上永远循环。删除只是:
你会得到
POLLNVAL
相反,因为它尝试使用封闭的 fd: 如何处理Linux套接字revents POLLERR、POLLHUP和POLLNVAL?Minimal example
Source below. Usage:
On another shell:
Output:
So notice how
poll
waits for the reads without looping.Cooler example:
0
gets written every one second, and1
every two seconds, which shows howpoll()
is dealing with both inputs concurrently, without stalling each other.Source:
poll.c
Compile with:
Tested in Ubuntu 14.04.
GitHub upstream.
To answer the original question:
Remove the lines:
and you will see that it loops forever over
POLLHUP
.Remove just:
and you get
POLLNVAL
instead, as it tries to use a closed fd: How to handle the Linux socket revents POLLERR, POLLHUP and POLLNVAL?它将继续在 revents 中设置 POLLHUP。
另请参阅 http://linux.die.net/man/3/poll参考。
It will continue to set POLLHUP in revents.
Also, see http://linux.die.net/man/3/poll for reference.