1

在通过 FFI 使用 C 库的晶体程序中,我有从文件描述符读取时阻塞的代码。在该文件描述符有一些数据之前,我如何才能产生光纤?

例如,当前代码类似于:

f = File.open("/some/socket/or/pipe/like/object")
Iterator.of do
  data = Pointer(LibFoo::Data).malloc
  # yield_until_fd_has_data f.fd
  LibFoo.read f.fd, data
  data.value
end

WhereLibFoo.read阻塞,直到 socket/pipe-like 对象有一些数据。我用什么代替yield_until_fd_has_data

4

2 回答 2

0

到目前为止,我发现的一种方法是子类IO::FileDescriptor化并覆盖该resume_read方法。然后使用Crystal::EventLoop.create_fd_read_event(my_subclass).add,这将导致resume_read在 FD 准备好读取时调用被覆盖的方法。

但是,这似乎在某种程度上取决于内部结构,因此将来可能会中断。现在我正在使用它,但我很想看到一个官方的解决方案。

于 2019-01-05T04:10:13.003 回答
0

您可能可以使用poll零超时来获取文件描述符的就绪状态。您需要自己为此函数编写 C 绑定,它在 stdlib 中不可用。

然后它就像

while LibC.poll(fd_struct, 1, 0) == 0
   Fiber.yield
end
于 2019-01-06T10:20:09.910 回答