linux下标准io缓冲问题

Henryinferno 2014-08-24 05:35:26
《UNP》上说:
标准IO流是全双工的:只要以r+类型打开流即可。然而在这样的流上,我们必须在调用一个输出函数之后插入一个fflush等调用才能接着调用一个输入函数……
解决上述读写问题的最简单方法是为一个给定套接字打开两个标准IO流:一个用于读一个用于写。


/*服务器用来执行回显IO操作的函数*/
#include "unp.h"

void
str_echo(int sockfd)
{
char line[MAXLINE];

FILE *fpin, *fpout;

fpin = Fdopen(sockfd, "r");
fpout = Fdopen(sockfd, "w");

while (Fgets(line, MAXLINE, fpin) != NULL)
Fputs(line, fpout);



/*
FILE *fstream;

fstream=Fdopen(sockfd,"r+");

while(Fgets(line,MAXLINE,fstream)!=NULL)
Fputs(line,fstream);
*/
}

当启动整个服务器程序(没有注释掉的代码),然后启动客户程序在终端输入一行后,不会立刻回显,只有在ctrl+D后才输出全部回显行。
当启动整个服务器程序(改用注释掉的代码),就能每输入一行立刻得到服务器程序的回显结构。

为什么对于一个描述符打开两个流一个用于读一个用于写就是全缓冲,而打开一个进行读和写的流就是行缓冲的?
书上说打开两个流一个用于读一个用于写可以解决读写问题是是什么读写问题?感觉和书上说的完全相反啊
...全文
249 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
moquan1100 2014-08-26
  • 打赏
  • 举报
回复
是这样的,读写操作很多时候都是在虚拟磁盘上操作的。 比如写文件,当你调用write函数之后,你buffer中的内容并不是马上写到文件,而是通过文件系统暂时放在缓存中, 当内存页变赃后才会写到磁盘中,而用fflush想当与跳过这个过程直接写到磁盘中。
赵4老师 2014-08-25
  • 打赏
  • 举报
回复
When the "r+", "w+", or "a+" access type is specified, both reading and writing are allowed (the file is said to be open for “update”). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, fseek, or rewind operation. The current position can be specified for the fsetpos or fseek operation, if desired.
羽飞 2014-08-25
  • 打赏
  • 举报
回复
引用 4 楼 wsx199397 的回复:
[quote=引用 3 楼 hnwyllmm 的回复:] 很奇怪,我没有看过这本书,也没有见过这样的说法,并且我们操作像Socket(TCP协议时)这种全双工的流时,开两个线程,同时对一个描述字做读写操作
是指的一个线程用于读一个线程用于写吗?在实际应用中我也觉得应该是你说的做法,对socket的io操作是通过什么进行的?应该不会用标准io了吧[/quote] 标准IO也可以,我是直接用标准IO的 既然是全双工的,自然是读写可以同时进行的,就是有缓冲,也是读写缓冲分开的,最典型的就是控制台,也没有见谁用了print再scanf之前刷新一把标准输出的
Henryinferno 2014-08-25
  • 打赏
  • 举报
回复
引用 3 楼 hnwyllmm 的回复:
很奇怪,我没有看过这本书,也没有见过这样的说法,并且我们操作像Socket(TCP协议时)这种全双工的流时,开两个线程,同时对一个描述字做读写操作
是指的一个线程用于读一个线程用于写吗?在实际应用中我也觉得应该是你说的做法,对socket的io操作是通过什么进行的?应该不会用标准io了吧
羽飞 2014-08-25
  • 打赏
  • 举报
回复
很奇怪,我没有看过这本书,也没有见过这样的说法,并且我们操作像Socket(TCP协议时)这种全双工的流时,开两个线程,同时对一个描述字做读写操作
qzw405 2014-08-25
  • 打赏
  • 举报
回复
不太懂,顶一下吧
Henryinferno 2014-08-25
  • 打赏
  • 举报
回复
For files open for update (those which include a "+" sign), on which both input and output operations are allowed, the stream shall be flushed (fflush) or repositioned (fseek, fsetpos, rewind) before a reading operation that follows a writing operation. The stream shall be repositioned (fseek, fsetpos, rewind) before a writing operation that follows a reading operation (whenever that operation did not reach the end-of-file 看来对于一个 socket for update,每次在读操作是实现会自动刷新缓冲区,将上次读操作的内容从缓冲区写到socket。而对于一个socket only for write or read,只有我们显示调用上述说的函数或缓冲区满时才写到socket。

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧