释放文件锁时如何通知另一个进程?

Posted

技术标签:

【中文标题】释放文件锁时如何通知另一个进程?【英文标题】:how to notify another process when file lock is released? 【发布时间】:2019-12-27 01:51:04 【问题描述】:

我有一个由两个进程组成的小应用程序。

进程 A 下载一个文件。进程 B 使用下载的文件。

当进程 A 下载文件时,它会获取文件锁定。进程 B 不断检查正在下载的文件是否被锁定。

一旦下载完成,进程A会释放文件锁,下载的文件就可以被进程B使用了。

在进程 B 中,我有专门的线程来检查锁是否被释放。

我想避免连续文件锁定检查的循环。是否有类似于selectpoll 系统调用的方式,使用该系统调用进程B 会收到有关文件锁被释放的通知?

我已经浏览了 fcntl,flock 的手册页,但我没有找到方法。

【问题讨论】:

可能有一种使用 inotify 的方法。但是我对inotify并不完全熟悉。您也可以使用 unix 套接字来完成此操作:进程 A 可以打开一个 AF_UNIX 套接字,侦听抽象名称。如果知道抽象名称,任何进程 B(甚至多个)都可以连接到套接字。进程 A 完成后,它可以关闭每个获取的连接。进程 B 连接到套接字的文件描述符将变得可读;从套接字读取时,将返回一个错误,指示 EOF。这将是您通知流程 A 已完成。 进程 B 是否可以阻塞等待获取锁,或者在此期间它需要做其他事情吗? (如果是后者,可能是专门用于等待锁的线程?) 后一种情况。编辑了问题。 【参考方案1】:

使用IPC可以实现: Inter-process communication 下载完成后进程A告诉B下载完成。

或者你可以使用网络连接通知B,但我不建议这样做。

【讨论】:

以上是关于释放文件锁时如何通知另一个进程?的主要内容,如果未能解决你的问题,请参考以下文章

在持有pthread锁时可以抢占一个线程吗?

SynchronizationLockException(对象同步方法是从未同步的代码块中调用的。)释放锁时

我应该在持有某个条件的锁时还是在释放它之后通知?

文件锁

分布式锁设计方案

异常进程终止时的资源清理