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

时间:2015-09-05 13:18:49

标签: c linux pipe systems-programming multiprocess

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

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

问题出现了,如果只有一个子进程,我可以按照answer进行操作。如果多个进程尝试写入管道,this答案是可以接受的。 但是这里有多个进程正在尝试读取并且一个进程试图从管道读取应该一个接一个地读取两个整数,所以这部分应该是原子的。可能是我可以尝试使用互斥锁,但不知道如何使用互斥进行进程间处理。如何实现这一点?

1 个答案:

答案 0 :(得分:0)

  

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

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

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

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

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

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

  

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

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