如何在 Linux 上同步多个独立应用程序的文件 I/O?
How to synchronize file I/O of many independent applications on Linux?
我正在为 Linux 编写一个软件,它可以在后台与我无法控制的其他应用程序同时主动处理用户文件。我想让我的后台应用程序不覆盖其他应用程序所做的更改。但是有一个问题 - 不像 Windows Linux 不提供强制文件锁定功能,这可能会由于我想避免的竞争条件而破坏用户的工作。
所以我想知道 - Linux 上是否有可用的文件系统提供某种同步机制,例如 compare-and-swap operation, all-or-nothing transactions、强制文件锁定(如 Windows)?
Rename is atomic。在决定调用 rename() 之前,由您的应用程序比较 "eTags" 源和目标(可能在适当的锁下)。
共享资源需要防止并发访问,因为如果多个执行线程同时访问和操作数据,线程可能会覆盖彼此的更改或访问处于不一致状态的数据。共享数据的并发访问是导致不稳定的因素,事实证明这种不稳定通常很难追踪和调试——立即解决问题很重要 [1]
线程可以使用以下两种工具来同步它们的动作:互斥锁和条件变量[2]
互斥锁(互斥的缩写)允许线程同步它们对共享资源的使用,例如,一个线程不会在另一个线程正在修改共享变量的同时尝试访问它.
条件变量执行补充任务:它们允许线程相互通知共享变量(或其他共享资源)已更改状态。
改编自:
[1] Love, R. (2005)。 Linux 内核开发,第二版。
[2] Kerrish, M. (2010)。 Linux 编程接口。
我认为存在三种可能的解决方案
1) 让所有程序使用自定义文件 I/O 库来实现您需要的功能。如果您无法访问源代码,则此解决方案可能不可行。您也可以考虑使用 mmap,以便将更改写入内存。您使用后台进程将脏页同步到现有文件或新文件。
2) 替换受影响程序将使用的标准 C/C++ 库(例如 libc.so)。您可以使用 ldd
找出库依赖性。您需要更新标准 C/C++ 的源代码以实现您需要的功能。这对大多数人来说可能太难了。
3) 创建文件系统。可以参考网上很多文章,比如https://kukuruku.co/post/writing-a-file-system-in-linux-kernel/。这是最好和最干净的解决方案。
希望对您有所帮助。
mmap 似乎提供了您正在寻找的这种保护:
https://www.kernel.org/doc/html/v4.13/media/uapi/v4l/func-mmap.html
prot
The prot argument describes the desired memory protection. Regardless of the device type and the direction of data exchange it should be set to PROT_READ | PROT_WRITE, permitting read and write access to image buffers. Drivers should support at least this combination of flags.
我正在为 Linux 编写一个软件,它可以在后台与我无法控制的其他应用程序同时主动处理用户文件。我想让我的后台应用程序不覆盖其他应用程序所做的更改。但是有一个问题 - 不像 Windows Linux 不提供强制文件锁定功能,这可能会由于我想避免的竞争条件而破坏用户的工作。
所以我想知道 - Linux 上是否有可用的文件系统提供某种同步机制,例如 compare-and-swap operation, all-or-nothing transactions、强制文件锁定(如 Windows)?
Rename is atomic。在决定调用 rename() 之前,由您的应用程序比较 "eTags" 源和目标(可能在适当的锁下)。
共享资源需要防止并发访问,因为如果多个执行线程同时访问和操作数据,线程可能会覆盖彼此的更改或访问处于不一致状态的数据。共享数据的并发访问是导致不稳定的因素,事实证明这种不稳定通常很难追踪和调试——立即解决问题很重要 [1]
线程可以使用以下两种工具来同步它们的动作:互斥锁和条件变量[2]
互斥锁(互斥的缩写)允许线程同步它们对共享资源的使用,例如,一个线程不会在另一个线程正在修改共享变量的同时尝试访问它.
条件变量执行补充任务:它们允许线程相互通知共享变量(或其他共享资源)已更改状态。
改编自:
[1] Love, R. (2005)。 Linux 内核开发,第二版。
[2] Kerrish, M. (2010)。 Linux 编程接口。
我认为存在三种可能的解决方案
1) 让所有程序使用自定义文件 I/O 库来实现您需要的功能。如果您无法访问源代码,则此解决方案可能不可行。您也可以考虑使用 mmap,以便将更改写入内存。您使用后台进程将脏页同步到现有文件或新文件。
2) 替换受影响程序将使用的标准 C/C++ 库(例如 libc.so)。您可以使用 ldd
找出库依赖性。您需要更新标准 C/C++ 的源代码以实现您需要的功能。这对大多数人来说可能太难了。
3) 创建文件系统。可以参考网上很多文章,比如https://kukuruku.co/post/writing-a-file-system-in-linux-kernel/。这是最好和最干净的解决方案。
希望对您有所帮助。
mmap 似乎提供了您正在寻找的这种保护: https://www.kernel.org/doc/html/v4.13/media/uapi/v4l/func-mmap.html
prot The prot argument describes the desired memory protection. Regardless of the device type and the direction of data exchange it should be set to PROT_READ | PROT_WRITE, permitting read and write access to image buffers. Drivers should support at least this combination of flags.