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连接的任意一 ...
随机推荐
- Jwt身份验证
转载自博友(TerryTon) 1.因为json是通用的,所以jwt可以在绝大部分平台可以通用,如java,python,php,.net等 2.基于jwt是无状态的,jwt可以用于分布式等现在比 ...
- (原创)使用C#开发PLC上位机监控系统客户端应用程序
PLC客户端监控系统的特点: 0.客户端系统软件可部署在 多个管理层的PC机上,或者需要部署在距离服务器较远区域的PC机上,通过网线连接到服务器端的交换机. 1应用范围: (1)所有客户端都只有监视功 ...
- 让div在body中任意拖动
HTML代码 <div id="idOuterDiv" class="CsOuterDiv"> </div> CSS代码 body { ...
- HTNL5-ARIA role属性
WAI-ARIA Web Accessibility Initiative’s Accessible Rich Internet Applications 无障碍网页倡议–无障碍的富互联网应用,也简称 ...
- AMD规范中模块id的命名规则
AMD 即 Asynchronous Module Definition, 中文是“ 异步模块定义”的意思. AMD 规范制定了定义模块的规则,这样模块和模块的依赖可以被异步加载. AMD 规范只定义 ...
- 渗透 Facebook 的思路与发现
0x00 写在故事之前 身一位渗透测试人员,比起 Client Side 的弱点,我更喜欢 Server Side 的攻击,能够直接控制服务器并获得权限操作 SHELL 才爽 . 当然一次完美的渗透出 ...
- Centos7 rsync+inotify实现实时同步更新
inotify slave部署 把master上指定文件下载到本地的主机指定目录 yum install rsync –y [root@localhost ~]# useradd rsync ...
- day 33
目录 数据库是什么 为什么使用数据库 数据库的分类 关系型(把数据保存在硬盘里) 非关系型(把数据保存在内存里) mysql的架构 初识mysql 操作数据库 增 删 改 查 数据库是什么 数据库即存 ...
- MongoDB Spark Connector 实战指南
Why Spark with MongoDB? 高性能,官方号称 100x faster,因为可以全内存运行,性能提升肯定是很明显的 简单易用,支持 Java.Python.Scala.SQL 等多种 ...
- JMETER 使用BeanShell 配合 if 控制器实现逻辑控制
业务场景 在登录后,我们根据登录的响应,判断是否执行下一步的操作. 实现步骤 1.在登录采样器树中增加BeanShell 监听器. 作用是在线程上下文变量中增加一个变量,表示登录是否成功. beans ...