Skip to main content

vmsplice

Function vmsplice 

Source
pub fn vmsplice(
    fd: BorrowedFd<'_>,
    iov: &[IoSlice<'_>],
    flags: SpliceFlags,
) -> Result<usize, Errno>
Expand description

Transfère des buffers userspace vers un pipe sans copie intermédiaire.

Wrappeur de vmsplice(2) (Linux 2.6.17+). fd doit être un pipe.

Mode GIFT (dangereux) : si [SpliceFlags::GIFT] est positionné, les pages userspace sont données au kernel. Les régions décrites par iov ne doivent plus jamais être modifiées après l’appel — violation d’invariant = corruption mémoire silencieuse.

§Parameters

  • fd : pipe destination.
  • iov : slices de buffers userspace à transférer.
  • flags : drapeaux [SpliceFlags].

§Safety

Si [SpliceFlags::GIFT] est utilisé, l’appelant doit garantir que les pages décrites par iov ne sont plus modifiées après l’appel. Modifier ces pages après un vmsplice GIFT produit un comportement indéfini.

§Errors

  • EINVAL : fd n’est pas un pipe, ou iov dépasse UIO_MAXIOV.
  • EAGAIN : mode NONBLOCK et le pipe est plein.
  • EINTR : interrompu par un signal.

§Examples

use air_sys_syscall::ipc::{pipe2, vmsplice};
use air_sys_types::{PipeFlags, SpliceFlags};
use air_sys_types::net::IoSlice;
use air_sys_types::fd::AsFd;

let data = b"hello, world";
let iov = [IoSlice::new(data)];
let (_r, w) = pipe2(PipeFlags::CLOEXEC).expect("pipe2");
let _ = vmsplice(w.as_fd(), &iov, SpliceFlags::empty());