pub fn pipe() -> Result<(PipeReader, PipeWriter)>
🔬This is a nightly-only experimental API. (
anonymous_pipe
#127154)Expand description
Create anonymous pipe that is close-on-exec and blocking.
§Behavior
A pipe is a synchronous, unidirectional data channel between two or more processes, like an
interprocess mpsc
provided by the OS. In particular:
- A read on a
PipeReader
blocks until the pipe is non-empty. - A write on a
PipeWriter
blocks when the pipe is full. - When all copies of a
PipeWriter
are closed, a read on the correspondingPipeReader
returns EOF. PipeReader
can be shared, but only one process will consume the data in the pipe.
§Capacity
Pipe capacity is platform dependent. To quote the Linux man page:
Different implementations have different limits for the pipe capacity. Applications should not rely on a particular capacity: an application should be designed so that a reading process consumes data as soon as it is available, so that a writing process does not remain blocked.
§Examples
#![feature(anonymous_pipe)]
let (ping_rx, mut ping_tx) = std::io::pipe()?;
let (mut pong_rx, pong_tx) = std::io::pipe()?;
// Spawn a process that echoes its input.
let mut echo_server = Command::new("cat").stdin(ping_rx).stdout(pong_tx).spawn()?;
ping_tx.write_all(b"hello")?;
// Close to unblock echo_server's reader.
drop(ping_tx);
let mut buf = String::new();
// Block until echo_server's writer is closed.
pong_rx.read_to_string(&mut buf)?;
assert_eq!(&buf, "hello");
echo_server.wait()?;