从其他进程强制删除fcntl锁

时间:2013-07-26 15:46:13

标签: c linux locking fcntl

有什么方法可以从没有锁定这些范围的进程中删除文件上的fcntl字节范围锁?

我有几个进程将字节范围锁定放在文件上。我基本上需要提供的是一个外部工具,它可以帮助我删除我指定的文件的字节范围锁。

1 个答案:

答案 0 :(得分:1)

有两种选择可以立即浮现在脑海中。

  1. 编写内核模块来执行此操作。 据我所知,目前没有内核工具可以做到这一点。 (您可以向fcntl()添加一个新命令,该命令给予超级用户权限或与锁的所有者相同的用户,强制解锁或锁定窃取。)

  2. 编写一个小型库,安装一个实时信号处理程序,比如SIGRTMAX。当sigqueue()发送此信号并且int有效负载描述打开的文件描述符时,释放该描述符上的所有字节锁。

    或者,您可以打开信号处理程序并读取文件或管道(比如/tmp/PID.lock,其中文件或管道包含一个数据包,用于定义要解锁的文件或文件描述符和字节范围。

    只要在进程启动时加载库(并且可能插入所有signal()sigaction()调用以确保您的信号保留在调用链中),这应该可以正常工作。 / p>

  3. 第二个选项要求您预加载库(通过LD_PRELOAD环境变量,或使用/etc/ld.so.conf为所有二进制文件预加载。)

    插入库并不难写。我已经展示了使用插入库到monitor fork() calls的示例。在您的情况下,您必须考虑一种好方法来定义要解锁的字节范围(在文件或管道中,由信号触发),并处理信号处理程序上下文中的所有内容;但是有足够的异步信号安全低级unistd.h I / O函数来执行此操作。