【问题标题】:Can I lock and unlock a fifo (named pipe) in C?我可以在 C 中锁定和解锁 fifo(命名管道)吗?
【发布时间】:2013-12-04 09:16:49
【问题描述】:

我有两个进度,p1p2,还有一个命名管道 var 用于两个进度之间的 ipc。
我想在p1 写入时为p2 锁定var 的rw,并在p1 完成写入时解锁var

ps:

我使用 select 进行非阻塞,所以当p1var 输入任何内容时p2 将变得可读。我可以让varp1 完成写入时变得可读吗?

【问题讨论】:

  • 你有没有试着把你的想法想出一些设计?
  • 在 POSIX 系统(如 Linux 和 OSX)上,命名管道是文件系统中的文件,文件可以被锁定。虽然我不知道它们是否适用于管道。您是否尝试过搜索文件锁定功能?
  • 现在我有大量数据,需要将其写入管道。但是在所有数据都写入之前,另一个进度不应该读取它
  • 我使用 select 进行非阻塞,当p1 将任何内容放入管道时,p2 将识别管道是可读的,尽管它没有完全写入整个数据。
  • 请记住,管道不是无限的,它可以填满并阻塞写入应用程序。

标签: c pipe nonblocking


【解决方案1】:

您可以使用信号(例如SIGUSR1)。编写器使其管道非阻塞(因此当管道变满时它不会阻塞),写入直到它不能再写入,然后将信号发送到另一个进程。读取进程读取所有内容(从其非阻塞管道),然后向写入者发送信号,写入者继续写入。

但是,这实际上是不需要的。作者可以写,读者可以读。如果管道已满,写入器将阻塞,直到它可以写入更多。阅读器也是如此,如果没有可阅读的内容,它将阻塞。然后,当写入器写入所有数据后,它将简单地关闭管道的末端,读取器将通过返回零字节读取的read 调用检测到这一点。

【讨论】:

  • 文件锁给我一些意义。我稍后会测试 fcntl。
  • 我想我需要使用两个管道,一个用于信号,另一个用于数据。我只是尝试锁定,但我无法锁定。可能无法锁定mkfifo的文件?
  • @KaMeTang 我怀疑无法锁定 FIFO 文件。是的,一个方向的数据管道,另一个方向的命令(或信号)管道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2013-11-14
  • 2011-01-12
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多