我有 10 个进程正在运行,每个进程都写入同一个文件。我不想要多个作家,所以基本上我正在寻找一个互斥/二进制信号量来保护文件写入。问题是我不能在 10 个进程之间共享信号量,所以我正在研究在 10 个进程之间使用共享内存,并将信号量放在共享内存中,以便每个进程都可以访问它。
谁能指出我在 C/C++ for Unix 中的相关文档?使用这种结构的示例代码会很棒。
谢谢
我有 10 个进程正在运行,每个进程都写入同一个文件。我不想要多个作家,所以基本上我正在寻找一个互斥/二进制信号量来保护文件写入。问题是我不能在 10 个进程之间共享信号量,所以我正在研究在 10 个进程之间使用共享内存,并将信号量放在共享内存中,以便每个进程都可以访问它。
谁能指出我在 C/C++ for Unix 中的相关文档?使用这种结构的示例代码会很棒。
谢谢
将信号量放在共享内存中并不是解决这个问题的最佳方法(如果它甚至可以工作的话)。您应该研究文件锁定,这是一种 UNIX 功能,专门用于在文件编写者之间提供排他性。
具体来说,请查看:
有关更多解释性材料,请参阅UNIX 环境中的高级编程,第 14.3 节
看看UNIX 网络编程卷。2 W.理查德史蒂文斯。
这是一本关于这个主题的最好的书。
您可以使用 PTHREAD 互斥锁。在初始化互斥锁时,您需要使用pthread_mutexattr_setpshared函数使互斥锁跨进程共享,然后将其放入共享内存中。所有进程都可以附加到共享内存,然后访问互斥锁。
您还可以根据您的锁定要求(递归等)向 SHM 添加其他属性
如何使用 UNIX IPC 创建共享队列。一个进程读取队列并写入文件,所有其他进程将数据推入队列。
听起来你最好使用flock(2)
:
flock(fd, LOCK_EX);
n = write(fd, buf, count);
flock(fd, LOCK_UN);