【问题标题】:Stopping blocking write to fifo after reading ends读取结束后停止阻塞写入 fifo
【发布时间】:2014-04-13 18:10:19
【问题描述】:

当读取进程退出时,如何在写入调用块之前从写入进程中确定它?通常当读取端关闭时,写入端的写入调用应该返回错误吧?

客户

while(!timeout)
{
    read(fd, message, BUFFER_SIZE);
}

服务器

while(1)
{
    length = write(fd, message, strlen(message));
    if(length <= 0)
    {
        break;
    }
}

【问题讨论】:

  • 为什么不写一个小程序,试试看会发生什么?

标签: c linux debian fifo


【解决方案1】:

仔细阅读fifo(7)

当进程尝试写入未打开以供读取的 FIFO 时 另一方面,进程被发送一个 SIGPIPE 信号。

您可以 - 并且可能应该 - 使用 poll(2) 来测试 fifo 或管道或套接字文件描述符的动态可读性或可写性(请参阅 this answer 关于使用 poll 的简单化 event loop)。另见write(2) & Advanced Linux Programming

【讨论】:

  • 我对人们在这里询问man 页面立即快速给出什么的次数感到非常惊讶。他们忘记了RTFM 的含义——还有STFW。我已经长大了,可以通过阅读纸上的手册页来学习 Unix(在 SunOS3.2 时代,可能是 1987 年)。
  • 我的问题是在读取程序结束写入时在进程之间写入/读取一些数据后,仍然尝试写入和阻塞。
  • 在尝试write之前使用poll;很可能你需要围绕一个事件循环来构建你的程序。
猜你喜欢
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
相关资源
最近更新 更多