IO流分离
在《套接字与标准IO》中介绍,调用fopen函数打开文件后,可以与文件进行交换数据。因此可以说调用fopen函数之后创建了"流(stream)",此处的"指"数据流动,但是通常可以理解为"以数据手法为目的的一种桥梁"。
1. IO分离的方法
在之前的文章中介绍过两种分离IO流的方法,第一种是是在《TCP/IP网络编程(8) 基于Linux的多进程服务器 》中介绍的多进程方式分离IO流,通过调用fork()函数赋值出一个文件描述符,以区分输入和输出中使用的文件描述符;第二种分离是在《套接字与标准IO》中介绍,通过调用fdopen函数,分别创建读模式的FILE结构体指针和写模式的FILE结构体指针,这种方法分离的输出工具和输入工具,因此也可以视为流的分离。
1.2 流分离带来的好处
在不同的应用场景下,流的分离在目的上有不同的差异,在《TCP/IP网络编程(8) 基于Linux的多进程服务器 》中,流分离的目的为:
- 通过分开输入过程和输出过程降低代码实现难度
- 与输入无关的输出操作可以提高速度
在《套接字与标准IO》中,流分离的目的:
- 为了将FILE结构体指针按照读模式和写模式进行区分
- 可以通过区分读模式和写模式降低实现难度
- 通过区分IO缓冲提高缓冲性能
1.3 流分离带来的EOF问题
C的标准IO中EOF的概念:EOF不是一个字符,它只是一个控制条件,函数返回EOF表示当前的调用出现了以下两种情况:
- 文件达到了末尾
- 文件读写过程中出现了错误
EOF的定义为: #define EOF (-1)
1.3.1 例如fgets()函数从stream流中读取一个字符:
int fgets(FILE *stream);
函数的读取过程为:
- 函数每次调用都返回stream流的下一个字符
- 函数的返回类型为
unsigned char
,最终会强制转换为int
进行返回 - 如果读取过程中发生了错误,或者到达了文件的末尾,则会返回EOF,可通过
feof
函数和ferror
函数区分是达到了文件末尾还是发生了错误
1.3.2例如UNIX中的read()函数
ssize_t read(int fd, void *buf, size_t count)
读取过程如下:
- 读取成功,返回读取的字节数
- 返回0表示到达文件末尾
- 读取失败,返回-1
1.4 网络编程中的EOF
在TCP通信中,调用如下语句:
shutdown(sock, SHUT_WR);
是一种基于半关闭的EOF传递方法,此时即发送了EOF,又保证了输入流不关闭,还可以接受对方的信息。那么在《套接字与标准IO》中,在使用fdopen()
的情况下,如何进行半关闭?
示例代码:
标签:读取,函数,IP,分离,TCP,IO,EOF From: https://www.cnblogs.com/ncepubye/p/17017022.html