2013-05-29 28 views
15

我需要通過Rust程序中的posix filedescriptor讀取由外部進程提供的數據。 fd連接保持很長時間(小時),而另一端不時向我傳遞數據。所以我需要不斷讀取和處理數據流。如何處理Rust中的阻塞I/O或長時間運行的外部函數調用

爲此,我編寫了一個循環,調用libc::read()(readv實際)來讀取數據並在收到時處理它。由於這會阻塞整個調度程序,因此我正在新調度程序中產生一項任務(task::spawn_sched(SingleThreaded))。只要運行它就可以正常工作,但我無法找到乾淨地關閉循環的方法。

由於循環阻塞了大部分時間,我不能使用端口/ chan來通知循環退出。

我試圖通過使用失敗的鏈接任務取消循環任務(產生監督的循環任務,在其中產生鏈接任務,並等待端口上的信號在fail!()之前發生並取消循環任務)。它的工作原理以及在測試中,但libc::read()不會被中斷(任務不讀完成之前失敗,並且在這一段時間內擊中task::yield()

我學到了很多東西看着libcore來源,但我似乎無法找到一個妥善的解決辦法。

  1. 有沒有辦法殺一個(孩子)拉斯特任務,即使它做一些長期的外部函數調用,比如阻塞讀?
  2. 有沒有辦法做非阻塞讀在一個posix文件描述符,以便Rust能夠控制任務?
  3. 我該如何對信號做出反應, G。 SIGTERM如果用戶終止我的程序。在Rust中似乎沒有像sigaction()這樣的東西?
+0

目前似乎不可能這樣做,但正在努力改善異步I/O:https://github.com/mozilla/rust/issues/4419 – Zargony

+0

是否有任何有關非阻塞I/O現在在Rust 1.0中? – jocull

+0

這個評論稍後很多,但由於這個問題沒有一個可以接受的答案,所以我把它放在這裏:io的故事自1.0以來已經發生了很大的變化。目前非常重視使用mio的異步I/O,它基於Linux和Windows的內核庫(不能記住它們)。可能很快會出現一些語法級別的功能。更一般地說,如果一個工作線程有一個工作循環,這個循環可以檢查關閉消息。如果它在I/O上被阻塞,我不知道是否有可能將其喚醒。我有興趣瞭解更多。 – derekdreery

回答

1
  1. mozila,殺死一個任務是沒有更多的可能,現在,別說閉塞讀。
  2. mozilla/rust/pull/11410之後可以這樣做,另請參閱我的其他問題報告,這些報告也取決於這個用於rust-zmq erickt/rust-zmq/issues/24。 (抱歉的鏈接)
  3. 也許signal listener會爲你工作。
相關問題