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: drapeauxSpliceFlags.
§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:fdn’est pas un pipe, ouiovdépasseUIO_MAXIOV.EAGAIN: modeNONBLOCKet 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());