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连接的任意一 ...
随机推荐
- python 面向对象编程、获取对象信息
面向对象与面向过程 参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0 ...
- scarpy设置日志打印级别和存储位置
在settings.py中配置 日志级别设置 LOG_LEVEL = 'ERROR' # 当LOG_LEVEL设置为ERROR时,在进行日志打印时,只是打印ERROR级别的日志 日志存储设置 LOG_ ...
- 【转载】C#中使用Insert方法往ArrayList集合指定索引位置插入新数据
ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,在ArrayList集合操作过程中,可以使用ArrayList集合类的I ...
- CSS文本居中问题
文本水平居中 水平居中比较简单,将对应的html元素text-align属性值为center,其子元素就会水平居中. 文本垂直居中 单行文本垂直居中 设置文本元素的line-height属性值为元素高 ...
- JavaScript 数组(二)数组练习
1.求一组数中的最大值和最小值,以及所在位置(最大值和最小值在这组数中的位置) var numbers = [120, 13, 101, 88, 10, 25]; var max = numbers[ ...
- Java语言的介绍
1. 计算机语言 语言:沟通交流的方式 计算机语言:人与计算机之间的交流方式 java是一门计算机编程语言,也是意大利自行车品牌 软件工程师,java开发工程师 <--------------- ...
- Tachyon内存文件系统快速入门
一.简介 Tachyon是介于磁盘存储和计算框架之间的一种中间件,用于实现分布式的内存文件读写等功能,实现分布式集群内部共享数据. 应用实例: 二.架构 1.心跳机制 在Tachyon中,心跳用于Ma ...
- vue响应式原理,去掉优化,只看核心
Vue响应式原理 作为写业务的码农,几乎不必知道原理.但是当你去找工作的时候,可是需要造原子弹的,什么都得知道一些才行.所以找工作之前可以先复习下,只要是关于vue的,必定会问响应式原理. 核心: / ...
- 虚拟机安装xp系统教程
xp和win7安装过程有区别 xp.iso和win7.iso不一样 安装xp必须用特殊方法,此方法的大致步骤如下: 1.VMware新建xp类型的虚拟机 2.进入xp的PE系统 3.在PE系统分2个区 ...
- 转载_fread函数详解
fread函数详解 函数原型: size_t fread( void *buffer, size_t size, size_t count, FILE *strea ...