|
1
2
这并不是对上述问题的回答,而是一个示例程序,说明如何使用特定于Linux的文件租约来可靠地检测当前机器上对本地文件的访问是独占的;也就是说,文件不会被同一台机器上的任何其他进程打开。授予写租约后,当任何其他进程尝试打开写租约文件时,会通知原始进程。 写释放.c :
使用编译以上内容
普通用户只能对自己拥有的文件进行租用。然而,对任意文件进行租约不需要完全的超级用户权限;这个
将功能添加到二进制文件中;然而,这意味着任何用户都可以运行它,并对他们想要的任何文件进行写租约。(除非你先审查程序,以确保不会造成安全风险,否则你不应该这样做!不过,这很好 用于在自己的系统上测试 .)
在一个终端窗口中,租用一些文件,可能是
如果文件未被任何进程打开,它将输出如下内容
请注意,许多编辑器(如
如果文件已经打开(例如,
如果租约成功,您可以使用中断程序
Ctrl键
+
C
(发送一个
然后退出。 局限性 : 如上所述,这只能可靠地检测文件是否被另一个进程打开或截断。如果文件或其任何父目录被重命名,则不会捕获该文件。您需要将fanotify或dnotify手表添加到目录(以及直到挂载点的父目录)以捕获这些手表。当然,这些只会发生 事后诸葛亮 ,与文件租用信号不同。然而,对于原木旋转,这不应该是一个问题。 只能租用本地文件。对于日志文件,这应该不是问题,因为它们肯定应该是本地的。(对于远程日志记录,您应该重定向整个系统日志,而不是对日志文件使用网络共享。)
当另一个进程试图在您有写租约的情况下打开文件时,无法无限期地阻止打开。(当然,您可以检测到试图打开它的进程,然后发送它
即使租约所有者重命名文件,或将其移动到同一装载上的另一个目录中,打开程序仍将打开(重命名/移动的)文件。从根本上说,当租约信号发出时,开放已经在进行中,我们只能延迟几秒钟,而不是取消它。 |
|
|
2
1
我建议你描述一下实际的问题。 通常,由于文件可以随时打开,因此检查结果会立即失效。此外,即使没有用户空间用户,i_count也会被删除。 |
|
|
3
0
你试过用吗 lsof公司 ,用户空间实用程序? A tutorial . |
|
|
4
0
当对内核对象(设备文件)调用Open()系统调用时,内核会创建一个开放文件描述符结构:struct-file* 每次对设备文件发出open()sys调用时,总是在内核中分配一个新的struct文件*。 目标是,对于每个open(),驱动程序中应该有且只有一个释放方法调用。 如果进程在设备文件/内核对象上发出n个open()sys调用,则会在内核中创建n个结构文件结构。 现在,如果进程是fork()/dup(),则不会在内核中创建新的结构文件。仅增加现有结构文件结构的引用计数。此引用计数表示共享文件描述符的进程数。 发出close()时,结构文件的引用计数将减少。若它达到0,则在驱动程序中调用release方法。 这就是如何确保每个open()只有一个release()调用。 因此,在某种程度上,它不是索引节点->icount,但filp->f_count,表示共享同一文件描述符的进程数。 |
|
|
diviquery · 每个CPU阵列的BPF是否未初始化为零? 2 年前 |
|
|
Shazer · 在页面缓存层Android上测量执行时间 2 年前 |
|
|
joe kiya · 高cpu使用率:scsi_eh_1 3 年前 |
|
|
grandzello · 设备树:无pinctrl句柄 3 年前 |
|
Fnr · Linux内核配置官方文档 8 年前 |
|
|
Zohar81 · 在网络上设置双机内核调试 8 年前 |