在c ++中使用fifo(阻塞读取)

时间:2014-08-28 10:31:55

标签: c++ c linux fifo

我想做什么:

1.创建并打开由process1

写入in.fifo

2.打开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就是生命锁? (它是在读取时阻止,还是只是尝试并尝试阅读)

2 个答案:

答案 0 :(得分:1)

使用C ++标准库无法实现您想要的功能,因为在C ++中没有进程和文件共享的概念。您必须使用特定于操作系统的API,这些API很可能是C(如open()),但理论上它们可以是C ++。

答案 1 :(得分:0)

您的阅读器似乎明确忽略了一个eof,而是清除文件结束条件,然后继续。你说你的读者没有退出。当然不是,你明确清除EOF并继续。它只会在从FIFO读取错误时退出,这将是一个相当不寻常的事件。

如果你想退出EOF,你必须明确地这样做。或者,如果您想在收到退出消息时终止,您的作者将不会发送它。当作者本身收到一个键入的“退出”时,它会终止而不会将其写入fifo(并且您的读者需要检查它)。