Unix 文件r/w锁定和取消链接
我有以下问题。我想创建一个基于文件系统的会话存储,其中每个会话数据都存储在名为sessionid的简单文件中 我需要以下API: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
写入(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。