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

work with fifo in c++ ( blocking read)

本文关键字:读取 fifo c++      更新时间:2023-10-16

我想做的事情:

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的情况下终止(你的读者需要检查)。