我正在处理写入同一目录的多个进程。 我有一个目录dir1 /
我的进程在dir1 /下创建了一个文件a.txt。但是,另一个进程创建a-temp1.txt并将其重命名为a.txt。我无法控制其他进程,因为该代码来自库。我可以阻止重命名a-temp.txt吗?
答案 0 :(得分:0)
你可以,但它不太可能解决你的问题。我强烈怀疑这是一个X-Y problem,几乎可以肯定,正确的解决方案是完全重新设计这个系统的某些部分,可能是通过更改文件名,使用唯一的临时文件,移动到另一个目录,或者重新使用库(库只执行调用者告诉他们做的事情;而库只是代码)。你不应该试图打败另一个过程;你们都在为同一个用户工作。
所有这些都说明了,您可以阻止自己的用户ID重命名文件。只是否认自己的许可。 您可以修改文件:
chmod 400 a.txt
这表示您可以读取该文件但可能无法写入。但是,如果您已经有一个打开的文件句柄,您可以继续使用它(这样您就可以继续写入文件,即使以同一用户身份运行的另一个进程可能不会)。
同样,可以更改目录的权限:
chmod 500 .
这会阻止重命名,因为文件名保存在目录中。
答案 1 :(得分:0)
您可以在HFS +(Mac OS X)文件系统上使用chflags()
来设置UF_APPEND
属性。 (执行man 2 chflags
。)这将允许附加到文件,但不允许删除或重命名,即使是同一个用户。
答案 2 :(得分:0)
您无法做其他进程无法撤消的操作。你最好的希望(除了改变你的程序才能正常工作)是另一个过程不会太难以重命名。也就是说,它尝试简单的方法,如果失败则放弃。
特别是,您可以在任一文件上设置UF_IMMUTABLE
标志,这将阻止重命名一个以替换另一个。您可以使用chflags()
设置标记。使用Cocoa,您还可以使用[someURL setResourceValue:@YES forKey:NSURLIsUserImmutableKey error:NULL]
。
请记住,在删除该标志之前,您将无法以任何其他方式更改文件。如果确定其他进程重命名该文件,则它有权删除该标记,就像您的进程一样。
另外请记住,像这样的系统本身就容易出现竞争。
你真的应该为文件或单独的目录使用单独的名称,或者放弃那些不能为你提供所需控制的库。
答案 3 :(得分:0)
设置用户不可变标志chflags(...,uchg
)。这将阻止其他进程更改您的文件,除非它采取措施清除该位。当然,我不知道其他过程会如何对你做出反应,但这不是问题。