Unix 文件r/w锁定和取消链接

Unix 文件r/w锁定和取消链接,unix,atomic,nfs,file-locking,fcntl,Unix,Atomic,Nfs,File Locking,Fcntl,我有以下问题。我想创建一个基于文件系统的会话存储,其中每个会话数据都存储在名为sessionid的简单文件中 我需要以下API:写入(sid,数据,超时),读取(sid,数据,超时),删除(sid) 其中sid==文件名,我还希望有某种GC可以删除所有超时会话 如果您使用单个进程,则任务非常简单,但在使用多个进程或甚至通过NFS时,任务绝对不是微不足道的 我想到的最简单的解决方案是: write/read: fd=open(file_name,O_CREAT | O_RDWR); // c

我有以下问题。我想创建一个基于文件系统的会话存储,其中每个会话数据都存储在名为sessionid的简单文件中

我需要以下API:
写入(sid,数据,超时)
读取(sid,数据,超时)
删除(sid)
其中sid==文件名,我还希望有某种GC可以删除所有超时会话

如果您使用单个进程,则任务非常简单,但在使用多个进程或甚至通过NFS时,任务绝对不是微不足道的

我想到的最简单的解决方案是:

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、unlink)配合使用
谢谢

清除主要问题是对文件的操作(名称--取消链接)应该与文件描述符的操作(锁定)一起原子化完成:

  • 打开、取消链接--处理文件
  • 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(文件名不存在)或显示当前文件与您打开的文件不相同,请退出。

      我认为这应该有效!非常感谢,这个防御将连接路径和fd。