io task ffi rust

Cómo manejar el bloqueo de E/S en Rust o llamadas de funciones externas de larga ejecución en general



task ffi (1)

Necesito leer los datos proporcionados por un proceso externo a través de un filixcriptor posix en mi programa Rust. La conexión fd se mantiene durante mucho tiempo (horas) y el otro lado me pasa los datos de vez en cuando. Así que necesito leer y procesar el flujo de datos continuamente.

Para hacerlo, escribí un bucle que llama a libc::read() (readv en realidad) para leer los datos y procesarlos cuando se reciben. Como esto bloquearía todo el programador, estoy generando una tarea en un nuevo programador ( task::spawn_sched(SingleThreaded) ). Esto funciona bien siempre y cuando se ejecute, pero simplemente no puedo encontrar una manera de cerrar el bucle limpiamente.

Como el bucle está bloqueando la mayor parte del tiempo, no puedo usar un puerto / chan para notificar al bucle que salga.

Intenté eliminar la tarea de bucle eliminándola usando una tarea vinculada fallida (generar la tarea de bucle supervisada, generar una tarea enlazada dentro de ella y esperar que ocurra una señal en un puerto antes de que fail!() y eliminar el bucle tarea con ella). Funciona bien en las pruebas, pero libc::read() no se interrumpe (la tarea no falla antes de que finalice la lectura y golpea task::yield() en algún momento).

Aprendí mucho mirando las fuentes de libcore, pero parece que no puedo encontrar una solución adecuada.

  1. ¿Hay una manera de matar una tarea (secundaria) en Rust incluso si se está realizando una llamada de función externa larga como una lectura de bloqueo?
  2. ¿Hay alguna manera de hacer lecturas sin bloqueo en un filedescriptor posix para que Rust mantenga el control sobre la tarea?
  3. ¿Cómo puedo reaccionar a las señales, por ejemplo, SIGTERM si el usuario termina mi programa? ¿Parece que todavía no hay algo como sigaction() en Rust?

  1. Según mozila , matar una tarea ya no es posible, por ahora, y mucho menos bloquear la lectura.
  2. Será posible hacerlo después de mozilla/rust/pull/11410 , vea también mi otro informe de problemas para rust-zmq erickt/rust-zmq/issues/24 que también depende de esto. (perdón por los enlaces)
  3. Tal vez el oyente de señales funcione para usted.