第六章 高级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函数的更多相关文章

  1. linux高性能服务器编程

    <Linux高性能服务器编程>:当当网.亚马逊 目录: 第一章:tcp/ip协议族 第二章:ip协议族 第三章:tcp协议详解 第四章:tcp/ip通信案例:访问Internet 第五章: ...

  2. Linux 高性能服务器编程——IP协议详解

    1 IP服务特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. 无状态:IP通信双方不同步传输数据的状态信息,因此IP数据包的发送.传输和接收都是无序的.     ...

  3. Linux 高性能服务器编程——多线程编程

    问题聚焦:     在简单地介绍线程的基本知识之后,主要讨论三个方面的内容:    1 创建线程和结束线程:    2 读取和设置线程属性:    3 线程同步方式:POSIX信号量,互斥锁和条件变量 ...

  4. Linux 高性能服务器编程——多进程编程

    问题聚焦:     进程是Linux操作系统环境的基础.     本篇讨论以下几个内容,同时也是面试经常被问到的一些问题:     1 复制进程映像的fork系统调用和替换进程映像的exec系列系统调 ...

  5. Linux 高性能服务器编程——I/O复用

    问题聚焦:     前篇提到了I/O处理单元的四种I/O模型.     本篇详细介绍实现这些I/O模型所用到的相关技术.     核心思想:I/O复用 使用情景: 客户端程序要同时处理多个socket ...

  6. Linux 高性能服务器编程——高性能服务器程序框架

    问题聚焦:     核心章节.     服务器一般分为如下三个主要模块:I/O处理单元(四种I/O模型,两种高效事件处理模块),逻辑单元(两种高效并发模式,有效状态机)和存储单元(不讨论). 服务器模 ...

  7. Linux 高性能服务器编程——Linux服务器程序规范

    问题聚焦:     除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范.     工欲善其事,必先利其器,这篇主要来探 ...

  8. Linux 高性能服务器编程——Linux网络编程基础API

    问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字(so ...

  9. Linux 高性能服务器编程——TCP协议详解

    问题聚焦:     本节从如下四个方面讨论TCP协议:     TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流     TCP状态转移过程:TCP连接的任意一 ...

随机推荐

  1. Jwt身份验证

    转载自博友(TerryTon)  1.因为json是通用的,所以jwt可以在绝大部分平台可以通用,如java,python,php,.net等  2.基于jwt是无状态的,jwt可以用于分布式等现在比 ...

  2. (原创)使用C#开发PLC上位机监控系统客户端应用程序

    PLC客户端监控系统的特点: 0.客户端系统软件可部署在 多个管理层的PC机上,或者需要部署在距离服务器较远区域的PC机上,通过网线连接到服务器端的交换机. 1应用范围: (1)所有客户端都只有监视功 ...

  3. 让div在body中任意拖动

    HTML代码 <div id="idOuterDiv" class="CsOuterDiv"> </div> CSS代码 body { ...

  4. HTNL5-ARIA role属性

    WAI-ARIA Web Accessibility Initiative’s Accessible Rich Internet Applications 无障碍网页倡议–无障碍的富互联网应用,也简称 ...

  5. AMD规范中模块id的命名规则

    AMD 即 Asynchronous Module Definition, 中文是“ 异步模块定义”的意思. AMD 规范制定了定义模块的规则,这样模块和模块的依赖可以被异步加载. AMD 规范只定义 ...

  6. 渗透 Facebook 的思路与发现

    0x00 写在故事之前 身一位渗透测试人员,比起 Client Side 的弱点,我更喜欢 Server Side 的攻击,能够直接控制服务器并获得权限操作 SHELL 才爽 . 当然一次完美的渗透出 ...

  7. Centos7 rsync+inotify实现实时同步更新

    inotify slave部署      把master上指定文件下载到本地的主机指定目录 yum install rsync –y [root@localhost ~]# useradd rsync ...

  8. day 33

    目录 数据库是什么 为什么使用数据库 数据库的分类 关系型(把数据保存在硬盘里) 非关系型(把数据保存在内存里) mysql的架构 初识mysql 操作数据库 增 删 改 查 数据库是什么 数据库即存 ...

  9. MongoDB Spark Connector 实战指南

    Why Spark with MongoDB? 高性能,官方号称 100x faster,因为可以全内存运行,性能提升肯定是很明显的 简单易用,支持 Java.Python.Scala.SQL 等多种 ...

  10. JMETER 使用BeanShell 配合 if 控制器实现逻辑控制

    业务场景 在登录后,我们根据登录的响应,判断是否执行下一步的操作. 实现步骤 1.在登录采样器树中增加BeanShell 监听器. 作用是在线程上下文变量中增加一个变量,表示登录是否成功. beans ...