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.
I need to read data provided by an external process via a POSIX file descriptor in my Rust program. The file descriptor connection is kept up a very long time (hours) and the other side passes data to me from time to time. I need to read and process the data stream continuously.
To do so, I wrote a loop that calls libc::read()
(readv
actually) to read the data and processes it when received. Since this would block the whole scheduler, I'm spawning a task on a new scheduler (task::spawn_sched(SingleThreaded)
). This works fine as long as it runs, but I can't find a way to cleanly shut down the loop.
Since the loop is blocking most of the time, I can't use a port/channel to notify the loop to exit.
I tried to kill the loop task by taking it down using a failing linked task (spawn the loop task supervised, spawn a linked task within it and wait for a signal on a port to happen before fail!()
ing and taking down the loop task with it). It works well in tests, but the libc::read()
isn't interrupted (the task doesn't fail before read finishes and it hits task::yield()
at some time.
I learned a lot looking at libcore sources, but I can't seem to find a proper solution.
SIGTERM
if the user terminates my program? There doesn't seem to be something like sigaction()
in Rust yet.mozilla/rust/pull/11410
, see also my other issue report for rust-zmq erickt/rust-zmq/issues/24
which also depends on this. (sorry about the links)If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With