xinetd上的所有程序(我已经读过)都调用fflush()。为什么?
例如,Inetd-Wikipedia
#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;
}发布于 2014-03-29 01:23:10
fopen使用缓冲输入。也就是说,调用fputs将写入内存中的缓冲区,而不需要将数据写入磁盘。调用fflush会强制将输出缓冲区写入磁盘。
您的示例代码正在使用此模式,以便在套接字上写入一些数据后立即编写文件,并且您可以监视该文件以了解所写的内容。
发布于 2014-03-28 23:09:02
我不认为你需要在关门前打电话。我看不出有什么理由在每次放飞后都打电话给富卢什。基本上,您只需要在需要同步一些操作时才需要fflush,但是在大多数情况下,有更好的方法来做到这一点。除非您是数据库开发人员或其他类似的人员,否则通常应该避免混乱。
如果您删除fflush,程序将同样工作,即将stdin转储到一个文件,并在退出时关闭该文件。
而且,我不认为这与inetd或xinetd有任何关系。
正如另一个答案中所写的那样,只有当缓冲区被刷新时,监视文件才会立即显示数据,但是我认为在每次读取之后刷新不是一个好的编程实践。如果您希望始终立即获取数据,最好使用:
setvbuf(fp, NULL, _IONBF, 0)但是,即使这还不够,因为stdin的缓冲(您的数据来源)没有指定AFAIK。您还需要设置以下内容:
setvbuf(stdin, NULL, _IONBF, 0)我认为,如果您想要精确地控制读/写行为,并且不以非POSIX平台为目标,那么您应该总是更喜欢POSIX函数而不是ANSI函数。POSIX open()、read()和write()的语义比fopen()、fread()和fwrite()的语义简单得多。它只是在一个系统调用中读取/写入尽可能多的数据,除了您自己的缓冲区和内核套接字缓冲区之外,没有缓冲。
https://stackoverflow.com/questions/22724183
复制相似问题