首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xinetd/inetd,服务器为什么要调用fflush()?

使用xinetd/inetd,服务器为什么要调用fflush()?
EN

Stack Overflow用户
提问于 2014-03-28 22:23:03
回答 2查看 822关注 0票数 1

xinetd上的所有程序(我已经读过)都调用fflush()。为什么?

例如,Inetd-Wikipedia

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  const char *fn = argv[1];
  FILE *fp = fopen(fn, "a+");

  if(fp == NULL) 
    exit(EXIT_FAILURE);

  char str[4096];
  //inetd passes its information to us in stdin.
  while(fgets(str, sizeof(str), stdin)) {
    fputs(str, fp);
    fflush(fp);
  }
  fclose(fp);
  return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-29 01:23:10

fopen使用缓冲输入。也就是说,调用fputs将写入内存中的缓冲区,而不需要将数据写入磁盘。调用fflush会强制将输出缓冲区写入磁盘。

您的示例代码正在使用此模式,以便在套接字上写入一些数据后立即编写文件,并且您可以监视该文件以了解所写的内容。

票数 0
EN

Stack Overflow用户

发布于 2014-03-28 23:09:02

我不认为你需要在关门前打电话。我看不出有什么理由在每次放飞后都打电话给富卢什。基本上,您只需要在需要同步一些操作时才需要fflush,但是在大多数情况下,有更好的方法来做到这一点。除非您是数据库开发人员或其他类似的人员,否则通常应该避免混乱。

如果您删除fflush,程序将同样工作,即将stdin转储到一个文件,并在退出时关闭该文件。

而且,我不认为这与inetd或xinetd有任何关系。

正如另一个答案中所写的那样,只有当缓冲区被刷新时,监视文件才会立即显示数据,但是我认为在每次读取之后刷新不是一个好的编程实践。如果您希望始终立即获取数据,最好使用:

代码语言:javascript
复制
setvbuf(fp, NULL, _IONBF, 0)

但是,即使这还不够,因为stdin的缓冲(您的数据来源)没有指定AFAIK。您还需要设置以下内容:

代码语言:javascript
复制
setvbuf(stdin, NULL, _IONBF, 0)

我认为,如果您想要精确地控制读/写行为,并且不以非POSIX平台为目标,那么您应该总是更喜欢POSIX函数而不是ANSI函数。POSIX open()read()write()的语义比fopen()fread()fwrite()的语义简单得多。它只是在一个系统调用中读取/写入尽可能多的数据,除了您自己的缓冲区和内核套接字缓冲区之外,没有缓冲。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22724183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档