1

以下のコードを参照してください。

#include < stdio.h >    
#include < fcntl.h >    
#include < stdlib.h >    
#include < string.h >    

int main(int argc,char **argv,char **envp)
{
   int fd;
   size_t sz;
   char filebuffer[1024];
   int loop;
   fd=open("sample",O_RDONLY);
   if(fd==-1)
   {
      perror("");
      exit(1);
   }
   loop=0;
   while(++loop<300)
   {
      lseek(fd,0,SEEK_SET);
      memset(filebuffer,0,1024);
      sz=read(fd,filebuffer,1024);
      printf("%d.sz=%zd\t%s\n",loop,sz,filebuffer);
      sleep(1);
   }
   close(fd);
   return 0;
}

このコードでは、ファイルを読み取ることができます。しかし、読み取り中に同時にファイルを変更する(ファイル「サンプル」を読み取る)場合。その後、変更されたファイルを読み取ることができません。O_SYNC フラグも試しました。それでも、動作していませんが、O_DIRECT is undefined エラーが発生しています。変更を確実に読み取れるようにするにはどうすればよいですか? 2番目に、ファイルの読み取りを閉じて開くと、変更されたファイルを読み取ることができることがわかりました。

質問:
変更されたファイルを閉じたり開いたりせずに読み取るにはどうすればよいですか?

4

3 に答える 3

1

次の質問をしていると思います。

というファイルを開き、sampleそのファイルの最初のブロックを繰り返し読み取るプログラムがあります。それはうまくいきます。ただし、たとえばテキスト エディタを使用してファイルを編集すると、ファイルsampleを閉じて再度開いた場合は表示されますが、プログラムには変更が表示されません。ファイルを閉じて再度開かずに変更を確認するにはどうすればよいですか?

それがあなたの質問なら、答えは次のとおりです。

申し訳ありませんが、テキスト エディターはファイルを変更しないため、できません。古い名前で新しいファイルを作成します。

Unix では、ファイルを開くと、名前のリンクが解除されていても、実際には削除されません。別のプログラムがファイルを「削除」し、同じ名前の新しいファイルを作成した場合、開いているファイルは他のプログラムからアクセスできなくなりますが、ファイルは同じままで、閉じるまで削除されません。 .

ほとんどの Unix テキスト ユーティリティは、「その場で」動作すると主張するもの ( などsed -i) でさえ、実際にはファイルを変更しません。これには、テキスト エディターが含まれます。ファイルが変更されていないため、プログラムはファイルの変更を認識しませ。名前は新しいファイルに付けられています。

したがって、これに対処する唯一の方法は、ファイルを閉じてから再度開くことです。再度開くと、古い名前の新しいファイルが開かれます。

于 2013-10-17T05:56:41.480 に答える