splice() - Unix,Linux系统调用
Tutorials Point


  Unix入门
  Unix Shell编程
  高级Unix
  Unix有用参考
  Unix有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论区     关于TP  

splice() - Unix,Linux系统调用


previous next AddThis Social Bookmark Button

广告

名称

splice - 将数据拼接进/出管道

概要

#define _GNU_SOURCE 
#include <fcntl.h> 

long splice(int fd_in, off_t *off_in, int fd_out, off_t *off_out, size_t len ", unsigned int " flags );

描述

splice()在两个文件描述符之间移动数据,无需在内核地址空间和用户地址空间之间复制。它最多传输len字节的数据,从文件描述符fd_in到文件描述符fd_out,其中一个描述符必须指向管道。

如果fd_in指向管道,则off_in必须为NULL。如果fd_in不指向管道且off_in为NULL,则从当前文件偏移量开始读取fd_in中的字节,并相应调整当前文件偏移量。如果fd_in不指向管道且off_in不为NULL,则off_in必须指向一个缓冲区,该缓冲区指定从fd_in读取字节的起始偏移量;在这种情况下,fd_in的当前文件偏移量不会更改。类似的陈述适用于out_fdoff_out

flags参数是一个位掩码,它由将以下一个或多个值组合在一起形成。

标签描述
SPLICE_F_MOVE 尝试移动页而不是复制。这只是对内核的一个提示:如果内核无法从管道移动页,或者管道缓冲区未引用完整页,则仍然可能复制页。
SPLICE_F_NONBLOCK 不要阻塞I/O。这使splice管道操作非阻塞,但是splice()可能仍然会阻塞,因为被拼接到的文件描述符可能会阻塞(除非它们设置了O_NONBLOCK标志)。
SPLICE_F_MORE 后续将有更多数据进入splice。当fd_out指向套接字时,这是一个有用的提示(另请参见send(2)中MSG_MORE的描述,以及tcp(7)中TCP_CORK的描述)。
SPLICE_F_GIFT splice()未使用;参见vmsplice(2)。

返回值

成功完成后,splice()返回拼接进或出管道的字节数。返回值为0表示没有数据要传输,并且阻塞没有意义,因为没有写入器连接到由fd_in引用的管道的写入端。

发生错误时,splice()返回-1,并设置errno以指示错误。

错误

标签描述
EBADF 一个或两个文件描述符无效,或者没有正确的读写模式。
EINVAL 目标文件系统不支持拼接;两个描述符都不指向管道;或为非可寻址设备提供的偏移量。
ENOMEM 内存不足。
ESPIPE off_inoff_out不为NULL,但相应的文件描述符指向管道。

版本

splice(2)系统调用首次出现在Linux 2.6.17中。

符合标准

此系统调用是Linux特有的。

备注

三个系统调用splice(2)、vmsplice(2)和tee(2)为用户空间程序提供了对任意内核缓冲区的完全控制,在内核中使用与管道相同的缓冲区类型实现。总的来说,这些系统调用执行以下任务:
标签描述
splice() 将数据从缓冲区移动到任意文件描述符,反之亦然,或从一个缓冲区移动到另一个缓冲区。
tee(2) 将数据从一个缓冲区“复制”到另一个缓冲区。
vmsplice(2) 将数据从用户空间“复制”到缓冲区。
虽然我们谈论的是复制,但通常会避免实际复制。内核通过将管道缓冲区实现为指向内核内存页面的引用计数指针集来实现此目的。内核通过创建指向页面的新指针(用于输出缓冲区)并增加页面的引用计数来创建缓冲区中的页面的“副本”:只复制指针,不复制缓冲区的页面。

示例

参见tee(2)。

另见



previous next Printer Friendly

广告


  

广告



广告