【问题标题】:Determine who is listening on fifo named pipe确定谁在监听 fifo 命名管道
【发布时间】:2018-03-04 09:54:05
【问题描述】:

假设我有一个命名管道:

mypipe="foobar"
mkfifo $mypipe

...稍后说我想给它写信

echo "foo" > $mypipe

如果没有人在听,我很确定这个回声呼叫会挂起。在我进行 echo 调用之前,有没有办法确定是否有人正在从管道中读取数据?

【问题讨论】:

  • 您似乎正在为比赛条件做好准备。在有人准备好读取数据之前,通话一直挂着有什么问题?
  • 我同意 re:竞态条件,但对于我的用例,如果有人还没有准备好阅读,那么他们将永远不会准备好,基本上,所以我会在尝试写入之前退出/返回
  • 如果读者在fuser 调用和echo 调用之间死掉了,你仍然会遇到同样的问题。检查fuser 这样可以避免echo 在大多数情况下超时是一种有效的优化,但您仍然必须应对echo 挂起的可能性。

标签: bash named-pipes fifo mkfifo


【解决方案1】:

fuser 实用程序告诉您谁拥有打开的句柄,但在一般情况下,它需要root 权限。

引用manual page,

fuser 可能只能收集部分信息,除非以特权运行。因此,属于其他用户的进程打开的文件可能不会被列出,并且可执行文件可能被归类为仅映射。

安装fuser SUID root 将避免与部分信息相关的问题,但出于安全和隐私原因可能不受欢迎。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2010-10-29
    • 2017-12-12
    相关资源
    最近更新 更多