在命令行中,我使用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
消息之前保持流阅读并保持良好状态?
修改
结论:
fstream
代替ifstream
。答案 0 :(得分:2)
当管道被打开写入的所有进程关闭时,EOF会在管道上发生。在您的示例中,打开它以进行写入的唯一进程是echo
命令;当它退出时,它会关闭管道,这会在读取过程中产生EOF。
如果您希望管道在每个写入它的客户端之间保持打开,那么执行此操作的方法是以读写模式打开管道。这样,阅读过程也将是一个写作过程,只要它打开管道就永远不会被所有作家关闭。
fstream pipe("/path/to/my_pipe");
或者,您可以通过在单个重定向进程中执行多个命令来保持发送方的管道打开:
( echo banana ; echo EXIT ) > my_pipe