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