有什么方法可以从未锁定这些范围的进程中删除文件上的 fcntl 字节范围锁定?
我有几个对文件进行字节范围锁定的进程。我基本上需要想出的是一个外部工具,它可以帮助我删除我指定的文件的字节范围锁定。
有两个选项立即浮现在脑海中。
编写一个内核模块来执行此操作。据我所知,目前还没有内核工具可以做到这一点。(您可以添加一个新命令fcntl()
,赋予超级用户权限或与锁的所有者相同的用户,强制解锁或窃取锁。)
编写一个小型库,用于安装实时信号处理程序,例如SIGRTMAX
. 当此信号被 捕获、发送sigqueue()
并且int
有效负载描述了一个打开的文件描述符时,释放该描述符上的所有字节锁。
或者,您可以让信号处理程序打开并读取文件或管道(例如/tmp/PID.lock
,其中文件或管道包含定义要解锁的文件或文件描述符和字节范围的数据包。
只要在进程开始时加载库(并可能插入所有signal()
和sigaction()
调用以确保您的信号保留在调用链中),这应该可以正常工作。
第二个选项要求您预加载库(通过LD_PRELOAD
环境变量,或使用 为所有二进制文件预加载它/etc/ld.so.conf
)。
插入库一点也不难写。我已经展示了一个使用插入库来监视fork()
调用的示例。在您的情况下,您必须想出一种好方法来定义要解锁的字节范围(在文件或管道中,由信号触发),并在信号处理程序上下文中处理所有这些;但是有足够的异步信号安全低级unistd.h
I/O 函数来执行此操作。