1

xinetd (私が読んだもの) 上のすべてのプログラムは、fflush() を呼び出します。なんで?

たとえば、Inetd-ウィキペディア

#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;
}
4

2 に答える 2

0

fopenバッファリングされた入力を使用します。つまり、呼び出しfputsはメモリ内バッファーに書き込み、データをディスクに書き込む必要はありません。を呼び出すfflushと、出力バッファーが強制的にディスクに書き込まれます。

サンプル コードはこのパターンを使用しているため、ソケットにデータが書き込まれるとすぐにファイルが書き込まれ、ファイルを監視して何が書き込まれたかを知ることができます。

于 2014-03-29T01:23:10.133 に答える
0

fclose の直前に fflush を呼び出す必要はないと思います。各 fputs の後に fflush を呼び出す理由がわかりません。基本的に、いくつかのアクションを同期する必要がある場合にのみ fflush が必要ですが、ほとんどの場合、それを行うためのより良い方法があります。あなたがデータベース開発者であるか、それに沿った何かでない限り、IMOは一般的にfflushを避けるべきです。

fflush を削除すると、プログラムは同様に機能します。つまり、stdin をファイルにダンプし、終了時にファイルを閉じます。

また、inetd や xinetd とは関係ないと思います。

別の回答に書かれているように、ファイルを監視すると、バッファがフラッシュされた場合にのみデータがすぐに表示されますが、読み取りごとにフラッシュするのはプログラミングの悪い方法だと思います。常にすぐにデータを取得したい場合は、次を使用することをお勧めします。

setvbuf(fp, NULL, _IONBF, 0)

しかしstdin、データのソースであるバッファリングが指定されていないため、それでも十分ではありません。それも設定する必要があります:

setvbuf(stdin, NULL, _IONBF, 0)

読み取り/書き込み動作を正確に制御したい場合や、非 POSIX プラットフォームを対象としていない場合は、常に ANSI 関数よりも POSIX 関数を優先する必要があると思います。POSIX open()read()およびのセマンティクスは、 、およびのセマンティクスwrite()よりもはるかに単純です。1回のシステムコールで可能な限り多くのデータを読み書きするだけで、独自のバッファと、必要なときにいつでもデータを提供するカーネルソケットバッファ以外にバッファリングはありません。fopen()fread()fwrite()

于 2014-03-28T23:09:02.043 に答える