问题标签 [kqueue]

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.

0 投票
1 回答
2232 浏览

python - 具有多个事件的 Python kqueue

我正在尝试编写一个小程序来发送和接收 UDP 流量并通过 HTTP 接口接收命令。HTTP 服务器合二为一multiprocessing.Process;UDP服务器位于另一个。这两个进程通过 python 进行通信multiprocessing.Pipe。我在下面附上了完整的代码。

我有2个相关问题:

  • 如何在 python 中使用 kqueue 处理多个文件描述符/kevents(套接字文件描述符有效,管道文件描述符似乎不 - 不确定我使用的管道是否等同于文件)?
  • 如何区分这些 kevents,以便在读取管道和套接字时应用不同的功能?

我希望我的 UDP 服务器执行的伪代码:

现在,UDP 服务器识别套接字事件并正确读取套接字。但是,当我将管道 kevent 添加到 kqueue 时,程序会不停地吐出管道事件。我将过滤器设置为已写入管道,但我假设 1)这是错误的 2)更具体地说,pythonmultiprocessing.Pipe就像一个常规的 unix 管道,需要以不同的方式处理。


主文件

server.py (UDP)

handler.py(HTTP 接口)


更新:

我用 select 重写了服务器监听方法。对于一个不会使用超过 3 或 4 个 fds 的慢速 Python 原型,速度无论如何都无关紧要。Kqueue 将成为另一天的主题。

def listen (self, ipaddress, port): print "starting!"

0 投票
1 回答
1168 浏览

unix - AIX 机制中是否有 EPOLL/KQUEUE 或它们的等价物?

AIX 机制中是否有 EPOLL(Linux2.6)/KQUEUE(FreeBSD)/IO Completion Port(Windows) 或它们的等价物?

什么样的机制最适合 AIX 上的 AIO 来处理大量网络连接?

例如,根据 Benchmarks,KQUEUE / EPOLL 机制比 SELECT 快得多。 http://libevent.org/

0 投票
2 回答
1917 浏览

c - 在哪里为 SIGPIPE 声明 sig_t 信号

我目前正在使用 kqueue 来处理 Serverprocess 中每个线程的多个客户端,因此我不希望在 Signal SIGPIPE 出现时终止线程,我只想从 kqueue 中删除相应的 socked id。所以我的问题是:有没有办法在 Signalhandle 中获取相应的 socketid 并将其解析回进程以将其从事件 kqueue 中删除,或者我是否可以让 SIG_IGN SIGPIPE 并通过从 -1 返回来处理删除发送?它会在超时时间后返回 -1 值还是立即返回 send -1?

最后,如果信号忽略是我的解决方案: id 必须在哪里放置声明

它必须在主要功能中吗?还是在相应线程的开头?还是作为全局元素?

0 投票
2 回答
712 浏览

c - How to notify an abnormal client termination to server?

As the Title already says im looking for a way, to get notified when a client closes his Session unnormal.

I'm using the freeBSD OS. The server is running with Xamount threads (depending on CPUcore amount). So I'm not forking, and there isn't a own process for each client.

That's why sending an deathpackage all time_t seconds, to recive a SIGPIPE isn't an option for me. But i need to remove left clients from the kqueue, because otherwise after too many accept()'s my code will obviously run into memory troubles.

Is there a way, I can check without high performance loose per client, they are connected or not?

Or any event-notification, that would trigger if this happens? Or maybe is there a way of letting a programm send any signal to a port, even in abnormal termination case, before the Client process will exite?

0 投票
1 回答
364 浏览

python - 与 epoll 的 kqueue 取消注册功能类似的功能是什么?

Python Epoll 有一个名为 epoll.unregister 的函数,它从 epoll 对象中删除一个已注册的文件描述符。有谁知道Kqueue中与此类似的功能是什么。对于 kqueue,我只能找到如何删除事件。

0 投票
1 回答
678 浏览

c++ - 监视文件系统事件的平台无关方式

我目前正在开发一个 C++ 应用程序,它应该监视文件系统以在一组文件更改时重新索引它们。我目前正在使用 Linux 的 inotify 系统,但希望该应用程序尽可能广泛地移植到其他系统。

您知道至少可以在 Linux 和 Mac OSX 上运行的高级可移植文件系统监控库吗?(并且有 C 或 C++ 绑定?)

0 投票
1 回答
397 浏览

macos - MacOS X 中的衍生进程限制

我遇到了在 MacOS X Mountain Lion 下产生大量进程(200)的问题(尽管我确信这个问题不是特定于版本的)。我正在做的是启动进程(在我的测试中是 /bin/cat),它们的 STDIN、STDOUT 和 STDERR 连接到管道——管道的另一端是生成(父)进程。

父进程将数据写入进程的 STDIN,然后通过管道传送到 [/bin/cat] 子进程,子进程又将数据从 STDOUT 中吐出并由父进程读取。/bin/cat 仅用于测试。

我实际上是在使用 kqueue 在 STDIN 管道中有可用空间时收到通知。当 kqueue 通过 EVFILT_WRITE 事件通知您有可用空间时,该事件还会准确地告诉您可以写入多少字节而不会阻塞。

这一切都很好,我可以轻松地生成 100 个子 (/bin/cat) 进程,并且所有内容都流过管道而不会阻塞(整天)。但是,当我将进程数增加到 200 个时,当单个 kqueue 服务线程阻塞对一个 STDIN 管道的 write() 调用时,一切都停止了。该事件表示有 16384 个字节可用(基本上是一个空管道),但是当程序尝试将 16384 个字节准确写入管道时,无论如何 write() 都会阻塞。

最初我以为我遇到了最大值。打开文件问题,但我已经将打开文件的 ulimit 提升到 8192,所以这不是问题。我从一些谷歌搜索中发现,在 OS X 上,STDIN/STDOUT/STDERR 实际上不是“文件”(或“管道”),而是实际上是设备。当进程挂起时,在命令行上运行 lsof 也会挂起,并显示无法 stat() 文件系统的警告:

一旦我终止该进程, lsof 就会完成。这强化了 STDIN/OUT/ERR 实际上是设备的概念,我遇到了某种限制。

有谁知道我遇到了什么限制,例如可以创建的“设备”数量是否有限制?这可以以某种方式增加吗?

0 投票
1 回答
486 浏览

c - 如何用发送到线程的信号中断 kevent()?

我想用一个信号通知一个工作线程——它应该停止等待事件并检查一些全局条件。我epoll_pwait在 Linux 上使用,我想在 Mac OS 上做同样的事情。

但是kqueue(2)手册说:

EVFILT_SIGNAL ... 只有发送到进程而不是特定线程的信号才会触发过滤器。

如何克服这个限制?或者可能有另一种通知唯一线程等待的好方法kevent

0 投票
1 回答
687 浏览

ios - iOS 中的文件系统监视

我的 Documents 文件夹中有文件树。查看 Documents 文件夹及其所有子文件夹中的所有更改的最简单方法是什么?我已经阅读了有关 kqueue 的信息,但它似乎仅适用于文件夹本身(不适用于其子文件夹)。

0 投票
4 回答
505 浏览

linux - 什么构成“可读”(kqueue/epoll)

我知道,如果远程主机优雅地关闭连接,epoll将报告EPOLLIN,并调用readrecv不会阻塞,并将返回 0 字节(即流结束)。

但是,如果连接没有正常关闭,并且writeorsend操作失败,这是否会导致epoll随后返回EPOLLIN该套接字,从而产生相同/相似的流结束场景?

我试图找到有关此行为的文档,但没有成功,虽然我可以对其进行测试,但我对具有特定内核版本的特定发行版上会发生什么不感兴趣。