C 如何在Linux中序列化对目录的访问?

C 如何在Linux中序列化对目录的访问?,c,linux,apache-spark,semaphore,C,Linux,Apache Spark,Semaphore,假设处理器上同时运行4个进程,需要将数据从HDFS(与Spark一起使用)文件系统复制到本地目录。现在,我只希望一个进程复制该数据,而其他进程只是等待第一个进程复制该数据 因此,基本上,我需要某种信号量机制,每个进程都试图获取信号量以尝试复制数据,但只有一个进程获取信号量。所有未能获取信号量的进程将只等待信号量被清除(能够获取信号量的进程将在复制完成后清除信号量),当信号量被清除时,它们知道数据已经被复制。在Linux中如何实现这一点?有很多不同的方法来实现信号量。经典的SystemV信号量方式

假设处理器上同时运行4个进程,需要将数据从HDFS(与Spark一起使用)文件系统复制到本地目录。现在,我只希望一个进程复制该数据,而其他进程只是等待第一个进程复制该数据


因此,基本上,我需要某种信号量机制,每个进程都试图获取信号量以尝试复制数据,但只有一个进程获取信号量。所有未能获取信号量的进程将只等待信号量被清除(能够获取信号量的进程将在复制完成后清除信号量),当信号量被清除时,它们知道数据已经被复制。在Linux中如何实现这一点?

有很多不同的方法来实现信号量。经典的SystemV信号量方式在中进行了描述,在中进行了更广泛的描述

您可能仍然希望做一些更易于扩展和现代化的事情。许多IPC框架(Apache也有一两个)都有原子IPC操作。这些可以用来实现信号量,但我会非常小心

一般来说,我经常鼓励编写多进程或多线程应用程序的人使用C++来代替C.,如果状态被很好地封装在可能自己锁定的对象中,那么通常需要更清楚地看到共享状态必须被保护在哪里。因此,我建议您看看。

此外,您可以使用一些机制来同步

文件锁定在网络或远程文件系统上可能无法很好地工作。您应该在本地装载的文件系统(例如Ext4、BTRFS等)上使用它,而不是在远程文件系统(例如NFS)上使用它

例如,您可以采用目录包含(或创建)一些
.lock
文件的约定,并在访问目录之前对该
.lock
文件使用建议锁(或POSIX)

如果使用
flock
,您甚至可以直接锁定目录

使用这种文件锁定方法的优点是,您可以使用

在Linux上,您也可以使用(例如,在该目录中创建某个文件时收到通知)

请注意,大多数解决方案(建议性的,所以)都假定访问该目录的每个进程都遵循某种约定(换句话说,如果没有更多的预防措施,比如使用,粗心的用户可以在锁定过程访问目录时访问该目录(例如,使用普通的
cp
命令)或目录下的文件)。如果您不接受,您可能会寻找(这是一些Linux内核和文件系统的一个特性,但有点不推荐)