Struct Sender

pub struct Sender { /* private fields */ }

Sending end of an Unix pipe.

See new for documentation, including examples.

Implementations

impl Sender

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

Set the Sender 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 Sender

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

impl AsRawFd for Sender

fn as_raw_fd(&self) -> RawFd

impl Debug for Sender

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

impl From<ChildStdin> for Sender

fn from(stdin: ChildStdin) -> Sender

impl From<OwnedFd> for Sender

fn from(fd: OwnedFd) -> Self

impl FromRawFd for Sender

unsafe fn from_raw_fd(fd: RawFd) -> Sender

impl IntoRawFd for Sender

fn into_raw_fd(self) -> RawFd

impl Source for Sender

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<()>

impl Write for Sender

fn write(&mut self, buf: &[u8]) -> Result<usize>
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize>
fn flush(&mut self) -> Result<()>

Auto Trait Implementations

impl !Freeze for Sender

impl RefUnwindSafe for Sender

impl Send for Sender

impl Sync for Sender

impl Unpin for Sender

impl UnsafeUnpin for Sender

impl UnwindSafe for Sender

Blanket Implementations

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

fn type_id(&self) -> TypeId

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

fn borrow(&self) -> &T

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

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

impl<T> From<T> for Sender

fn from(t: T) -> T

Returns the argument unchanged.

impl<T, U> Into<U> for Sender 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 Sender where U: Into<T>,

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

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

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