零拷贝之splice( )函数和tee( )函数
关于零拷贝技术的相关文章,请参考:【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);
- 1
- 2
参数意义:
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);
- 1
- 2
参数意义:
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
为了简化操作,程序里省略了错误处理,实际编程中需要加入。
零拷贝之splice( )函数和tee( )函数相关推荐
- linux网络编程:splice函数和tee( )函数高效的零拷贝
splice( )函数 在两个文件描述符之间移动数据,同sendfile( )函数一样,也是零拷贝. 函数原型: #include <fcntl.h> ssize_t splice(in ...
- 【Linux编程】零拷贝之splice( )函数和tee( )函数
关于零拷贝技术的相关文章,请参考:[Linux编程]大冒险之零拷贝技术探究 splice( )函数 在两个文件描述符之间移动数据,同sendfile( )函数一样,也是零拷贝. 函数原型: #incl ...
- linux dma拷贝数据到用户态,图解:零拷贝Zero-Copy技术大揭秘
1.前言 像大白这种调包侠,深知不懂底层技术点就如同空中楼阁,再这样下去面阿里p10是没希望了. 想到这里,我开始慌了,所以今天和大家一起学习个底层技术点-零拷贝Zero-Copy. Linux系统中 ...
- 浅析操作系统和Netty中的零拷贝机制
点击关注公众号,Java干货及时送达 零拷贝机制(Zero-Copy)是在操作数据时不需要将数据从一块内存区域复制到另一块内存区域的技术,这样就避免了内存的拷贝,使得可以提高CPU的.零拷贝机制是一种 ...
- 图解|零拷贝Zero-Copy技术大揭秘
1.前言 像大白这种调包侠,深知不懂底层技术点就如同空中楼阁,再这样下去面阿里p10是没希望了. 想到这里,我开始慌了,所以今天和大家一起学习个底层技术点-零拷贝Zero-Copy. Linux系统中 ...
- linux I/O--IO原理和几种零拷贝机制(五)
前言 零拷贝(Zero-copy)技术指在计算机执行操作时,CPU 不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切换以及 CPU 的拷贝时间.它的作用是在数据报从网络设备到用户 ...
- 计算机IO系列「一」零拷贝技术
深入剖析Linux IO原理和几种零拷贝机制的实现 转载自:深入剖析Linux IO原理和几种零拷贝机制的实现 - 知乎 前言 零拷贝(Zero-copy)技术指在计算机执行操作时,CPU 不需要先将 ...
- 深入剖析Linux IO原理和几种零拷贝机制的实现
本文来说下Linux IO原理和几种零拷贝机制的实现 文章目录 概述 物理内存和虚拟内存 物理内存 虚拟内存 内核空间和用户空间 内核空间 用户空间 Linux的内部层级结构 Linux I/O读写方 ...
- Linux IO原理和零拷贝机制
目录 1 概述 2 Linux I/O读写方式 2.1 I/O中断原理 2.2. DMA传输原理 2.3 传统I/O方式 3 零拷贝方式 3.1 用户态直接I/O 3.2 mmap + write 3 ...
最新文章
- 存储mysql数据存在特殊字符时处理_转义 存储数据时特殊符号的处理
- 你的代码将会被GitHub埋在北极,保存1000年!
- 使用 VisualVM 进行性能分析及调优
- 《JS权威指南学习总结--第九章 类和模板》
- define() vs const 该如何选择?
- FastDFS设置开机启动
- 解决Ubuntu中文件管理器死掉的情况
- mysql与文件_MySQL——文件
- html溢出左右滚动,html-选项卡溢出时水平滚动
- python通过跳板机连接服务器_使用pycharm、跳板机连接内网服务器
- cocos2d-x中使用Http
- latex 基本用法(四)
- 如何优雅的编写Objective-C语言?
- 笑死,小米新logo是这么来的
- 【VS2010学习笔记】【类型转换】整形转换为CString类型
- vue项目安装axios
- java 十进制十六进制转换_Java进制转换之十六进制转十进制
- 优盘突然显示无法在此计算机,复制文件到U盘时突然无法复制提示磁盘被写保护该如何修复...
- 计算机在随机抽样上的应用,数理统计学中随机抽样的应用研究
- 【途牛旅游项目】项目环境搭建,实现登陆功能