问题标签 [libev]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 仅发送了几百个字节后,send() 以 EAGAIN 失败
这发生在 Ubuntu 12.04 上。相同的代码在 OSX 上运行良好。
在下面的日志中,您可以看到 SO_SNDBUF 是 20440,并且在 EAGAIN 失败之前,有几个 send()s 成功。
启用的唯一套接字选项是 TCP_NODELAY 和 O_NONBLOCK。这里可能是什么问题?
有问题的代码:
c - How to use libev for one event, waiting two sockets by two ev_io and ev_watch?
Now I'm writing a proxy server for a specify true server.
The architecture of the system can be represent by the graph below:
(I actually use multi-threads to handle all clients.)
'client A' ←––––– –––––→ 'proxy server' ←––––– –––––→ 'true Server'
I use "libev.h" to implement it, so one event need to listen two socket.
I find some example like:
This only for one io event.
If I want to wait two io_ev then it didn't work... like this below:
(I also try some different way but all failed.)
How to use libev in multi-task?
How to use libev for one event, waiting two sockets by two ev_io and ev_watch?
c - 为什么 syslog.h 在我的 C 程序中跳过日志消息?
libev
我有一个由事件循环组成的 C 程序。对于其中一位观察者,有一个内部循环导致 100 多条日志消息(每条约 200 个字符长)。由于某种原因,只有三分之一的消息进入日志文件。程序不退出。我可以通过数据看出观察者成功完成了内部循环,它不会默默地失败。
作为一个有趣的转折,如果我printf
在每个 syslog 调用之后插入一条语句,所有日志消息都可以将其写入日志文件。
如何解决这种奇怪的行为?当然,我希望所有 syslog 调用都会在日志文件中产生等效的条目。
我不能随意给出示例代码,但所有调用都是完全普通的 syslog 调用。在程序的其他地方,它们工作正常。
如果重要的话,我通过 OSX 终端中的 ssh 在 OSX 10.7.5 的 VirtualBox VM 中使用 Debian 7 (gcc 4.7.2-5)。
c - 如何在 mqueue 中使用 Libev io
如何将 ev_io 与 mqueue 一起使用?我正在尝试做以下没有运气的事情。
我能够得到计时器回调,但是在向队列发送消息时永远不会调用 io 回调。是否可以将 POSIX mqueue 与 libev 一起使用?
c - ev_loop() 导致 valgrind 错误 - 地址就在堆栈 ptr 下方
我正在做一个在 C 中实现 IRC 守护进程的项目。这仍处于非常早期的开发阶段,它现在所做的只是在主进程上接受新连接,并且对于每个新连接,它都会创建一个线程. 来自任何客户端的每条消息都会广播到所有其他连接的客户端。
我正在使用 libev 的回调机制,以便线程不会在套接字读取时阻塞。每个线程都使用自己独立的事件循环。这是我的一部分main()
功能:
我不是 libev 专家。我一直在阅读 libev 的文档和示例程序。此代码完全按预期工作,但是当我通过 valgrind 运行它时,我收到此错误:
第 71 行是这条指令:
在我启动程序后立即出现错误,没有连接客户端。只是我打电话的事实ev_loop
导致了这个错误。
我不知道如何解决它。到目前为止,我编写的代码将成为 IRC 服务器的核心,我想绝对确定不存在任何错误。我想要一个干净的 valgrind 输出。
有什么建议么?
更新:我编译并执行了他们的示例程序(http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#EXAMPLE_PROGRAM),valgrind报告了同样的错误。我猜这是 中的一些错误libev
,或者示例未正确编码。我还阅读了他们关于 valgrind 的部分 - http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#VALGRIND - 但没有发现任何特别之处。我想我会试试他们的邮件列表。
php - 对象在引用之间暂时清空
我正在开发一个非常小的库来跨 PHP 进程进行异步调用,并且在引用对象(和数组 - 无论引用对象还是数组时都会发生同样的问题)方面遇到一些奇怪的行为。最终结果是对象和数组暂时显示为空,我试图找出发生这种情况的原因。
下图显示了从父进程生成 3 个子进程的脚本跟踪。所有输出都来自父进程(没有任何内容通过子进程泄漏到终端)。父进程向子进程发出一系列请求,并通过一对 FIFO 管道接收响应:
- 蓝色行表示父级成功发送和接收响应的位置。
- 红行表示父级成功发送和接收响应的位置,但在收到响应后,父级中包含 RPC 表示的对象神秘地“空”,因此应该与该 RPC 响应关联的操作可以“ t 被调用,因为它不能被引用。
- 在每个成功或失败之前显示一个金色行,显示持有所有等待响应的 RPC 的对象的状态。该行包含对象 ID(来自对象的 var_dump 抓取)和它拥有的键(这是等待子响应的每个 RPC 的 ID)。
问题说明如下:
在每个绿色环中,您可以看到我们引用了相同的对象,因为这是 PHP 提供的内部 ID 引用。在带有绿色环的第一行中,该对象具有它应具有的所有属性。
在每个红色环中是“失败”的 RPC 的 ID,因为在带有绿色环的第二行中,该对象神秘地清空了。
在这个过程的后期,在第三排的绿色环中,这个物体神奇地又恢复了它的所有属性。
笔记:
- 这完全是随机发生的。
- 使用数组时也会发生同样的情况(我最初使用数组而不是对象并尝试使用对象来查看它是否可以解决此问题)。
multithreading - 使用 libev 的多线程套接字服务器
我正在实现一个套接字服务器。所有客户端(最多 10k)都应该保持连接。
这是我目前的设计:
- 主线程创建一个事件循环(默认使用 epoll)和一个用于接受客户端的观察者。
- 接受回调
- 接受 fd 并将其设置为非阻塞模式。
- 为 fd 添加监视程序以监视读取事件。
- 读取回调
- 读取数据并将任务添加到线程池以发送响应。
将读取部分移动到线程池是否可以,或者任何其他更好的主意?谢谢。
sockets - 如何让应用程序进程等到套接字有数据要使用 libevent bufferevents 读取?
我第一次使用 libevent,并且在尝试让我的应用程序在调用读取回调之前不运行时遇到了问题。我也在使用缓冲事件。本质上,我正在尝试避免主应用程序循环中的睡眠,而是让操作系统在有数据要从套接字读取时唤醒进程(通过 libevent)。有人知道怎么做吗?我在 libevent 的 alpha 版本中发现,您可以将基本事件循环设置为 EVLOOP_NO_EXIT_ON_EMPTY,但是通过查看 libevent 代码,我相信它只会用完我的整个过程。我也读过这个质疑将套接字设置为在 Windows 上阻塞是一个坏主意,这就是为什么我也没有将其作为解决方案的原因。我也会用 libuv 和 libev 标记它,因为它们相似并且可能有助于我的解决方案。
c - LibEV如何正确缓冲?
如何正确创建写缓冲区?目前,我正在使用已分配缓冲区的链接列表,但大多数写入只有几个字节。您对创建高效的写缓冲区有什么建议?
perl - 将合成文件句柄与 EV (perl) 一起使用
我有一个由此创建的文件句柄对象(为清楚起见,稍作编辑):
我想将它与AnyEvent
. 它与 . 一起工作正常,AnyEvent::Impl::Perl
但与
AnyEvent::Impl::EV
. 我认为我已经从以下位置追踪到这种方法EV
:
我认为它没有通过SvTYPE (fh) == SVt_PVGV
测试。使用Devel::Peek
's Dump() 方法我得到:
任何有关我如何调整我的句柄的创建以使其可以通过此测试的帮助将不胜感激。