在c++中使用fifo(阻塞读取)
work with fifo in c++ ( blocking read)
我想做的事情:
1.通过process1 创建并打开以写入.fifo
2.打开in.ifo进行进程中读取2
3.通过process1行从cin写入in.ifo
4.通过进程读取和定制行2
5.当向cin(process2)输入"exit"时,它关闭了.fifo中的文件,删除它并退出
6.process2退出,因为in.ifo没有写入程序
在我的程序中,process2不会退出。在c中,当O_NONBLOCK清除时,它可以进行读取、写入,但我想在c++中进行
write.cpp:
#include <stdlib.h>
#include <fstream>
#include <string>
#include <iostream>
using namespace std;
int main(){
std::ofstream fifo;
fifo.open("/home/fedor/projects/fifo2/in",ios::out);
if(! fifo.is_open() ){
std::cout << " error : cannot open file " << std :: endl;
return 1;
}
std::cout << " file open " << std :: endl;
std::string line;
while (line.compare("exit") != 0 ){
std::getline(cin, line);
fifo << line << endl;
/* do stuff with line */
}
fifo.close();
remove("/home/fedor/projects/fifo2/in");
return 0;
}
read.cpp:
#include <stdlib.h>
#include <fstream>
#include <string>
#include <iostream>
using namespace std;
int main(){
std::ifstream fifo;
fifo.open("/home/fedor/projects/fifo2/in",ifstream::in);
if(! fifo.is_open() ){
std::cout << " error : cannot open file " << std :: endl;
return 1;
}
std::cout << " file open " << std :: endl;
std::string line;
bool done = false;
while (!done)
{
while (std::getline(fifo, line))
{
cout << line << endl;
/* do stuff with line */
}
if (fifo.eof())
{
fifo.clear(); // Clear the EOF bit to enable further reading
}
else
{
done = true;
}
}
return 0;
}
我找不到哪里可以读到关于阻止流读取的信息,比如http://linux.die.net/man/3/read关于阻止读取
如果process2关闭,如果输入"退出",就像process1一样,那是生命锁吗?(它是在读取时阻塞,还是只是尝试并尝试读取)
使用C++标准库无法执行您想要的操作,因为在C++中没有进程和文件共享的概念。您必须使用特定于操作系统的API,这些API很可能是C(如open()
),但理论上它们可以是C++。
您的读取器似乎显式忽略了eof,而不是清除文件结尾条件,然后继续。你是说你的读者不会退出。当然不是,您明确地清除EOF并继续。它只会在从FIFO读取错误时退出,这将是一个相当不寻常的事件。
如果你想在EOF上退出,你必须明确地这样做。或者,如果你想在收到退出消息时终止,你的编写器不会发送它。当编写器自己收到一个键入的"退出"时,它会在不将其写入fifo的情况下终止(你的读者需要检查)。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动
- FIFO块程序,直到其他进程读取
- 在Linux中检测到从pipe/fifo的另一端读取的尝试
- C++无需内存操作即可从 FIFO 读取
- 在c++中使用fifo(阻塞读取)