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连接的任意一 ...
随机推荐
- (转载) js 单引号替换成双引号,双引号替换成单引号 操作
引言:刚开始用js遇到不少问题,表示看不懂,为什么替换单引号需要/g,现在知道/g是正则中的匹配全部 原文:http://blog.csdn.net/joyhen/article/details/43 ...
- 用lambda表达式写左联查询的示例
需要完成的查询逻辑:A表内联B表,B表左联C表,A表左联D表,并且 C表的TotalCount>23,D表的ClassHour>8,最后查出A表的Id,代码如下: IQueryable&l ...
- pacman 命令详解
Pacman 是一个命令行工具,这意味着当你执行下面的命令时,必须在终端或控制台中进行. 1.更新系统 在 Arch Linux 中,使用一条命令即可对整个系统进行更新:pacman -Syu 如果你 ...
- Python面向对象封装案例
01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象,然后 让对象调用方法 对象方法的细节 都被 封装 ...
- Xcode11 Developer Tool中没了Application Loader
升级Xcode11之后不少人发现在Open Developer Tool中没了Application Loader. 那么如果我们还想用该怎么办呢? 先这样 找个老版的Xcode–>Conten ...
- HTNL5-ARIA role属性
WAI-ARIA Web Accessibility Initiative’s Accessible Rich Internet Applications 无障碍网页倡议–无障碍的富互联网应用,也简称 ...
- 英语apyrite红碧玺apyrite单词
红碧玺(apyrite)是粉红.桃红.玫瑰红.深红.紫红等以红色调为主的碧玺,矿物学上主要属于锂电气石和镁电气石.红色起因可能与微量锰及锂和铯有关. 红色是碧玺中价值最高的,其中以紫红色和玫瑰红色最佳 ...
- layui扩展组件sliderVerify 实现滑块验证
首先在要使用的静态文件代码中引入‘./sliderVerify/sliderVerify.js‘ 先看看效果 示例代码 <!DOCTYPE html> <html> <h ...
- MySQL Table--独立表空间
数据库表空间 独立表空间 在MySQL 5.6 中引入独立表空间的概念,启用独立表空间后,每个表将生成独立的文件来进行存储. 创建表时可以指定表存放的文件路径 ##首选需要确保innodb_file_ ...
- c#: 剪切板监视实现
CR TubeGet中有用户需要剪切板监视功能,记录代码以做备忘: using System; using System.Runtime.InteropServices; using System.W ...