关于零拷贝技术的相关文章,请参考:【Linux编程】大冒险之零拷贝技术探究

splice( )函数

在两个文件描述符之间移动数据,同sendfile( )函数一样,也是零拷贝。
函数原型:

#include <fcntl.h>
ssize_t splice(int fdin, loff_t *offin, int fdout, loff_t *offout, size_t len, unsigned int flags);

参数意义

fdin参数:待读取数据的文件描述符。
offin参数:指示从输入数据的何处开始读取,为NULL表示从当前位置。如果fdin是一个管道描述符,则offin必须为NULL。
fdout参数:待写入数据的文件描述符。
offout参数:同offin,不过用于输出数据。
len参数:指定移动数据的长度。
flags参数:表示控制数据如何移动,可以为以下值的按位或:

  • SPLICE_F_MOVE:按整页内存移动数据,存在bug,自内核2.6.21后,实际上没有效果。
  • SPLICE_F_NONBLOCK:非阻塞splice操作,实际会受文件描述符本身阻塞状态影响。
  • SPLICE_F_MORE:提示内核:后续splice将调用更多数据。
  • SPLICE_F_GIFT:对splice没有效果。

fdin和fdout必须至少有一个是管道文件描述符。

返回值

返回值>0:表示移动的字节数。
返回0:表示没有数据可以移动,如果从管道中读,表示管道中没有被写入数据。
返回-1;表示失败,并设置errno。

errno值如下

  • EBADF:描述符有错。
  • EINVAL:目标文件不支持splice,或者目标文件以追加方式打开,或者两个文件描述符都不是管道描述符。
  • ENOMEM:内存不够。
  • ESPIPE:某个参数是管道描述符,但其偏移不是NULL。

tee( )函数

在两个管道文件描述符之间复制数据,同是零拷贝。但它不消耗数据,数据被操作之后,仍然可以用于后续操作。
函数原型:

#include <fcntl.h>
ssize_t tee(int fdin, int fdout, size_t len, unsigned int flags);

参数意义

fdin参数:待读取数据的文件描述符。
fdout参数:待写入数据的文件描述符。
len参数:表示复制的数据的长度。
flags参数:同splice( )函数。

fdin和fdout必须都是管道文件描述符。
返回值

返回值>0:表示复制的字节数。
返回0:表示没有复制任何数据。
返回-1:表示失败,并设置errno。

代码实例:

/*splice()和tee()实现将文件"./1.txt"同时拷贝到文件"./2.txt"和"./3.txt"中*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>int main(){int fd1 = open("./1.txt", O_RDONLY);int fd2 = open("./2.txt", O_RDWR| O_CREAT | O_TRUNC, 0666);int fd3 = open("./3.txt", O_RDWR| O_CREAT | O_TRUNC, 0666);/*用于向"./2.txt"输入数据*/int pipefd2[2];/*用于向"./3.txt"输入数据*/int pipefd3[2];pipe(pipefd2);pipe(pipefd3);/*将fd1文件的内容输入管道pipefd2中*/splice(fd1, NULL, pipefd2[1], NULL, 10086, SPLICE_F_MORE);/*将管道pipefd2的内容复制到管道pipefd3中,不消耗管道pipefd2上的数据,管道pipefd2上的数据可以用于后续操作*/tee(pipefd2[0], pipefd3[1], 10086, SPLICE_F_NONBLOCK);/*将管道pipefd2的内容写入fd2文件中*/splice(pipefd2[0], NULL, fd2, NULL, 10086, SPLICE_F_MORE);/*将管道pipefd3的内容写入fd3文件中*/splice(pipefd3[0], NULL, fd3, NULL, 10086, SPLICE_F_MORE);close(fd1);close(fd2);close(fd3);close(pipefd2[0]);close(pipefd2[1]);close(pipefd3[0]);close(pipefd3[1]);return 0;
}

为了简化操作,程序里省略了错误处理,实际编程中需要加入。

相关文件:
【Linux编程】大冒险之零拷贝技术探究

【Linux编程】零拷贝之splice( )函数和tee( )函数相关推荐

  1. 面试题:如何理解 Linux 的零拷贝技术?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 本文讲解 Linux 的零拷贝技术,云计算是一门很庞大的技术学科, ...

  2. Linux Zero-copy零拷贝技术:源码示例

    <Linux Zero-copy零拷贝技术:源码示例> <Linux Zero-copy零拷贝技术全面揭秘> <什么是mmap?零拷贝?DMA?> <Linu ...

  3. linux 中的零拷贝技术,第 2 部分,Linux的零拷贝技术

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 不是零拷贝的情况下是如何进行的,有什么不好的地方? 一次读取磁盘文件发送到网络的数据的拷贝过程: 用户态:用户进程开辟的 ...

  4. linux网络编程:splice函数和tee( )函数高效的零拷贝

    splice( )函数 在两个文件描述符之间移动数据,同sendfile( )函数一样,也是零拷贝.  函数原型: #include <fcntl.h> ssize_t splice(in ...

  5. Linux网络编程 | 零拷贝 :sendfile、mmap、splice、tee

    文章目录 传统文件传输的问题 Linux中实现零拷贝的方法 传统文件传输的问题 在网络编程中,如果我们想要提供文件传输的功能,最简单的方法就是用read将数据从磁盘上的文件中读取出来,再将其用writ ...

  6. 零拷贝之splice( )函数和tee( )函数

    关于零拷贝技术的相关文章,请参考:[Linux编程]大冒险之零拷贝技术探究 splice( )函数 在两个文件描述符之间移动数据,同sendfile( )函数一样,也是零拷贝.  函数原型: #inc ...

  7. Linux I/O原理和零拷贝Zero-copy技术全面揭秘

    目录 导言 计算机存储器 物理内存 虚拟内存 静态重定位 存储器抽象 交换(swapping)技术 虚拟内存技术 用户态和内核态 Linux I/O I/O 缓冲区 I/O 模式 程序控制 I/O 中 ...

  8. linux dma拷贝数据到用户态,图解:零拷贝Zero-Copy技术大揭秘

    1.前言 像大白这种调包侠,深知不懂底层技术点就如同空中楼阁,再这样下去面阿里p10是没希望了. 想到这里,我开始慌了,所以今天和大家一起学习个底层技术点-零拷贝Zero-Copy. Linux系统中 ...

  9. Linux 操作系统原理 — 零拷贝技术

    目录 文章目录 目录 Linux I/O 缓存背景 为什么需要零拷贝? 零拷贝技术(Zero-Copy) 方法一:用户态直接 I/O 方法二:mmap + write 方法三:Sendfile 方法四 ...

最新文章

  1. 《Python核心编程 》笔记-第二章+第三章
  2. 樊登高效休息法心得400字_真的,你应该早点知道这个高效学习方法
  3. [PHP] 三种运行模式 ISAPI模式 APACHE2HANDLER模式 CGI模式 FastCGI模式
  4. Ribbon-饥饿加载
  5. Linux中进行用户UID测试导致系统报错
  6. python中什么是实例-在Python中使用’__rsub__’方法的典型实例是什么?
  7. 基础拾遗------webservice详解
  8. 中数组的合并_【美团面试题】合并两个有序数组
  9. 最新版本_adt-bundle-windows-x86_64-20140702 无法建立avd
  10. [恢]hdu 1850
  11. python treeview显示多列_Python Gtk TreeView列数据显示
  12. jquery常用事件——幕布
  13. μC/OS-II实时性能测试与分析
  14. vb设置excel 字体 加粗 微软雅黑_Python操作Excel的Xlwings教程(六)
  15. python几种数据结构_Python中的4种数据结构
  16. ie支持html5代码,使用 HTML5 Shiv 让 IE 支持 HTML5
  17. win10 uwp 商业游戏
  18. 「3D视觉技术交流群」精华帖与关键问题
  19. Stm32的GPIO驱动继电器
  20. 基于微信小程序的家教管理系统源码

热门文章

  1. MallBook推出二维码收款分账,开启简单分账新篇章
  2. Android Audio - 支持多应用同时录音_Android8.1修改方法
  3. 软件工程导论学习小结
  4. 2021年安全员-A证复审考试及安全员-A证考试试题
  5. 前几天挂掉一个读者的滴滴二面矩阵题目
  6. 黑客是如何攻破一个网站的?
  7. 用React-Native+Mobx做一个迷你水果商城APP
  8. LED驱动电源有哪些特点
  9. Linux命令行与shell脚本编程之笔记(4)
  10. IDEA使用自带maven还是自行配置maven