io - 如何处理长时间运行的外部函数调用,例如 Rust 中的阻塞 I/O?

标签 io task ffi rust

Editor's note: This question is from a version of Rust prior to 1.0 and uses terms and functions that do not exist in Rust 1.0 code. The concepts expressed are still relevant.

我需要在我的 Rust 程序中通过 POSIX 文件描述符读取外部进程提供的数据。文件描述符连接保持很长时间(小时),另一端不时向我传递数据。我需要连续读取和处理数据流。

为此,我编写了一个调用 libc::read()(实际上是 readv)的循环来读取数据并在接收到数据时对其进行处理。因为这会阻塞整个调度程序,所以我在新的调度程序 (task::spawn_sched(SingleThreaded)) 上生成一个任务。只要它运行就可以正常工作,但我找不到彻底关闭循环的方法。

由于循环大部分时间都是阻塞的,我无法使用端口/ channel 来通知循环退出。

我试图通过使用失败的链接任务将其关闭来终止循环任务(生成受监督的循环任务,在其中生成链接任务并等待端口上的信号在 失败之前发生!() 并用它取消循环任务)。它在测试中运行良好,但 libc::read() 没有被中断(任务在读取完成之前不会失败并且它命中 task::yield() 在某个时候。

我在查看 libcore 源代码时学到了很多,但我似乎找不到合适的解决方案。

  1. 有没有办法在 Rust 中杀死一个(子)任务,即使它正在执行一些像阻塞读取这样的长外部函数调用?
  2. 有没有办法在 POSIX 文件描述符上进行非阻塞读取,以便 Rust 保持对任务的控制?
  3. 我如何对信号使用react,例如SIGTERM如果用户终止了我的程序? Rust 中似乎还没有类似 sigaction() 的东西。

最佳答案

  1. 根据 mozila ,现在不再可能终止任务,更不用说阻止读取了。
  2. mozilla/rust/pull/11410 之后将有可能这样做,另请参阅我关于 rust-zmq 的其他问题报告 erickt/rust-zmq/issues/24 这也取决于此。 (抱歉链接)
  3. 也许是 signal listener会为你工作。

关于io - 如何处理长时间运行的外部函数调用,例如 Rust 中的阻塞 I/O?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16818588/

相关文章:

java - 测试文件是否为图像文件

ansible - 执行角色、任务、pre_tasks、post_task 的顺序。任务可以在剧本中定义吗?

c++ - 从 C++ 生成 C 包装器?

Perl IO::File 是否适用于 Autodie?

c - 如何检查是否可以创建给定长度的文件?

c# - 如何将新任务添加到现有任务

c# - 使用 WaitHandle.WaitOne

rust - 如何创建 Rust 回调函数以传递给 FFI 函数?

haskell - 将 OCaml 代码与共享库链接

file - 使用 MIPS 程序集读取文件