如何在Linux上同步许多独立应用程序的文件I / O?

时间:2018-09-20 19:46:21

标签: linux concurrency io transactions filesystems

我正在为Linux编写一个软件,该软件可以在后台与我无法控制的其他应用程序同时主动处理用户文件。我想让我的后台应用程序不覆盖其他应用程序所做的更改。但是有一个问题-与Windows Linux不同,它不提供强制性的文件锁定功能,这会由于我想避免的竞争条件而导致破坏用户工作的可能性。

所以我想知道-Linux上是否有文件系统提供某种同步机制,例如--harmony flag操作,compare-and-swap,强制性文件锁定(例如Windows)?

4 个答案:

答案 0 :(得分:5)

我相信有三种可能的解决方案

1)使所有程序都使用可实现所需功能的自定义文件I / O库。如果您无权访问源代码,则此解决方案可能不可行。您可能还考虑使用mmap,以便将更改写入内存。您使用后台进程将脏页同步到现有文件或新文件。

2)替换受影响的程序将使用的标准C / C ++库(例如libc.so)。您可以使用ldd来查找库依赖性。您需要更新标准C / C ++的源代码以实现所需的功能。对于大多数人来说,这可能太困难了。

3)创建文件系统。您可能会参考互联网上的许多文章,例如https://kukuruku.co/post/writing-a-file-system-in-linux-kernel/。这是最好,最干净的解决方案。

希望有帮助。

答案 1 :(得分:3)

Rename is atomic。由您的应用程序决定在决定调用rename()之前比较源和目标的“ eTag”(可能在适当的锁下)。

答案 2 :(得分:3)

mmap似乎具有您想要的这种保护: https://www.kernel.org/doc/html/v4.13/media/uapi/v4l/func-mmap.html

  

保护   prot参数描述所需的内存保护。无论设备类型和数据交换方向如何,都应将其设置为 PROT_READ | PROT_WRITE ,允许对图像缓冲区进行读写访问。驾驶员至少应支持这种标志组合。

答案 3 :(得分:2)

共享资源需要防止并发访问,因为如果多个执行线程同时访问并操纵数据,则线程可能会覆盖彼此的更改或在数据处于不一致状态时访问数据。并发访问共享数据是导致不稳定的秘诀,通常很难跟踪和调试它—非常重要[1]

线程可以使用以下两个工具来同步其操作:互斥锁和条件变量[2]

Mutexes(互斥的缩写)允许线程同步其对共享资源的使用,例如,一个线程不会在另一个线程修改共享变量的同时尝试访问共享变量。 / p>

条件变量执行一项补充任务:它们允许线程彼此通知共享变量(或其他共享资源)的状态已更改。

改编自:

[1] Love,R.(2005)。 Linux内核开发,第二版。

[2] Kerrish,M.(2010)。 Linux编程接口。