linux高性能服务器编程 (六) --高级I/O函数
第六章 高级I/O函数
Linux提供了很多高级的I/O函数,它不是基础的I/O函数(open/read)
1、创建文件描述符的函数比如:pipe、dup/dup2函数
2、读写数据的函数比如:readv/writev、sendfile、mmap/munmap、splice 和 tee 函数
3、控制 I/O 行为和属性的函数比如:fcntl 函数
pipe函数可以创建一个管道,管道是一种把两个进程之间的标准输入和输出连接起来的机制。从而可以实现让多进程之间进行通信。pipe创建的管道是单工的,所以需要提供两个文件描述符来操作管道。其中一个进行写操作,另外一个进行读操作。管道的读写和一般的i/o read write 逻辑一致。

1、pipe 创建管道
int pipe (int filedes[2])
pipe 创建管道参数数组包含pipe使用的两个文件描述符。 fd[0] 用于读管道,fd[1] 用于写管道。在创建管道的时候必须在fork()中调用pipe().否则子进程不会继承文件描述符。两个进程不共享祖先进程。就不能在使用pipe().但是可以使用命名管道。
由于pipe是单工的,如果要实现双向管道数据传输。就应该使用两个管道。默认情况下,单工的管道描述符都是阻塞的。比如,如果read 读取一个空的管道,则read将被阻塞。直到管道内有数据可读。如果用write系统调用往一个已满的管道中写入数据,则write将被阻塞。直到管道内有足够的空闲空间下来才能用。那么如果将fd 都设置为非阻塞。则read 和write 会有不同的行为。如果写端文件描述符fd[1] 的引用计数减少至0 则没有进程需要往管道中写入,则 读文件描述符fd[0] 将读到 0 和 文件结束标记(EOF)。如果读文件描述符fd[0] 的引用计数减少到0 则没有任何进程需要从管道读取数据,则写端文件描述符fd[1] 的write将失败。并引发SIGPIPE信号。另外 socket 的基础api 提供了创建双向管道。socketpair 函数可以实现。
管道内传输的数据都是字节流。和TCP字节流类似,但是不一样。应用程序能往TCP连接中写入多少字节流的数据。取决于对方的接收通告窗口的大小和本端的拥塞窗口大小。而管道本身拥有一个容量限制。通过 fcntl 函数可以修改管道容量。
2、dup 函数和 dup2 函数
dup 函数和dup2 函数都是用于复制文件描述符。dup 返回的文件描述符是取系统当前最小的整数值,dup2返回第一个不小于file_descriptor_two的整数值。
3、readv 函数和 writev 函数
readv 函数将数据从文件描述符读到分散的内存块中,即分散读。
writev 函数则将多块分散的内存数据一并写入文件描述符中,即集中写。
ssize_t readv(int fd, const struct iovec* vector, int count);
ssize_t writev(int fd, const struct iovec* vector, int count);
fd 被操作的文件描述符,vector 一块内存区,count 是内存区的长度,即多少块内存数据需要从 fd 读出或写到 fd
4、sendfile 函数
sendfile 函数 在两个文件描述符之间直接传递数据。从而避免内核缓存区和用户缓存区之间的数据拷贝,效率高,称零拷贝。
5、mmap 函数 和 munmap 函数
mmap用于申请一段内存空间。我们可以将这段内存作为进程间通通信的共享内存。也可以将文件直接映射到其中。munmap 函数释放由mmap创建的这段内存空间。
6、splice 函数
splice 函数用于在两个文件描述符之间移动数据,也是零拷贝操作。
7、tee 函数
tee 函数在两个管道文件描述符之间复制数据。也是零拷贝操作。也不消耗数据,因此源文件描述符上的数据仍然可以用于后续的读操作。
8、fcntl 函数
fcntl 函数 提供了对文件描述符的各种控制操作。另外一个常见的控制文件描述符属性和行为的系统调用是ioctl. 而 ioctl 比 fcntl 能够执行更多的控制。但是fcntl 函数是 POSIX 规范指定的首选方法。
linux高性能服务器编程 (六) --高级I/O函数的更多相关文章
- linux高性能服务器编程
<Linux高性能服务器编程>:当当网.亚马逊 目录: 第一章:tcp/ip协议族 第二章:ip协议族 第三章:tcp协议详解 第四章:tcp/ip通信案例:访问Internet 第五章: ...
- Linux 高性能服务器编程——IP协议详解
1 IP服务特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. 无状态:IP通信双方不同步传输数据的状态信息,因此IP数据包的发送.传输和接收都是无序的. ...
- Linux 高性能服务器编程——多线程编程
问题聚焦: 在简单地介绍线程的基本知识之后,主要讨论三个方面的内容: 1 创建线程和结束线程: 2 读取和设置线程属性: 3 线程同步方式:POSIX信号量,互斥锁和条件变量 ...
- Linux 高性能服务器编程——多进程编程
问题聚焦: 进程是Linux操作系统环境的基础. 本篇讨论以下几个内容,同时也是面试经常被问到的一些问题: 1 复制进程映像的fork系统调用和替换进程映像的exec系列系统调 ...
- Linux 高性能服务器编程——I/O复用
问题聚焦: 前篇提到了I/O处理单元的四种I/O模型. 本篇详细介绍实现这些I/O模型所用到的相关技术. 核心思想:I/O复用 使用情景: 客户端程序要同时处理多个socket ...
- Linux 高性能服务器编程——高性能服务器程序框架
问题聚焦: 核心章节. 服务器一般分为如下三个主要模块:I/O处理单元(四种I/O模型,两种高效事件处理模块),逻辑单元(两种高效并发模式,有效状态机)和存储单元(不讨论). 服务器模 ...
- Linux 高性能服务器编程——Linux服务器程序规范
问题聚焦: 除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范. 工欲善其事,必先利其器,这篇主要来探 ...
- Linux 高性能服务器编程——Linux网络编程基础API
问题聚焦: 这节介绍的不仅是网络编程的几个API 更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系. 这节主要介绍三个方面的内容:套接字(so ...
- Linux 高性能服务器编程——TCP协议详解
问题聚焦: 本节从如下四个方面讨论TCP协议: TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流 TCP状态转移过程:TCP连接的任意一 ...
随机推荐
- .net平台下对C#代码的编译
最近赶项目忽然想到一个问题,那就是在 .Net平台下的C#代码是怎么从源代码到机器可以识别的电脑的(只怪自己上学不好好读书,现在又要重补一遍了!!!) 话不多说直接上调研结果: 预习知识: 1: IL ...
- javascript原型深入解析2--Object和Function,先有鸡先有蛋
1.提出两个问题: Js 的prototype和__proto__ 是咋回事? 先有function 还是先有object? 2.引用<JavaScript权威指南>的一段描述: 每个JS ...
- centos从零开始安装elasticSearch
前言:elasticSearch作为一款优秀的分布式搜索工具,被广泛用在数据搜集和整理的业务中,知名的比如有github就是采用es来精准的搜索几千万行代码,百度也大量应用es做数据爬取分析,本篇博客 ...
- java字符串常用方法总结(更新中..)
一.String类 1.字符串拼接 String str1 = "abcd"; String str2 = "efgh"; System.out.println ...
- 【MySQL】MySQL高可用架构之MHA
一.关于MHA MHA(Master HA)是一款开源的MySQL的高可用程序,它为MySQL主从复制架构提供了automating master failover 功能.MHA在监控到master节 ...
- 92.vue---新手从本地项目开发到服务器线上运行爬坑。
因为我做的是后台,所以不用做SEO 参考 本项目的定位是后台集成方案,不太适合当基础模板来进行二次开发.因为本项目集成了很多你可能用不到的功能,会造成不少的代码冗余.如果你的项目不关注这方面的问题,也 ...
- 85.webpack的安装失败至成功
webpack怎么安装 1.安装node.js; 2.安装webpack: npm install webpack --save-dev : 注意:webpack 4x以上,webpack将命 ...
- Android Scroller简单用法实例
Android里Scroller类是为了实现View平滑滚动的一个Helper 类.通常在自定义的View时使用,在View中定义一个私有成员mScroller = new Scroller(cont ...
- IOS 微信、QQ、叮叮等APP虚拟定位 实在太好用了
前不久爱思助手更新了最新版本:V7.96,同时更新了好几个功能,包括给ios设备修改虚拟定位功能,想要给手机修改,我们需要电脑下载爱思助手最新版本V7.96,数据线连接电脑修改. 借助爱思助手的虚拟定 ...
- Golang中文乱码问题
在学习golang读取文件的过程中,遇到中文显示乱码的问题!golang没有自带的编解码包,因此需要借助第三方包 解决方法: 引入第三发转码包:git clone https://github.com ...