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

时间:2015-03-30 20:35:30

标签: c++ named-pipes

在命令行中,我使用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和pipe时,libc ++中显然存在一个错误。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

( echo banana ; echo EXIT ) > my_pipe