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