Struct Receiver

pub struct Receiver { /* private fields */ }

Receiving end of an Unix pipe.

See new for documentation, including examples.

Implementations

impl Receiver

fn set_nonblocking(&self, nonblocking: bool) -> Result<()>

Set the Receiver into or out of non-blocking mode.

fn try_io<F, T>(&self, f: F) -> Result<T>
where
    F: FnOnce() -> Result<T>,

Execute an I/O operation ensuring that the socket receives more events if it hits a WouldBlock error.

Notes

This method is required to be called for all I/O operations to ensure the user will receive events once the socket is ready again after returning a WouldBlock error.

Examples

# use std::error::Error;
#
# fn main() -> Result<(), Box<dyn Error>> {
use std::io;
use std::os::fd::AsRawFd;
use mio::unix::pipe;

let (sender, receiver) = pipe::new()?;

// Wait until the sender is writable...

// Write to the sender using a direct libc call, of course the
// `io::Write` implementation would be easier to use.
let buf = b"hello";
let n = sender.try_io(|| {
    let buf_ptr = &buf as *const _ as *const _;
    let res = unsafe { libc::write(sender.as_raw_fd(), buf_ptr, buf.len()) };
    if res != -1 {
        Ok(res as usize)
    } else {
        // If EAGAIN or EWOULDBLOCK is set by libc::write, the closure
        // should return `WouldBlock` error.
        Err(io::Error::last_os_error())
    }
})?;
eprintln!("write {} bytes", n);

// Wait until the receiver is readable...

// Read from the receiver using a direct libc call, of course the
// `io::Read` implementation would be easier to use.
let mut buf = [0; 512];
let n = receiver.try_io(|| {
    let buf_ptr = &mut buf as *mut _ as *mut _;
    let res = unsafe { libc::read(receiver.as_raw_fd(), buf_ptr, buf.len()) };
    if res != -1 {
        Ok(res as usize)
    } else {
        // If EAGAIN or EWOULDBLOCK is set by libc::read, the closure
        // should return `WouldBlock` error.
        Err(io::Error::last_os_error())
    }
})?;
eprintln!("read {} bytes", n);
# Ok(())
# }

Trait Implementations

impl AsFd for Receiver

fn as_fd(&self) -> BorrowedFd<'_>

impl AsRawFd for Receiver

fn as_raw_fd(&self) -> RawFd

impl Debug for Receiver

fn fmt(&self, f: &mut Formatter<'_>) -> Result

impl From<ChildStderr> for Receiver

fn from(stderr: ChildStderr) -> Receiver

impl From<ChildStdout> for Receiver

fn from(stdout: ChildStdout) -> Receiver

impl From<OwnedFd> for Receiver

fn from(fd: OwnedFd) -> Self

impl FromRawFd for Receiver

unsafe fn from_raw_fd(fd: RawFd) -> Receiver

impl IntoRawFd for Receiver

fn into_raw_fd(self) -> RawFd

impl Read for Receiver

fn read(&mut self, buf: &mut [u8]) -> Result<usize>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>

impl Source for Receiver

fn register(&mut self, registry: &Registry, token: Token, interests: Interest) -> Result<()>
fn reregister(&mut self, registry: &Registry, token: Token, interests: Interest) -> Result<()>
fn deregister(&mut self, registry: &Registry) -> Result<()>

Auto Trait Implementations

impl !Freeze for Receiver

impl RefUnwindSafe for Receiver

impl Send for Receiver

impl Sync for Receiver

impl Unpin for Receiver

impl UnsafeUnpin for Receiver

impl UnwindSafe for Receiver

Blanket Implementations

impl<T> Any for Receiver where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

impl<T> Borrow<T> for Receiver where T: ?Sized,

fn borrow(&self) -> &T

impl<T> BorrowMut<T> for Receiver where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

impl<T> From<T> for Receiver

fn from(t: T) -> T

Returns the argument unchanged.

impl<T, U> Into<U> for Receiver where U: From<T>,

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

impl<T, U> TryFrom<U> for Receiver where U: Into<T>,

type Error = Infallible;
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

impl<T, U> TryInto<U> for Receiver where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error;
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>