Skip to main content

splice

Function splice 

Source
pub fn splice(
    fd_in: BorrowedFd<'_>,
    offset_in: Option<&mut u64>,
    fd_out: BorrowedFd<'_>,
    offset_out: Option<&mut u64>,
    length: usize,
    flags: SpliceFlags,
) -> Result<usize, Errno>
Expand description

Transfère jusqu’à length octets de fd_in vers fd_out sans copie userspace (zero-copy).

Wrappeur de splice(2) (Linux 2.6.17+). Au moins un des deux FDs doit être un pipe ; sinon le kernel retourne EINVAL.

Si offset_in / offset_out est None, la position courante du FD est utilisée et avancée. Si Some, la position donnée est utilisée sans modifier la position courante du FD.

§Parameters

  • fd_in : FD source.
  • offset_in : offset dans fd_in, ou None pour la position courante.
  • fd_out : FD destination.
  • offset_out : offset dans fd_out, ou None pour la position courante.
  • length : nombre maximum d’octets à transférer.
  • flags : drapeaux [SpliceFlags].

§Errors

  • EINVAL : ni fd_in ni fd_out n’est un pipe, ou flags invalides.
  • EAGAIN : mode NONBLOCK et l’opération bloquerait.
  • EINTR : interrompu par un signal (pas de retry automatique).
  • EBADF : FD invalide ou mode d’accès incorrect.
  • ESPIPE : offset_in non-nul sur un pipe (les pipes ne sont pas seekables).

§Examples

use air_sys_syscall::ipc::{pipe2, splice};
use air_sys_types::{PipeFlags, SpliceFlags};
use air_sys_types::fd::AsFd;

let (read_fd, write_fd) = pipe2(PipeFlags::CLOEXEC).expect("pipe2");
// Connecter un fichier source au pipe...
let _ = splice(
    read_fd.as_fd(), None,
    write_fd.as_fd(), None,
    4096,
    SpliceFlags::empty(),
);