为什么我在使用ifstream阅读一行命名管道后会得到EOF



在命令行中,我使用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. 在撰写本文时,libc++中显然存在一个关于fstream和管道的错误

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

如果您希望管道在每个向其写入的客户端之间保持打开,那么方法是以读写模式打开管道。这样,阅读过程也将是一个写作过程,只要管道打开,它就永远不会被所有作家关闭。

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

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

( echo banana ; echo EXIT ) > my_pipe

最新更新