質問

以下のような問題です。作りたいファイルシステムセッションストレージの各セッションデータを保存することができ簡単という名前のファイルとセッションidを持っています。

いたい以下のAPI: write(sid,data,timeout), read(sid,data,timeout), remove(sid) がsid==ファイル名、または何らかのGCを削除することがすべてのタが入ってこないます。

なかなか簡単に行えば作業工程が若野は自明な場合、複数のプロセスやNFS over.

最も単純な解決というものを考えたとおり:

write/read:
   fd=open(file_name,O_CREAT | O_RDWR); // create a new file or use exsting
   fcntl_lock_file(fd)
   save data to fd/read data from fd
   fcntl_unlock_file(fd)
   close(fd)

GC:
   fd=open(file_name,O_RDWR);
   fcntl_lock_file(fd)
   if(timed_out)
      unlink(file_name)
   fcntl_unlock_file(fd)
   close(fd)

最大の問題としてファイルの削除作業ファイル名、ファイルのロックの作業ファイル 記述子.うものではない以下のシナリオ:

GC - open,
write - open
GC - lock, unlink, unlock, close // file still exists because held by write
write - lock, write, unlock, close // file removed

は誰もいい、という考えにどのような課題ことで解消される可能性があり?ある方々に支持してもらえればと思いき をファイルのロックおよびファイルを削除を操作ファイルの原子?

注記:

  • んを利用したいデータベース
  • 私は、解決のためのUnix
  • 解決すべき標準的なPOSIXのようなfcnl、open、close、リンクを解除

感謝。

Clearification の大きな課題の操作ファイル名のリンクを解除)すべき原子の操作ファイル記述子--ロック:

  • 開放リンクを解除--作業ファイル
  • fnctl--作業を記述子
役に立ちましたか?

解決

ないこと。

write/read:
   fd=open(file_name,O_CREAT | O_RDWR); // create a new file or use exsting
   fcntl_lock_file(fd)
   if stat(file_name).{st_dev, st_ino} != fstat(fd).{st_dev, st_ino}
       unlock, close, retry
   save data to fd/read data from fd
   fcntl_unlock_file(fd)
   close(fd)

の場合 stat 失敗したとEEXIST(ファイル名が存在しない)または、現在のファイルと同じではないので、保釈.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top