我想知道在轮询设置这些位时应该怎么做?关闭套接字,忽略它或什么?
我打开一个带有非阻塞标志的命名管道(由mkfifo创建的fifo)(打开(... O_NONBLOCK))然后开始轮询(poll(...)).到现在为止还挺好.然后从命令行我做了几个
echo 123 > /tmp/fifo
Run Code Online (Sandbox Code Playgroud)
它们都按预期读出管道(至少我希望它们应该如何正常工作).
我的问题是,在第一次回显之后,POLLHUP被设置并且它被卡住,轮询立即从该点返回.
如何清除 /摆脱POLLHUP?
它开始让我发疯:(
是的,管道的另一端被关闭(之前打开),所以它变成了一半关闭,但我的结束仍然是开放和活着的,我喜欢这样.它还没死,我仍然可以通过管道收到新的回声,它只是民意调查POLLHUP的河流(我在事件中首先没有要求,但民意调查只能标记它们[人民调查:" revents可以包括在事件中指定的任何一个,或者值POLLERR,POLLHUP "] 之一,并且因此而无用.
显然我无法将fd从集合中删除,因为我仍然希望收到关于它的新数据的通知.
我不想关闭它,因为它不是一次性使用管道,我喜欢重复使用同样的东西而不是把它们扔掉......除此之外我还没有管道名称,我只有文件描述符(从fd获取文件名看起来像个婊子......我也用Google搜索...)
我仍然相信Linux的强大功能,并且必须有更好的(更高性能/竞争条件安全)方式来实现这一点.
这是我读过的,但没有帮助解决问题.
在我的绝望中,我尝试做这样的事情(这没有帮助):
int newfd = dup(fds[i].fd);
close(fds[i].fd);
dup2(newfd, fds[i].fd);
close(newfd);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我做错了什么吗?
(我总是可以回到试图定期读取所有管道(实际上是有效的),现在这不是延迟关键,但我不知道如果它是......我会怎么做?)
下面是一些代码重现我的问题(这不是我想要建立的生产代码,有明显超过1管,我想轮询...)
#include <stdio.h>
#include <sys/types.h> // mkfifo
#include <sys/stat.h> // mkfifo
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <poll.h>
int …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关 C 编程中的 poll 并构建了poll(2) 手册页中给出的应用程序。
这是示例:
#include<stdio.h>
#include <stropts.h>
#include <poll.h>
#include <fcntl.h>
int main() {
struct pollfd fds[2];
int timeout_msecs = -1;
int ret;
int i;
/* Open STREAMS device. */
fds[0].fd = open("/home/jeshwanth/mywork/poll/dev0", O_RDONLY);
fds[1].fd = open("/home/jeshwanth/mywork/poll/dev1", O_RDONLY);
fds[0].events = POLLOUT | POLLWRBAND;
fds[1].events = POLLOUT | POLLWRBAND;
while (1) {
ret = poll(fds, 2, timeout_msecs);
if (ret > 0) {
/* An event on one of the fds has occurred. */
for (i = …Run Code Online (Sandbox Code Playgroud)