精华内容
下载资源
问答
  • 为了方便大家学习高级IO,准备了一份高级IO思维导图
  • 高级IO的五种IO模型

    2018-11-29 00:43:46
    高级IO的五种模型解析

    高级IO

    钓鱼例子

    在五种IO模型中我会嵌入钓鱼的例子说明IO模型

    五种I/O模型

    任何I/O操作无非都是两个过程,第一个是等待,等待I/O操作是否具备条件,第二个则是拷贝,实际过程中,

    阻塞IO(blocking IO)

    为了完成一个功能发起调用,如果当前无法完成,就一直等待,等到其具备条件完成后返回。

    阻塞I/O是最常见的I/O模型,例如所有的套接字,默认都是阻塞方式的。

    钓鱼:我来钓鱼了,我今天的目标是钓一条鱼,所以当我钓到一条之后我就走了,其实我不光要的是结果,我还享受钓鱼的过程。
    阻塞IO

    非阻塞IO(non-blocking IO)

    为了完成一个功能发起调用,即使当前无法完成也立即返回。

    非阻塞的缺点在于如果当前我们需要完成某一功能,但是不具备条件立即返回了,我们需要不断去调用函数反复尝试是否具备读写条件了,这种方式称为轮询,这对CPU资源是一种极大的浪费。

    钓鱼:我又来钓鱼了,我今天的目标还是是钓一条鱼,只是今天我想换一种方式钓鱼,我就扔下鱼竿,看看能不能有鱼咬钩,没有我就把鱼竿拿走了等会再来钓。
    非阻塞IO

    信号驱动式IO(signal-driven IO)

    提前设置好对应功能的信号,当具备条件,就发送信号,接到信号后发起调用,完成I/O操作。

    信号驱动I/O需要提前自定义信号处理方式。

    钓鱼:还是我,又来钓鱼了,我今天的目标还是是钓一条鱼,我今天嫌钓鱼太累了,我先放下鱼竿,然后雇了一个小孩,这个小孩帮我看鱼竿,我就去一边玩炉石去了,钓到鱼了这个小孩就叫我了,我放下手机,把鱼拉上来。
    信号驱动IO

    异步IO(asynchronous IO)

    为了完成一个功能发起调用,但是这个调用可能不具备条件,我也仍然返回,只是不同于非阻塞I/O的是,这次调用之后,当其I/O操作具备条件,那么I/O操作会继续执行,并且通过信号来通知进程I/O操作完成。

    钓鱼:钓鱼真无聊,可是我还要钓啊,我今天的目标还是是钓一条鱼,不过今天钓鱼我懒得管了,雇个人帮我看吧,于是我就扔下鱼竿,找了个小孩帮我看,这个小孩就在这等,我还是玩我的炉石,当鱼咬钩了后,小孩就帮我把鱼捞上来了,然后才告诉我。
    异步IO

    多路复用IO(multiplexing IO)

    我们在发起调用之前并不知晓I/O操作是否具备条件,一旦调用可能无法立即返回,多路转接提供的几种模型帮助我们去监控所需要I/O操作的文件描述符,如果有文件就绪,就会返回通知,没有条件具备就会继续监控,直到有描述符就绪,这个过程是多路转接模型帮助我们监控,我们仍可以执行自己的代码,无需浪费资源一直等待。

    多路转接和阻塞I/O类似,都是一直等待,但是最大的区别在于多路转接技术可以同时等待多个文件描述符的状态,而且无需用户等待,而是交给多路转接模型等待,当其具备读或写条件,就会做相应的处理,多路转接最大的目的就是将串行I/O并行化,提高I/O效率。

    钓鱼:我发誓这是我最后一次钓鱼了,我今天的目标是钓很多鱼,我又雇了上次那个小孩,只不过今天看的鱼竿更多了,每当有鱼咬钩了,小孩就告诉我,我来把对应鱼竿的鱼捞上来。
    多路复用IO

    各个IO模型之间的对比

    对比

    阻塞和非阻塞、同步和异步

    阻塞和非阻塞同步和异步之间的关系有下图,说明了其中的关系。
    各种IO之间的关系

    阻塞和非阻塞

    阻塞和非阻塞是一种状态的形容,针对的是程序的状态,关注点在程序等待调用的时候的状态。
    阻塞:阻塞指的是当调用结果返回之前,当前线程会被挂起,只有在得到结果才会返回。
    非阻塞:不能立刻得到结果,线程也不会挂起,而是立即返回。

    同步和异步

    同步和异步关注的消息的通信机制。
    同步:同步只有调用得到结果才返回,不得到结果就不返回,但是并不代表同步就是阻塞的,同步和阻塞不是一个概念。
    异步:异步指的是当调用发起后,无论是否成功,我都返回,但是返回并没有结果,当这个调用发出后,通过信号或者其他方式通知调用者调用完成,或者通过回调函数处理调用。
    注意:这里的同步不是同步和互斥的同步,那个同步指的是访问临界资源的时序性,这里指的是调用的机制。

    同步和阻塞?

    同步和阻塞不是一个概念

    首先,同步是等待调用 得到结果(不论是否完成IO操作,只要有结果就行) 就才会返回,看似和阻塞类似,但是阻塞是 完成调用(完成IO操作) 才返回,也就是说非阻塞也可以是同步,非阻塞调用发现当前不具备条件,返回一个-1,这个-1也是结果,同步只要得到结果就可以返回了,无论结果是否是我们想要的。

    设置非阻塞IO

    这篇文章只写非阻塞的设置方式,多路转接由于有select和epoll,另外写一篇博客讲。
    接口

    #include <unistd.h>
    #include <fcntl.h>
    int fcntl(int fd, int cmd, .../* arg */);
    // fd	文件描述符
    // cmd	选项
    //		F_DUPFD					复制现有描述符
    //		F_GETFD或F_SETFD		获得/设置文件描述符标记
    //		F_GETFL或F_SETFL		获得/设置文件状态标记
    //		F_GETOWN或F_SETOWN		获得/设置异步IO所有权
    //		F_GETLK,F_SETLK或F_SETLKW	获得/设置记录锁
    

    代码

    获取文件描述符的属性,设置非阻塞

    void SetNonblock(int fd)
    {
    	int flags;
    	if(flags = fcntl(fd, F_GETFL, 0) < 0)
    	{
    		perror("fcntl");
    		return -1;
    	}
    	fcntl(fd, F_SETFL, flags | O_NONBLOCK);
    }
    
    展开全文
  • java高级IO学习

    2013-01-10 22:52:53
    有关java高级io流详解,对java中io流的操作需要注意的地方都有讲解。
  • LInux低级IO和高级IO

    2018-04-09 13:16:14
    打开文件 int open(const char *path, int access,int mode) ...前者属于低级IO,后者是高级IO。 前者返回一个文件描述符,后者返回一个文件指针。 前者无缓冲,后者有缓冲。 前者与 read, write 等配合使

    • 打开文件
    int open(const char *path, int access,int mode)

    FILE *fopen(char *filename, char *mode)

    open和fopen的区别:
    前者属于低级IO,后者是高级IO。
    前者返回一个文件描述符,后者返回一个文件指针。
    前者无缓冲,后者有缓冲。
    前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
    后者是在前者的基础上扩充而来的,在大多数情况下,用后者。
    • 关闭文件
    int close(int fd)

    int fclose(FILE *stream)

    close和fclose的区别:
    前者属于低级IO,后者是高级IO。
    前者和open()配合使用,后者和fopen()配合使用。
    • 写文件
    size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

    int fprintf(FILE *stream, const char *format, ...);

    fwrite()和fprintf()都是高级IO。
    fwrite()是以二进位方式写入文件,fprintf()是将格式化的数据写入文件。

    展开全文
  • 5种高级IO

    2018-08-15 16:07:59
    高级IO 五种IO模型 阻塞IO ⾮阻塞IO IO多路转接 异步IO 信号驱动IO 阻塞IO 在内核将数据准备好之前, 系统调⽤会⼀直等待. 所有的套接字, 默认都是阻塞⽅式。 非阻塞IO 如果内核还未将数据准备好,...

    高级IO

    五种IO模型

    • 阻塞IO
    • ⾮阻塞IO
    • IO多路转接
    • 异步IO
    • 信号驱动IO

    阻塞IO

    在内核将数据准备好之前, 系统调⽤会⼀直等待. 所有的套接字, 默认都是阻塞⽅式。

    非阻塞IO

    如果内核还未将数据准备好, 系统调⽤仍然会直接返回, 并且返回EWOULDBLOCK错误码。

    ⾮阻塞IO往往需要程序员循环的⽅式反复尝试读写⽂件描述符, 这个过程称为轮询. 这对CPU来说是较⼤的浪费, ⼀般只有特定场景下才使⽤.

    信号驱动IO

    内核将数据准备好的时候, 使⽤SIGIO信号通知应⽤程序进⾏IO操作。

    IO多路转接

    IO多路转接能够同时等待多 个⽂件描述符的就绪状态 。

    异步IO

    由内核在数据拷⻉完成时, 通知应⽤程序(⽽信号驱动是告诉应⽤程序何时可以开始拷⻉数据)。

    展开全文
  • 高级io 先介绍记录锁的概念和记录锁的数据结构。然后介绍阻塞io,非阻塞IO,异步io,IO多路转接等概念,后者都是针对前者更优的技术。IO多路转接技术包括:select,peslect,poll。最后介绍存储映射IO。 进程间通信 ...

    高级io
    先介绍记录锁的概念和记录锁的数据结构。然后介绍阻塞io,非阻塞IO,异步io,IO多路转接等概念,后者都是针对前者更优的技术。IO多路转接技术包括:select,peslect,poll。最后介绍存储映射IO。

    进程间通信
    介绍了基本进程间通信机制,包括两大类:

    进程间数据共享:管道,FIFO,消息队列和共享存储
    进程间数据同步:信号量
    网络进程间通信
    介绍网络间的进程通信机制:套接字。首先是如何寻址。然后介绍socket编程的连接建立,数据传输等。

    高级进程间通信
    高级进程间通信提供一种可以在进程间传递文件描述符的机制,包括STREAMS管道和unix域套接字
    【文章福利】小编推荐自己的C/C++Linux群:812855908!整理了一些个人觉得比较好的学习书籍、视频资料共享在里面,有需要的可以自行添加哦!~

    在这里插入图片描述
    在这里插入图片描述

    一. 高级IO

    1. 非阻塞IO
    1.1 概念
    非阻塞io使得与磁盘io有关的系统调用永远不会被阻塞
    这些io相关的系统调用有:open,read,write
    如果这种操作不能完成,则调用立即出错返回
    1.2 如何指定非阻塞io
    如果调用open获得文件描述符,可指定O_NONBLOCK标识
    对于已经打开的文件描述符,可调用fcntl,由该函数打开O_NONBLOCK标识
    2. 记录锁
    2.1 概述
    概念:当一个进程正在读或修改文件的某个部分时,可以阻止其他进程修改同一文件区
    flock:文件锁,早期的unix只支持锁整个文件,使用该函数
    fcntl:记录锁,允许锁文件中的任意字节数的区域
    2.2 fcntl
    在这里插入图片描述cmd:
    F_GETLK:获取锁信息
    F_SETLK:设置锁信息
    F_SETLKW:阻塞版本的F_SETLK
    flockptr:指向flock的指针struct flock{ short l_type;//F_RDLCK共享读锁,F_WRLCK独占写锁,F_UNLCK解锁 off_t l_start;//加锁区域其实位置 short l_whence;//和start一起确定加锁位置 off_t l_len;//加锁长度 pid_t l_pid;//进程id } 复制代码
    不同锁的兼容性:针对同一把锁。如果不同锁,新锁总是覆盖旧锁
    在这里插入图片描述

    2.3 锁的隐含继承和释放
    进程终止时,所建立的锁全部释放
    关闭文件描述符时,文件描述符引用的文件上的任何一把锁都被释放
    fork产生的子进程不继承父类设置的锁
    执行exec后,新进程可以继承原程序的锁
    2.4 FreeBSD中记录锁的数据结构
    在这里插入图片描述

    v节点表的i节点结构串联起所有的lockf结构
    每个lockf结构说明了一个给定进程的一个加锁区域
    在父进程中,关闭任意一个文件描述符,内核都会遍历i节点各项lockf,并释放持有的锁
    3. 系统v流机制
    3.1 基本概念
    STREAMS是系统V提供的构造内核设备驱动程序和网络协议包的一种通用方法。不同于标准io中的stream
    流在用户进程和设备驱动程序之间提供一条全双工通路,流无需和实际硬件设备之间会话
    简单流的基本结构:
    在这里插入图片描述

    3.2 STREAMS消息
    STREAMS的所有输入输出都基于消息
    流首和用户进程进行消息交换的函数:read,write,ioctl,getmsg,getpmsg,putmsg,putpmsg
    消息可以顺流而下,也可以逆流而上
    消息的组成:消息类型,控制信息,数据。控制信息和数据由strbuf指定:
    在这里插入图片描述

    消息约有25种,但一般使用的只涉及三种:
    M_DATA:用户数据
    M_PROTO:协议控制信息
    M_PCPROTO:高优先级协议控制信息
    每个输入STREAMS模块有两个输入队列,一个来自上面模块的消息,另一个来自下面模块的消息
    流中的消息都有一个排队优先级,通过优先级波段指定
    3.3 putmsg和putpmsg
    用于将STREAMS消息写入流中
    后者允许指定优先级波段
    3.4 getmsg和getpmsg
    从流首读STREAMS消息
    4. IO多路转接
    4.1 阻塞io
    读取一个文件描述符对数据,如果没有数据就一直阻塞住
    缺点:长时间阻塞在同一个文件描述符,另一个文件描述符虽然有很多数据却得不到及时处理
    4.2 非阻塞io
    将两个文件描述符都设置为非阻塞的
    对第一个文件描述符发送read,如果该输入上有数据,则读取并处理。如无数据则立即返回。
    第二个描述符重复上一步操作
    若干秒后,重复执行以上步骤,即轮询
    缺点:浪费cpu时间,大多数时间实际上上无数据可读的。轮询的时间间隔也很难确定
    4.3 异步io
    当一个文件描述符已准备好可以进行io时,用一个信号通知它
    缺点:并发所有的系统都支持,其次这种信号对每个进程而言只有一个
    4.4 IO多路转接
    一种比异步IO更好的处理IO的技术
    先构造一张有关描述符的图表,然后调用一个函数,直到这些描述符中至少一个准备好io时,该函数才返回。返回时,告诉哪些文件描述符已准备好可以io
    支持IO多路转接的函数:poll,pselect,select
    4.5 select
    在这里插入图片描述

    readfds:可读描述符集,每一个文件描述符占一位
    内部结构视图
    在这里插入图片描述

    描述符集的设置函数
    在这里插入图片描述

    maxfdp1:最大描述符+1,可设置为FD_SETSIZE(1024)
    writefds:可写描述符集
    exceptfds:异常描述符集
    tvptr:愿意等待的时间
    NULL:永远等待,捕捉到信号则中断等待
    时间每个字段为0:完全不等待,测试指定的文件描述符并立即返回
    不为0:实际等待的时间
    返回值:
    返回-1:表示出错,文件描述符没有准备好时收到信号,此时不修改文件描述符
    返回0:已经超时了,指定都文件描述符都没有准备好
    正数:已经准备好的文件描述符数量(每个文件描述符读写单独各算一次)
    4.6 pselect
    pselect与select类似,仅仅少部分有差异,如下:

    超时值的数据结构不同
    pselect超时值为const,不可改变
    可使用信号屏蔽字
    在这里插入图片描述

    4.7 poll
    在这里插入图片描述

    poll类似与select,不过接口有所不同
    不是为每个状态构造文件描述符集,而是构造一个pollfd的数组,数组每个元素指定文件描述符编号和关心的状态
    在这里插入图片描述

    参数:
    events:用户设置关心的事件
    reevents:内核返回文件描述符事件
    在这里插入图片描述

    5. 异步IO
    5.1 概述
    异步io并不像select和poll对所有文件描述符都生效

    SystemV系统:只对STREAMS设备和STREAMS管道起作用,发送SIGPOLL信号
    BSD系统:只对终端和网络起作用,发送SIGIO信号
    5.2 SystemV异步IO
    启动异步IO,需要调用ioctl,第二个参数为I_SETSIG
    同时,在调用ioctl之前建立信号处理程序
    5.3 BSD异步IO
    异步IO是SIGIO(通用异步io)和SIGURG(通知网络进程数据到达)两个信号的组合

    调用signal或signalaction为SIGIO建立信号处理程序
    以命令F_SETOWN调用fcntl设置进程id和进程组id,将接收对于该描述符的信号
    以命令F_SETFL调用fcntl设置O_ASYNC文件状态标识,使文件描述符上可以进行异步IO
    6. readv和writev
    用于在一次函数调用中读写多个非连续的缓冲区
    在这里插入图片描述

    7. readn和writen
    按需多此调用read和write,直至读写了N各字节数据
    使用与读写管道,网络设备或终端数据
    在这里插入图片描述

    8. 存储映射IO
    使一个磁盘空间与一个存储空间中的缓冲区映射。当从缓冲区取数据,就相当于读文件中的相应字节。写数据到缓冲区相当于自动写入文件。这样就可以不用read和write的情况下执行io
    文件映射到存储区:
    在这里插入图片描述

    addr:存储映射起始地址,通常设置为0,表示由系统选择地址然后作为返回值返回
    port:说明对存储映射区的保护要求,权限不能超过文件本身权限
    PORT_READ:映射区可读
    PORT_WRITE:映射区可写
    PORT_EXEC:映射区可执行
    PORT_NONE :映射区不可访问
    flag:
    MAP_FIXED:返回值必须等于addr,不利于移值
    MAP_SHARED:存储操作的配置
    MAP_PRIVATE:创建私有副本
    更改存储映射区权限:mprotect
    刷新映射存储区:msync
    解除存储映射区:munmap

    二. 进程间通信

    进程间通信机制包括:

    经典IPC:管道,FIFO,消息队列,信号量,共享存储
    网络IPC:套接字
    1. 管道
    1.1 概述
    最古老的ipc机制
    管道有两个局限性:
    历史上,它是半双工的,即数据只能在一个方向流动。虽然现在某些系统提供全双工,但是为了移植性,不假定它有此特性
    他们只能在具有公共祖先的进程之间使用
    尽管有局限性,半双工管道仍然是最常用的ipc
    若write写一个尚无进程为读而打开的管道,产生SIGPIPE信号
    若管道的最后一个写进程关闭该管道,则为管道的读进程产生文件结束标识
    1.2 管道的创建
    在这里插入图片描述

    参数fields传入两个文件描述符,field[0]为读而打开,field[1]为写而打开,field[1]的输出是field[0]的输入
    管道模型:
    在这里插入图片描述

    1.3 popen和pclose
    在这里插入图片描述

    popen先执行fork,然后调用exec以执行cmdstring,并返回标准io文件指针。如果type=“r“,文件指针连接到cmdstring的标准输出。如果type=“w”,文件指针连接到cmdstring的标准输入
    pclose关闭标准io流
    1.4 FIFO
    FIFO也成为命名管道,通过FIFO,不相关的进程也能交换数据
    创建FIFO:
    在这里插入图片描述

    mode参数与open函数一致
    非阻塞标准O_NONBLOCK:
    没有指定该参数:只读open要阻塞到某个其他进程为写而打开此FIFO
    指定该参数:只读open立即返回。没有进程打开FIFO,将出错返回-1
    类似与管道,若write写一个尚无进程为读而打开的FIFO,产生SIGPIPE信号。若FIFO的最后一个写进程关闭该FIFO,则为FIFO的读进程产生文件结束标识
    PIPE_BUF说明了可被原子写到FIFO的最大数据量
    FIFO的用途
    由shell命令使用,以便将数据从一条管道线传到另一条,无需创建中间临时文件
    用于客户-服务器进程中,以在客户进程和服务器进程间传递数据
    2. XSI IPC
    消息队列,信号量和共享存储,这三种IPC称做XSI IPC,他们之间有很多共性,包括:

    2.1 标识符和键
    标识符:唯一标识IPC对象的内部名,非负整数
    键:IPC对象的外部名,使多个合作进程能在同一个IPC对象上会合。键基本数据类型为key_t
    客户进程和服务器进程在同一IPC上会合的方法:
    服务器进程指定键IPC_PRIVATE创建一个新的IPC结构,将返回的标识符放到某处(文件)给客户进程使用。缺点:要分别读写文件
    在公共头文件中定义一个键,服务器进程指定该键创建IPC结构。缺点:可能IPC已经存在,获取时会出错
    客户进程和服务器进程认同一个路径名和项目id,接着调用ftok将两个值变换为键,再调用方法2
    2.2 权限结构
    XSI IPC为每个IPC结构设置了一个ipc_perm结构,规定了权限和所有者。
    在这里插入图片描述

    2.3 结构限制
    三种形式的IPC都有内置限制
    2.4 优点和缺点
    缺点
    IPC结构是在系统范围内起作用的,没有访问计数
    IPC结构在文件系统中没有名字,不能修改属性,不能ls查看IPC对象,不能用rm删除,也不能用chmod修改权限。不能用文件描述符,也就不能使用select,poll模型
    优点
    可靠
    流是受控的:缓冲区资源紧张,进程就休眠
    面向记录
    可以用非先进先出方式处理
    特征对比
    在这里插入图片描述

    3. 消息队列
    3.1 概述
    消息的链接表,存放在内核中,由消息队列标识符标识
    最开始出现的为了提供比一般IPC更高速度的通讯方式,但现在速度上没有优势,已经不再使用了
    创建或打开队列:msgget
    发送消息:msgsend
    获取消息:msgrcv,不一定先进先出,可按消息的类型字段取
    3.2 数据结构
    每个队列相关的数据结构
    在这里插入图片描述

    消息队列在各个系统中的参数限制
    在这里插入图片描述

    3.3 msgctl函数
    msgctl函数对队列执行多装操作(类似于ioctl,垃圾桶函数)
    在这里插入图片描述

    cmd:要执行的命令
    IPC_STATE:获取msgid_ds结构,并放入buf参数
    IPC_SET:按buf值,设置数据
    IPC_RMID:删除队列和数据
    3.4 msgsend函数
    在这里插入图片描述

    ptr:指向消息内容指针,消息的组成:
    类型:正长整型类型
    长度
    实际数据
    flag:标志
    IPC_NOWAIT:非阻塞io
    3.5 msgrcv函数
    在这里插入图片描述

    ptr:获取的数据地址,包括类型和实际数据
    nbytes:数据缓冲区长度
    type:获取哪种消息。
    type=0:返回队列中第一条消息
    type>0:返回消息类型为type的第一个消息
    type<0:返回消息类型小于等于type绝对值的消息
    flag:
    IPC_NOWAIT:非阻塞
    4. 信号量
    4.1 概述
    信号量不同于管道和消息队列,它是一个计数器,用于多进程堆共享数据对象的访问
    信号量计数操作必须是原子的,通常在内核中实现
    使用信号量获取共享资源的操作
    测试该资源的信号量N
    若N为正,则进程可以使用该资源。然后N=N-1,表示使用了一个资源单位
    若N=0,则进程休眠,直到N>0才唤醒,然后第一步
    当进程不使用共享资源时,N=N+1,如果有进程在休眠等待则唤醒
    XSI信号量相对复杂一些
    信号量并发单个非负值,而是一个或多个信号量值的集合
    创建信号量和赋值是分开的,不能原子的创建信号集合
    即使没有进程在使用信号量,他仍然存在
    获得一个信号量ID:semget
    4.2 数据结构
    内核为每个信号量集合设置了一个semid_ds结构
    在这里插入图片描述

    每个信号量的结构
    在这里插入图片描述

    信号量的系统限制
    在这里插入图片描述

    4.3 semctl函数
    包含多种信号量操作
    在这里插入图片描述

    cmd:
    IPC_STAT:取semid_ds结构
    IPC_SET:设置数据
    IPC_RMID:删除信号量集合
    4.4 信号量与记录锁在liunx的对比
    记录锁比信号量耗时
    但如果只锁一个资源,宁可用记录锁。因为他使用简单,进程终止时会自动清理锁

    5. 共享存储

    5.1 概述
    共享存储允许两个或更多进程共享给定的存储区
    数据不需要在进程间复制,是最快的IPC
    多进程对于同一个存储区,要注意同步访问,通常使用信号量来进行同步
    获取共享存储区域id:shmget
    共享存储的位置:栈下面
    在这里插入图片描述

    5.2 数据结构
    内核为每个共享存储段设置了shmid_ds结构
    在这里插入图片描述

    共享存储的系统限制
    在这里插入图片描述

    5.3 shmctl函数
    包含堆共享存储的多种操作
    在这里插入图片描述

    参数同前面
    5.4 共享存储的使用
    shmat函数:进程用于连接共享存储到其他的地址空间中
    在这里插入图片描述

    addr参数:
    为0:连接到由内核选择的可以地址上,推荐方式
    非0:且没有指定SHM_RND,连接到该地址
    非0:指定SHM_RND,将地址向下取最低边界地址倍数
    flag:
    SHM_RDONLY:只读
    其他:读写
    5.5 共享存储的释放
    shmdt:脱离该段,但并不删除数据,标识符还在,直到调用shmctl删除

    三. 网络进程间通信:套接字

    1. 套接字描述符
    套接字是通信端点的抽象,是用文件描述符实现的
    创建套接字描述符:
    在这里插入图片描述

    domain:套接字域
    在这里插入图片描述

    type:套接字类型
    在这里插入图片描述

    protocol:协议,通常为0。表示根据套接字类型默认选择协议
    关闭套接字:close
    shutdown:禁止套接字上的输入/输出,可只关闭一个方向
    2. 寻址
    2.1 字节序
    大端字节序:最大字节地址对应于数字最低有效字节
    小段字节需:最小字节地址对应于数字最低有效字节
    各个平台的字节序如下:
    在这里插入图片描述

    网络传输中:tcp/ip使用大端字节序
    2.2 地址格式
    地址标识了套接字端点,通用地址格式为:

    struct sockaddr{
        sa_famliy_t sa_famliy;
        char        sa_data[];
    }
    

    套接字实现可以自由添加aa_data字段以及长度

    //linux实现
    struct sockaddr{
        sa_famliy_t sa_famliy;
        char        sa_data[14];
    }
    //freeBSD实现
     struct sockaddr{
        unsigned char sa_len;
        sa_famliy_t sa_famliy;
        char        sa_data[14];
    }
    

    ipv4套接字通用地址:,实现者可以自由添加额外字段
    在这里插入图片描述

    ipv6套接字通用地址:实现者可以自由添加额外字段
    在这里插入图片描述

    sockaddr_int和sockaddr_int6都会被转化为sockaddr结构传入套接字例程中
    二进制地址与文本格式地址转化:inet_ntop,inet_pton
    2.3 地址查询
    查找给定计算机主机信息:gethostent
    在这里插入图片描述

    返回的主机信息数据结构:
    在这里插入图片描述

    获取网络名字和网络号
    在这里插入图片描述

    获取协议名字和协议号
    在这里插入图片描述

    服务名字和端口号映射关系查询
    在这里插入图片描述

    将主机名和服务名映射到一个地址
    在这里插入图片描述

    地址信息包含的成员
    在这里插入图片描述

    2.4 将套接字与地址绑定
    客户端套接字关联地址没有太大意义,可以让系统选一个默认地址
    服务端需要给一个客户端请求的套接字绑定一个众所周知的地址
    客户端绑定服务端地址的方法:
    在这里插入图片描述

    3. 建立连接
    3.1 connect
    在这里插入图片描述

    connect为客户端调用,用于连接请求
    addr为服务器地址
    如果sockfd没有绑定地址,connect会给调用者绑定一个默认地址
    连接可能失败,应用程序必须能处理connect返回的错误
    3.2 listen
    在这里插入图片描述

    listen为服务端调用
    服务器用listen宣告可以接受连接请求
    backlog:连接请求数量
    3.3 accept
    在这里插入图片描述

    accept获得连接请求,并建立连接
    返回的文件描述符是套接字描述符,描述符连接到调用connect到客户端
    新的套接字描述符和原始套接字sockfd具有相同的套接字类型和地址族
    传给accept的原始套接字没有关联到这个连接,而是继续保存可以状态并接受其他连接请求
    如果没有连接请求等待处理,accept会阻塞直到有请求到来
    4. 数据传输
    4.1 send
    在这里插入图片描述

    发送数据,类似与write函数
    send比write多了第四个参数flags,用于改变处理数据到传输方式
    MSG_DONTROUTE:勿将数据路由出本地网络
    MSG_DONTWAIT:允许非阻塞操作
    MSG_EOR:记录结束
    MSG_OOB:外带数据
    sendto函数:类似send。但是sendto允许在勿连接到套接字上指定一个目标地址
    4.2 recv
    在这里插入图片描述

    获取数据,类似于read函数
    recv比read多了第四个产生flags,用于控制如何接收数据
    MSG_OOB:接受外带数据
    MSG_PEEK:返回报文内容而不真正取走报文
    MSG_TRUNC:即使报文被截短,也返回实际的长度
    MSG_WAITALL:等待直到所以数据可用

    5. 套接字选项

    5.1 套接字选项包括
    通用选项,工作在所有套接字类型上
    在套接字层次管理的选项,但是依赖底层协议的支持
    特定与某种协议的选项,为某个协议独有
    5.2 设置套接字的函数
    在这里插入图片描述

    6. 带外数据
    带外数据是一些通信协议支持的可选特征,允许高优先级的数据比普通数据优先传输
    TCP将外带数据成为“紧急数据”

    四. 高级进程间通信

    1. 概述
    Streams管道和unix套接字,这两种高级IPC,可以在进程间传递文件描述符
    服务进程可以使他们的打开文件描述符与特定的名字相关联
    客户进程可以使用这些名字与服务器通信
    操作系统会为每个客户进程提供一个独自的IPC通道
    2. STREAMS管道
    Streams pipe是一个全双工(双向)通道
    内部结构如下
    在这里插入图片描述

    3. UNIX域套接字
    用于在同一台机器上运行的进程之间通讯

    展开全文
  • 高级IO: 五种典型IO: 阻塞IO/非阻塞IO/信号驱动IO/异步IO/IO多路转接 IO多路转接模型:select/poll/epoll 五种典型IO 阻塞IO IO操作的流程:等待IO操作条件具备,然后进行数据拷贝 为了完成IO操作发起调用,若当前...
  • LINUX 高级IO操作

    千次阅读 2011-12-23 15:49:36
    LINUX 高级IO操作 一 知识点非常重要 二 非阻塞的IO  系统调用: 低速系统调用,其他系统调用  低速系统调用的类别:  1)读网络设备,终端,管道等,暂时没有数据输入,则阻塞读操作  2)同上的写操作...
  • UNIX网络编程笔记(10)—高级IO函数

    千次阅读 2016-07-23 16:45:50
    高级IO函数
  • 课程内容:1.非阻塞IO 如何将阻塞的读写设置为非阻塞的读写。2.文件锁 1)使用fcntl函数实现 2)使用flock函数实现3.多路IO select方式,poll方式。 4.异步IO5.存储映射
  • 以前,只是的确听说过有“高级IO“,也确实见过、用过,但一直以来真的没注意到”为什么那些接口是高级的?“ 昨儿算是弄明白了,就是大家常说的“零拷贝”,不需要数据在应用空间与内核空间之间来回复制! 通过图...
  • 九.linux中的高级IO

    千次阅读 2019-04-30 21:06:19
    笔记地址:...type=note 前面第一节我们学习了对IO的open、read、write等阻塞式文件操作,这一篇我们将会学习对IO的一些高级操作。 2019/04/30 20:51 目录 一、非阻塞IO的引入 1、阻塞...
  • ;非阻塞IO;多路IO;select;select;select;select;select;select;select;pselect;pselect;pselect; poll;poll;poll;内存映射;内存映射;内存映射;内存映射;内存映射;内存映射;其他问题
  • 14 高级IO非阻塞IO:这里我要抽时间看看AIO的使用。记录锁:运行一个进程修改一个文件的一部分的时候,禁止其进程修改统一区域。流在用户经常和设备驱动程序间提供了一个全双工通道。readv和writev:散布读和聚集写...
  • java之十 高级IO

    千次阅读 2016-05-24 19:20:59
    java.io定义的输入/输出类列于下表: ObjectInputStream.GetField和ObjectOutputStream.PutField是Java2新添的内部类。 java.io包还包含两个不受java2欢迎的类,这两个类没有在上表中列出:...
  • 主要介绍了UNIX中所得机制,以及非阻塞IO的一些操作。
  • epoll/poll/epoll & 高级IO详解

    千次阅读 2019-01-22 14:06:16
    五种IO模型 阻塞IO 阻塞IO:在内核将数据准备好之前,系统调用会一直等待,所有的套接字,默认都是阻塞方式 非阻塞IO 非阻塞IO:如果内核的还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK...
  • Java语言中数据流是发送或接收数据的管道。通常,你的程序是流的一个端点,其它程序或文件是流的另一个端点。 流的单向性:源端点和目的端点分别叫做input stream(输入流)和output stream(输出流)。...
  • 一、阻塞式IO的困境 1、程序中读取键盘 int main(void) { // 读取键盘 // 键盘就是标准输入,stdin char buf[100]; memset(buf, 0, sizeof(buf)); printf("before read.\n"); read(0,
  • 13.高级IO和多线程和线程同步

    千次阅读 2016-10-21 22:28:08
    13.1.阻塞式和非阻塞式IO 13.2.进程和线程的对比 13.3.线程同步之信号量+互斥锁+条件变量
  • 打开文件系统 OpenFileSystem是一个.net框架,可为包括内存在内的多个文件系统提供统一的抽象。
  • 一、并发式IO的解决方案 所谓并发式IO,即上节中提及的鼠标和键盘都已经启动。 1、非阻塞式IO 使用fcntl函数, 将上节中阻塞式的鼠标和键盘读取改为非阻塞式的。 #include #include #include #include #...
  • :用于IO的用户数据 2. M_PROTO :协议控制信息 3. M_PCPROTO :高优先级控制信息  当然,也会有一些别的消息类型,例如,如果流首收到了一个来自下方的 M_SIG 消息,它就会产生一个信号。 我们要...
  • 1 #include<iostream> 2 #include<sys/select.h> 3 #include<unistd.h> 4 #include<stdio.h> 5 using namespace std; 6 int main() 7 { 8 fd_set readfds;... 29 }
  • IO:输入输出 过程:等待IO就绪,进行数据拷贝 四种典型IO方式: (1)阻塞IO:发起IO调用,若IO未就绪(IO条件不具备)则一直等待 (2)非阻塞IO:发起IO调用,若IO未就绪(IO条件不具备)则立即报错返回,...
  • 高级API io

    2018-01-02 15:49:25
    高级API第一课io,还有课堂视频和高级API全课的想要关注发QQ给你百度云链接。
  • IO高级编程

    2008-06-06 16:25:47
    记录了IO高级编程的零碎知识点

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 177,995
精华内容 71,198
关键字:

高级IO