【问题标题】:How to lock a PIPE (or FIFO) with multiple reading processes?如何锁定具有多个读取进程的 PIPE(或 FIFO)?
【发布时间】:2015-12-01 12:35:50
【问题描述】:

这是场景,我的父进程有一个范围 (a,b) 和一个数字 N。我想计算 (a,b) 之间的所有素数。但是处理部分是由N个子进程完成的。

所以,我创建一个管道,然后将范围划分为 N 个部分。(a1,b1) ... (an,bn)。然后我创建 N 个子进程。然后在父进程中,我将每个范围顺序写入写完。

问题来了,如果只有一个子进程,我可以遵循answer。如果多个进程试图写入管道,this 答案是可以接受的。 但是这里有多个进程正在尝试读取,而一个进程正在尝试从管道中读取,应该一个接一个地读取两个整数,所以这部分应该是原子的。也许我可以尝试使用 mutex ,但不知道如何将 mutex 用于进程间。我该如何实现?

【问题讨论】:

  • 为什么不创建 N 个管道,每个孩子一个?但是等等,如果您在孩子之前创建范围,那么他们已经知道范围。你需要管道做什么?
  • 我必须使用管道和信号进行通信......
  • 不,你没有。 (断言证明)
  • 这是一个管道和信号分配,我正在学习如何使用这些东西。
  • 如果您在单个write() 操作中在管道上写入每对int 值,并且如果每个孩子在单个read() 中从管道中读取一对int 值操作,那么您无需担心任何问题。如果您将读取或写入拆分为两个操作(对中的每个成员一个),那么您会遇到原子性问题。但如果你像描述的那样小心,就不会。

标签: c linux pipe systems-programming multiprocess


【解决方案1】:

如何用多个读取进程锁定一个 PIPE(或 FIFO)?

您可以在管道描述符上使用文件锁:

  • flock(2)(在 POSIX 中指定);
  • POSIX 记录锁定,请参阅 fcntl(2)lockf(3) 包装器中的“咨询记录锁定”部分(均在 POSIX 中指定);
  • 打开文件描述锁,参见fcntl(2)(Linux 专用,在最近的内核中可用)。

您也可以使用POSIX semaphores 或其他IPC,但您需要单独的文件描述符。


然而,在你的场景中你真的不需要这个,因为你可以在一个调用中写入和读取两个整数,这将是原子的,如 cmets 中所述。

如果缓冲区大小不大于PIPE_BUF,则写入和读取在管道上是原子操作。见write(2)

尝试写入管道或 FIFO 有几个主要特征:

  • 原子/非原子:如果在一个操作中写入的全部量没有与来自任何其他进程的数据交错,则写入是原子的。当有多个写入器向单个读取器发送数据时,这很有用。应用程序需要知道可以以原子方式执行的写入请求有多大。此最大值称为 {PIPE_BUF}。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多