Linux:有没有办法在非阻塞模式下在写入端使用命名FIFO?

Linux:有没有办法在非阻塞模式下在写入端使用命名FIFO?,linux,pipe,nonblocking,mkfifo,Linux,Pipe,Nonblocking,Mkfifo,我已经找到了许多关于Linux上管道的问题和答案,但几乎所有的问题和答案都是在读者端讨论的 对于一个一旦数据可用并连接了一个读取进程,就应准备好将数据传送到指定管道的进程,是否有办法以非阻塞方式: 等待(轮询(2))读卡器打开管道 在循环中等待(再次轮询(2)),等待写入管道不会阻塞的信号,以及 当接收到这样的信号时,检查可以在不阻塞的情况下向管道写入多少字节 我知道怎么做,但我无法找到(1)和(3)的一致答案 编辑:我正在寻找(类似于)FIONWRITE的管道,但Linux没有FIONWRIT

我已经找到了许多关于Linux上管道的问题和答案,但几乎所有的问题和答案都是在读者端讨论的

对于一个一旦数据可用并连接了一个读取进程,就应准备好将数据传送到指定管道的进程,是否有办法以非阻塞方式:

  • 等待(轮询(2))读卡器打开管道
  • 在循环中等待(再次轮询(2)),等待写入管道不会阻塞的信号,以及
  • 当接收到这样的信号时,检查可以在不阻塞的情况下向管道写入多少字节
  • 我知道怎么做,但我无法找到(1)和(3)的一致答案

    编辑:我正在寻找(类似于)FIONWRITE的管道,但Linux没有FIONWRITE(用于管道)(?)

    EDIT2:编写器的预期主循环(伪代码类型,目标语言为C/C++):


    我感到有些困惑。在第2段中,你说你对fifo两端都已打开的情况感兴趣。这不是否定了数字(1)?(3)的意义是什么?假设民意测验告诉你有写东西的空间。你不知何故检查并决定你不能将你的完整信息写入fifo。除了返回poll并让它告诉你它准备好再次写入之外,你还打算做什么?@Duck:当编写器打开管道时,可能已经存在一个读卡器进程,但也可能发生读卡器稍后“到达”的情况。写入程序需要等待来自控制进程的另一个命令,该命令也可能取消输出。重要的是不要在write()时被阻止。即使读卡器已连接,管道也可能充满。在任何情况下,作者都不会被阻止。关于(1)没有很好的解决办法。这是FIFO最大的痛苦。您要么使用“以读/写方式打开”技巧,要么以非阻塞方式打开它,在这种情况下,它将失败,直到有读卡器为止。然后,您需要不断地进行轮询,以查看是否有一个阅读器,直到您成功打开为止。在(3)上,将其作为非阻塞打开。最糟糕的情况是,您写入可用空间(比如30个msg字节中的10个),然后返回轮询。除非有绝对必要立即写下全部信息,否则你不会失去任何东西。无法保证阅读器将同时处理所有30个字节。看,只要打开它作为非阻塞。这正是你试图以更艰难的方式去做的。
    forever
        poll(can_read_command, can_write_to_the_fifo)
        if (can_read_command) {
            read and parse command
            update internal status
            continue
        }
        if (can_write_to_the_fifo) {
            length = min(data_available, space_for_nonblocking_write)
            write(output_fifo, buffer, length)
            update internal status
            continue
        }