关闭后等待文件删除
Wait for file removal after close
我正在研究 C/C++ 在 OS X 下实现的配额管理器,它限制特定文件夹的最大大小。在我的项目中,有一些通用的线程工作者可以将新数据写入文件夹或将数据从文件夹移动到服务器。
这样,有时,删除任务可能会删除仍在被另一个线程写入磁盘的文件。
我能以某种方式防止文件在写入过程中被删除吗?我可以实现自己的机制(使用标志、锁等...),但我相信它应该是文件系统 属性。
我试过下面的代码来检查是否删除失败文件仍然打开,但它实际上成功了。
#include <stdio.h>
int main() {
FILE *fp;
fp=fopen("./x", "w");
fprintf(fp, "Testing...\n");
if( remove( "./x" ) != 0 )
perror( "Error deleting file" );
else
puts( "File successfully deleted" );
return 0;
}
如何在删除前强制关闭文件?
您可以使用 chattr(参见:https://en.wikipedia.org/wiki/Chattr)来防止文件被删除。阅读 "Immutable" 属性.
使用lsof
命令检查打开了哪些文件。 (lsof - 列出打开的文件)
例如,您可以使用 -F p 调用 lsof,它将输出前缀为 'p':
的进程的 pid
$ lsof -F p /some/file
p1234
p4567
我正在研究 C/C++ 在 OS X 下实现的配额管理器,它限制特定文件夹的最大大小。在我的项目中,有一些通用的线程工作者可以将新数据写入文件夹或将数据从文件夹移动到服务器。
这样,有时,删除任务可能会删除仍在被另一个线程写入磁盘的文件。
我能以某种方式防止文件在写入过程中被删除吗?我可以实现自己的机制(使用标志、锁等...),但我相信它应该是文件系统 属性。
我试过下面的代码来检查是否删除失败文件仍然打开,但它实际上成功了。
#include <stdio.h>
int main() {
FILE *fp;
fp=fopen("./x", "w");
fprintf(fp, "Testing...\n");
if( remove( "./x" ) != 0 )
perror( "Error deleting file" );
else
puts( "File successfully deleted" );
return 0;
}
如何在删除前强制关闭文件?
您可以使用 chattr(参见:https://en.wikipedia.org/wiki/Chattr)来防止文件被删除。阅读 "Immutable" 属性.
使用lsof
命令检查打开了哪些文件。 (lsof - 列出打开的文件)
例如,您可以使用 -F p 调用 lsof,它将输出前缀为 'p':
的进程的 pid$ lsof -F p /some/file
p1234
p4567