TCP/IP网络编程第16章分离I/O流复习总结

利用前面的fork函数可以复制出一个文件描述符,然后区分输入和输出中使用的文件描述符,实际上用fork分离式分开了2个文件描述符的用途,而文件描述符本身不会根据输入和输出进行区分。但也属于IO流分离。

有了上一章标准IO的知识后,可以再进行IO分流。
带着以下目的进行下去:

  • 为了将FILE指针按读模式和写模式加以区分。
  • 通过区分读写模式降低实现难度
  • 通过区分IO缓冲提高缓冲性能。

要实现真正的流分离,不得不考虑这之中带来的EOF的问题。没处理好这个问题并不是真正的流分离。

通过之前的内容很容易想出简易的流分离的方法:

创建完套接字,是文件描述符,使用fdopen转成一个读的FILE结构体指针,一个写的FILE结构体指针就行了。
其实这并不能做到流分离。

因为当fclose读或写其中一个的时候,会将整个套接字都关闭。
咳 继续用图来清晰明了得说明
在这里插入图片描述
直接用fdopen来分开会导致如上图所示的结果。

就是分开的俩个其实对应的是同一个文件描述符,关掉一个都会导致整个文件描述符的关闭,因为该套接字只对应了这一个文件描述符,就紧接着会导致其对应的套接字的关闭。

一个套接字可以对应多个文件描述符,想要通过文件描述符来关闭套接字,需要将所有对应的文件描述都删掉,想要不删掉一个文件描述符就导致整个套接字的关闭,很明显,就需要多弄几个文件描述符出来。

所以我们需要复制一份文件描述符。

像这样 小二!上图~~
在这里插入图片描述
这样,删掉一个FILE指针就只会相应的删掉一个文件描述符,不足以导致套接字的关闭,就好像很完美的实现了IO分流。

是的,很好的实现了IO分流了,然后只需要再关掉某一个的同时用shutdown传递EOF即可。

为什么还得用shutdown,因为fclose并没有传递EOF的功能。那为什么不能用close呢,用fileno转换然后用close????关于这个还得好好研究研究,待补。

最后就只剩下复制文件描述符的具体操作了。
在这里插入图片描述
对于dup2,第二个参数就是它的返回值。

发布了75 篇原创文章 · 获赞 26 · 访问量 7673

猜你喜欢

转载自blog.csdn.net/qq_40962234/article/details/104251034