第十六章 关于I/O流分离的其他内容

来源:互联网 发布:openwrt mac地址 编辑:程序博客网 时间:2024/05/17 23:02

 P255~P264

调用fopen函数打开文件后可以与文件交换数据,说明调用fopen函数后创建了“流”Stream。 此处的流是指“数据流动”,通常可以比喻成“以数据收发为目的的一种桥梁”。即数据收发路径、

分离I/O流

2次I/O流分离

    2种方法分离I/O流:第一种是TCP I/O过程Routine分离(通过调用fork函数复制出1个文件描述符,以区分输入和输出中使用的文件描述符) 第十章 多进程服务器(下)

     第二种是 通过2此fdopen函数调用,创建读模式FILE指针(FILE结构体指针)和写模式FILE指针。 第十五章 套接字和标准I/O


分离“流”的好处

第十章的“流”分离目的:

通过分开输入过程(代码)和输出过程降低实现难度

与输入无关的输出操作可以提高速度

第十五章“流”分离的目的:

为了将FILE指针按读模式和写模式加以区分

可以通过区分读写模式降低实现难度

通过区分I/O缓冲提高性能


流分离带来的EOF问题

   第七章介绍过EOF的传递方法和半关闭的必要性。第七章 优雅地断开套接字连接  ,其中 shutdown(sock, SHUT_WR);这个函数是基于半关闭的EOF传递方法。第十章的”流“分离没有问题。但第十五章的基于fdopen函数的流问题则不同,还不知道这种情况下如何进行半关闭

文件描述符的复制和半关闭

终止”流“时无法半关闭的原因 (P259~P260重点阅读)

针对任意的一个FILE指针调用fclose函数时都会关闭文件描述符,也就终止套接字。
销毁套接字时再也无法进行数据交换。

套接字和文件描述符的关系: 销毁所有文件描述符后才能销毁套接字。


复制文件描述符

调用fork函数时将复制整个进程,因此同一进程内不能同时有原件和副本。


同一进程内存在2个文件描述符可以同时访问文件。文件描述符的值不能重复,因此各使用一个整数值。此处的复制,”为了访问同一文件或套接字,创建另一个文件描述符“。

dup & dup2

#include<unistd.h>int dup(int fildes);int dup2(int fildes,int fildes2);
成功时返回复制的文件描述符,失败时返回-1.

fildes:需要复制的文件描述符

fildes2:明确指定的文件描述符整数值

dup2函数明确指定复制的文件描述符整数值。向其传递大于0且小于进程能生成的最大文件描述符时,该值将成为复制出的文件描述符值。



复制文件描述符”流“的分离

无论复制出多少文件描述符,均应调用shutdown函数发送EOF并进入半关闭状态。










原创粉丝点击