【问题标题】:How to implement a timeout in open/write function如何在打开/写入功能中实现超时
【发布时间】:2014-09-14 19:07:52
【问题描述】:

我想使用命名的 fifo 通道,并且我想在我写入这个 fifo 时实现超时。

fd = open(pipe, O_WRONLY);
write(fd, msg, len);

程序被函数打开阻塞,所以使用函数选择将不起作用。 谢谢。

【问题讨论】:

  • O_NONBLOCK 不工作吗?
  • 我需要阻止,但超时
  • 我从来没有这样做过,但可以inotify + select 来确定FIFO 是否准备好,然后设置一个悲观的open()O_NONBLOCK 可能会成功吗?
  • 您需要有一些进程读取该管道或 FIFO。你有吗?阅读pipe(7)fifo(7)poll(2)
  • 你为什么要问?你真正想做什么。 FIFO有什么用?另一边的过程是什么,它是如何开始的?你能以某种方式改进双方的代码吗?

标签: c linux pipe fifo


【解决方案1】:

使用select() 及其超时参数。

【讨论】:

  • 如果是阻塞的open系统调用将不起作用(因为selectpoll都需要打开文件描述符)
  • 你的open被阻塞,直到其他进程以读取模式打开它... Fifo是一个通信对象,所以如果没有,让你尝试写入被认为是无意义的对方。正如basile所说,你应该有一个阅读部分。
【解决方案2】:

阅读pipe(7)fifo(7)poll(2)

您可以在致电open(2) 之前使用信号处理程序设置计时器或警报(请参阅time(7)signal(7)) - 但我不会这样做 - 或者您可以使用O_NONBLOCK 标志,因为fifo(7) 说:

 A process can open a FIFO in nonblocking mode.  In this case, opening
for read-only will succeed even if no-one has opened on the write
side yet, opening for write-only will fail with ENXIO (no such device
or address) unless the other end has already been opened.

但是,您需要在 FIFO 或管道的另一侧进行某些操作(一些其他进程读取)。

也许您应该考虑使用unix(7) 套接字,即AF_UNIX 地址系列。它看起来与您的情况更相关:将上面的代码(尝试打开以写入 FIFO)更改为客户端的 AF_UNIX 套接字(使用连接),并将其他进程更改为 AF_UNIX 套接字服务器。

正如5gon12eder 评论的那样,您还可以查看inotify(7)。甚至可能是D-bus

我猜 FIFO 或管道在您的情况下不是正确的解决方案。你应该解释更多,并更广泛地描述你的关注点和目标。

【讨论】:

    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 2011-12-14
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多