我想做什么:
1.创建并打开由process1
写入in.fifo2.打开in.fifo以便在process2中阅读
3.通过process1行从cin写入in.fifo
4.按进程2读取和cout行
5.输入"退出"要cin(process2),它关闭文件in.fifo,删除它并退出
6.process2退出,因为in.fifo没有编写器
在我的程序中,process2没有退出。在c中,当O_NONBLOCK清除时,它与read,write一起工作,但我想在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等流的读取
如果输入&#34;退出&#34;如果process2关闭,那么process1就是生命锁? (它是在读取时阻止,还是只是尝试并尝试阅读)
答案 0 :(得分:1)
使用C ++标准库无法实现您想要的功能,因为在C ++中没有进程和文件共享的概念。您必须使用特定于操作系统的API,这些API很可能是C(如open()
),但理论上它们可以是C ++。
答案 1 :(得分:0)
您的阅读器似乎明确忽略了一个eof,而是清除文件结束条件,然后继续。你说你的读者没有退出。当然不是,你明确清除EOF并继续。它只会在从FIFO读取错误时退出,这将是一个相当不寻常的事件。
如果你想退出EOF,你必须明确地这样做。或者,如果您想在收到退出消息时终止,您的作者将不会发送它。当作者本身收到一个键入的“退出”时,它会终止而不会将其写入fifo(并且您的读者需要检查它)。