为什么我在使用 ifstream 通过命名管道读取一行后得到 EOF?

Why do I get EOF after reading one line thourgh a named pipe using ifstream?

在命令行中,我使用 mkfifo 创建了一个管道并确认该文件存在。 ls -al 给出:

prw-r--r--    1 user  group      0 Mar 30 11:52 my_pipe

然后我使用此代码尝试从该管道逐行读取文本:

ifstream pipe("/path/to/my_pipe");
string message;
while(getline(pipe, message) && message != "EXIT")
{
    cout << boolalpha << pipe.good() << endl << pipe.eof() << endl << pipe.bad() << endl;
}

cout << boolalpha << pipe.good() << endl << pipe.eof() << endl << pipe.bad() << endl;

回到我做的命令行 echo "banana" > my_pipe 然后程序存在,输出如下:

true
false
false
false
true
false

这表明流在读取 banana 后处于良好状态,但在第二次调用 getline 时,我点击了 EOF 并退出。

为什么我点击了 EOF,在我阅读我的特殊 EXIT 消息之前,我可以做些什么来保持流阅读并处于良好状态?

编辑:

结论:

  1. 使用 fstream 代替 ifstream
  2. 当涉及到 fstream 和管道时,显然在 libc++ 中存在一个错误。

EOF 发生在管道被打开写入的所有进程关闭时。在您的示例中,打开它进行写入的唯一进程是 echo 命令;当它退出时,它会关闭管道,这会在读取过程中导致 EOF。

如果你想让管道在每个客户端写入之间保持打开状态,方法是以读写模式打开管道。这样,读取过程也将是一个写入过程,只要管道打开,它就永远不会被所有写入器关闭。

fstream pipe("/path/to/my_pipe");

或者,您可以通过在单个重定向进程中执行多个命令来在发送方保持管道打开:

( echo banana ; echo EXIT ) > my_pipe