【问题标题】:File r/w locking and unlink文件读写锁定和取消链接
【发布时间】:2009-12-15 21:45:06
【问题描述】:

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

我想要以下 API:write(sid,data,timeout)read(sid,data,timeout)remove(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、打开、关闭、取消链接

谢谢。

澄清主要问题是对文件的操作(名称 -- 取消链接)应该通过文件描述符的操作原子地完成 -- 锁定:

  • 打开、取消链接 -- 处理文件
  • fnctl -- 处理描述符

【问题讨论】:

    标签: unix atomic nfs file-locking fcntl


    【解决方案1】:

    这不行吗?

    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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多