- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我打开一个命名管道(由mkfifo创建的fifo)带有非阻塞标志(打开(...O_NONBLOCK))然后开始投票(投票(...))。到目前为止,一切都很好。然后从命令行我做了几个
echo 123 > /tmp/fifo
它们都按预期从管道中读出(至少我认为它们应该正常工作)。
我的问题是,在第一个 echo 之后,设置了 POLLHUP 并且卡住了,poll 立即返回 从那个点开始。
如何清除/摆脱POLLHUP?
它开始让我发疯:(
是的,管道的另一端关闭了(在之前打开之后),所以它变成了半关闭状态,但我的那一端仍然是敞开的,而且还活着,我喜欢这样。它没有死,我仍然可以通过管道接收到新的回声,它只是 poll 呼唤着 POLLHUP 的河流(我一开始甚至没有在事件中请求过,但是 poll 无论如何都可以标记它们 [man poll: "revents 可以包括事件中指定的任何事件,或值 POLLERR、POLLHUP 之一"]),因此几乎没有用。
显然我不能从集合中取出那个 fd,因为我仍然想收到关于它的新数据的通知。
我不想关闭它,因为它不是一次使用的管道,我喜欢重复使用相同的东西而不是扔掉它们......除其他外,我不再有管道名称,我只有文件描述符(从 fd 获取文件名似乎是个婊子……我也用谷歌搜索了……)
我仍然相信 Linux 的强大功能,并且必须有更好的(性能更高效/竞争条件安全)方法来做到这一点。
这是我看过的,但对解决问题没有帮助。
在绝望中,我什至尝试过做这样的事情(但没有帮助):
int newfd = dup(fds[i].fd);
close(fds[i].fd);
dup2(newfd, fds[i].fd);
close(newfd);
有什么想法吗?我做错了什么吗?
(我总是可以回到只是尝试定期读取所有管道(这确实有效),现在这不是延迟关键,但我不知道如果它是...我会怎么做......)
这里有一些代码可以重现我的问题(这不是我要构建的生产代码,显然我想轮询的管道不止 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 main(int argc, char **argv) {
char* pipename = "/tmp/fifo";
mkfifo(pipename, S_IWUSR | S_IRUSR | S_IRGRP);
int fd = open(pipename, O_RDONLY | O_NONBLOCK); /// O_ASYNC, O_SYNC
struct pollfd fds[1];
fds[0].fd = fd;
fds[0].events = POLLIN;
fds[0].revents = 0;
while (1) {
int res = poll(fds, 1, 1000);
if (res<0) { perror("poll"); return 1; }
if (res==0) { printf(".\n"); continue; }
printf("Poll [%d]: 0x%04x on %d\n", 0, fds[0].revents, fds[0].fd);
char buff[512];
int count = (int)read(fds[0].fd, buff, (size_t)(sizeof(buff)-1));
if (count>=0) {
buff[count] = 0;
printf("Pipe read %d bytes: '%s'\n", count, buff);
usleep(1000*100); /// cpu protector sleep for POLLHUP :)
}
}
return 0;
}
注意事项:
我在 Linux (lubuntu) 平台 (x64) 上使用 gcc (4.6.3)。但最后我想为嵌入式目标交叉编译它。
我敢肯定我一定是错过了一些和平的信息,所以请问...
解决方案/解决方法:
O_RDWR
而不是 O_RDONLY
打开管道。这样你就不会得到恒定的 POLLHUP
-s(当然你不会得到任何女巫可能是个问题)。此外,读者将需要对管道的写入权限(在某些情况下您可能没有权限)。最佳答案
因为管道只提供一个单向 channel (而不是像套接字那样为每个客户端提供单独的双向 channel ),所以通常在只有一个进程需要将数据发送到另一个进程时使用它们。当编写者关闭管道时,POLLHUP
(挂起)告诉读者管道已关闭,它可以完成处理并终止。
可以使用具有多个写入器的管道,但如果消息可能大于 PIPE_BUF
或 512 字节,则需要小心。否则,因为它只是一个单一的 channel ,来自多个同时写入的作者的消息可能会交错。同样因为它是一个单一的 channel ,你将无法判断一条长消息是来自一个客户端的单次写入还是来自多个客户端的多次写入,除非你有一些约定,比如每条客户端消息一行(以换行符终止) .
POLLHUP
表示最后一个写入者关闭了管道,并一直持续到另一个进程打开管道进行写入或被所有读者关闭。如果您不希望这样,请使用 O_RDWR
而不是 O_RDONLY
打开管道,这样管道将保持打开状态。这是可行的,因为只要您打开它,总会有一个编写器(您的程序)。
关于c - 命名管道上的 Poll() 会不断并立即返回 POLLHUP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22021253/
我原以为 epoll 应该比 poll 快,但是当我做下面的实验时,结果发现它更慢。 首先,我设置了 1 个连接了 10 个客户端套接字的服务器套接字。 import socket server =
当我尝试在代码编辑器中粘贴时他剪掉了我的标签。它不允许它..我不明白,我什么都试过了。 有人可以帮助我.. 给我> extended_valid_elements: 'poll[poll-id
我无法唤醒被 poll.poll() 函数阻塞的线程。有人可以帮我吗? 最佳答案 处理这个问题的方法是在传递给 poll() 的描述符列表中包含一个额外的文件描述符。对于该描述符,等待读取准备就绪。让
在下面的 poll() 方法中,我的 IDE 提示它返回 JobSet。工具提示显示: my.package.JobSetQueue 中的 poll() 与 java.util.concurrent.
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
在每个 youtube 教程中,我都看到人们只是将“app_name”添加到 INSTALLED_APPS 列表中。 昨天我开始了官方 Django 教程,他们建议使用“app_name.apps.A
我正在查看 LinkedList 中的 poll() 和 unlinkFirst() 代码,但我似乎找不到如何实现如果 LinkedList 中存在 null 项,它可以防止返回 null。 poll
为什么当我尝试轮询时,我在 ajax 中看到此错误消息“(!)注意: undefined index :在 D:\wamp\www\poll\poll.php 第 6 行中进行轮询”。我有两个文件 1
我使用 python 的 cProfile 模块分析了我的 python 代码并得到了以下结果: ncalls tottime percall cumtime percall filen
我尝试通过 websocket 和轮询运行我的 socket.io 程序,它们都有效。但是,当尝试运行 xhr-polling 时,它会超时。这可能是什么原因造成的? 对于这个程序,我使用的是 soc
我正在实现自己的自定义组件,我发现我需要为消费者提供两个用例: 第一个尝试经常获取 N 条可用消息(轮询消费者) 第二个是订阅者消费者,它会在消息可用时获取消息。 我的主要问题是是否可以实现这两种类型
测试环境:Ubuntu 12.04描述:我做了以下 # `sudo truncate -s 0 /var/log/syslog` # logger "helloworld". # `cat /var/
我正在使用(很棒的)mrjob Yelp 的库在 Amazon 的 Elastic Map Reduce 中运行我的 python 程序。它依赖于标准 python 库中的子进程。在我运行 pytho
这直接来自民意调查教程,我是编程新手,正在学习 Python 和 Django,这对我来说看起来很陌生。这是 JavaScript 吗?我还需要学习什么语言才能学习 Django 吗? 民意调查/模板
我试图了解在 kafka 消费者中处理需要更长时间处理的记录的更好选择是什么?我进行了一些测试来理解这一点,并观察到我们可以通过修改 max.poll.records 来控制这一点。或 max.pol
我正在尝试创建我的 Django 项目/网站的“投票”部分,教程 (https://docs.djangoproject.com/en/1.8/intro/tutorial01/) 说在我们“激活”模
我有一个应用程序,其工作原理如下:Linux 机器生成 28 种不同类型的给客户的信件。信件必须以 .docx(Microsoft Word 格式)发送。秘书维护 MS Word 模板,必要时会自动使
我目前正在尝试让 FileSystemWatcher 工作,如 this question 中所述.在我的研究过程中,我在这个网站上发现了很多描述这个类(class)不可靠的答案和评论。相反,在某些地
我正在寻找 kafka 来实现低延迟消息队列,并且我一直在阅读有关消费者长轮询的信息。但是,没有关于如何实际使用长轮询或需要设置哪些选项才能启用它的示例。如何使用 kafka java api 启用长
用户首次登录时的通知,没那么难,只需要扫描数据库,我可以处理。然而,当 friend 在个人资料 X 上发送请求或评论时,会发送通知,并且几乎立即在另一端收到通知,即使用户 X 没有提出任何请求。是投
我是一名优秀的程序员,十分优秀!