我有一个脚本,它运行我的应用程序 (c++),其中 STDIN 从 fifo 重定向,并将 STDOUT 重定向到文件。以下代码在 ubuntu 18 上运行良好:
./my_app 0</home/user/pipe 1> log.txt &
我正在使用 printf 向 fifo 发送指令:
printf "ins\n" > /home/user/pipe
在应用程序中,读取是std::getline
在 try-catch 块中完成的,该块在 ubuntu 18 上运行良好,但在 ubuntu 20 上eofbit
,failbit
始终在读取第一条指令后设置。
整个脚本如下所示:
#!/bin/bash
./my_app 0</home/user/pipe 1> log.txt &
sleep 1
printf "ins1\n" > /home/user/pipe
sleep 5
printf "ins2\n" > /home/user/pipe
.
.
对于上面的例子,我可以读取“ins1”,但之后什么都读不到
稍后编辑:现在开始工作,用一些东西保持管道畅通。
sleep infinity > /home/user/pipe &
在启动应用程序并sleep
在最后终止之前
答案1
我怀疑相同的程序应用程序和脚本是否可以在不同版本的 Ubuntu(或一般的 Linux 或 UNIX)上运行。
如果所有指向管道写入端的文件描述符都已关闭,则尝试
read
从管道执行 (2) 将看到文件末尾(read
(2) 将返回 0)。如果所有指向管道读取端的文件描述符都已关闭,则write
(2) 将导致SIGPIPE
为调用进程生成信号。如果调用进程忽略此信号,则write
(2) 失败并显示错误EPIPE
。
我期望像这样的命令
printf "ins1\n" > /home/user/pipe
将打开管道、写入数据并关闭管道,因此接收程序应该看到文件结束的情况。
防止这种情况的唯一方法是保持管道打开以进行写入。这就是您使用sleep
问题中显示的命令实现的。