ubuntu 20 中的 STDIN 重定向问题(在 ubuntu 18 中有效)

ubuntu 20 中的 STDIN 重定向问题(在 ubuntu 18 中有效)

我有一个脚本,它运行我的应用程序 (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 上eofbitfailbit始终在读取第一条指令后设置。

整个脚本如下所示:

#!/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)上运行。

手册页fifo指的是手册页pipeI/O 的语义。

如果所有指向管道写入端的文件描述符都已关闭,则尝试read从管道执行 (2) 将看到文件末尾(read(2) 将返回 0)。如果所有指向管道读取端的文件描述符都已关闭,则 write(2) 将导致SIGPIPE为调用进程生成信号。如果调用进程忽略此信号,则write(2) 失败并显示错误EPIPE

我期望像这样的命令

printf "ins1\n" > /home/user/pipe

将打开管道、写入数据并关闭管道,因此接收程序应该看到文件结束的情况。

防止这种情况的唯一方法是保持管道打开以进行写入。这就是您使用sleep问题中显示的命令实现的。

相关内容