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 源代码时学到了很多,但我似乎找不到合适的解决方案。
- 有没有办法在 Rust 中杀死一个(子)任务,即使它正在执行一些像阻塞读取这样的长外部函数调用?
- 有没有办法在 POSIX 文件描述符上进行非阻塞读取,以便 Rust 保持对任务的控制?
- 我如何对信号使用react,例如
SIGTERM
如果用户终止了我的程序? Rust 中似乎还没有类似sigaction()
的东西。
最佳答案
- 根据 mozila ,现在不再可能终止任务,更不用说阻止读取了。
- 在
mozilla/rust/pull/11410
之后将有可能这样做,另请参阅我关于 rust-zmq 的其他问题报告erickt/rust-zmq/issues/24
这也取决于此。 (抱歉链接) - 也许是 signal listener会为你工作。
关于io - 如何处理长时间运行的外部函数调用,例如 Rust 中的阻塞 I/O?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16818588/