在C++中使用FIFO(阻塞读)

3

我想要做的事情:

1.由进程1创建并打开in.fifo文件以进行写入

2.在进程2中打开in.fifo文件以进行读取

3.由进程1将来自cin的行写入in.fifo文件

4.由进程2读取并输出行

5.当输入"exit"到cin(进程2)时,关闭文件in.fifo,删除它并退出

6.因为in.fifo没有写入者,所以进程2退出

在我的程序中,进程2没有退出。在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中阻塞读取流的相关内容。

如果process2在输入“exit”后关闭,就像process1一样,那么它是一个死锁吗?(它是在阻塞读取,还是一直尝试读取)

2个回答

1

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


谢谢你的回答! 我有一个在C语言上运行的程序,它能达到我的预期。我怎样才能在C++中使用像open()这样的函数? - fedden
@fedden 就像在 C 语言中一样使用它们即可。 - Anton Savin
谢谢,一切正常。在C++中需要包含一些不同的库:)) - fedden

0

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

如果你想在EOF上退出,你必须明确地这样做。或者,如果你想在接收到退出消息时终止,你的写入器不会发送它。当写入器本身接收到键入的“exit”时,它会在不将其写入FIFO的情况下终止(你的读取器需要检查这一点)。


感谢您的回答!我想在文件没有写入者时退出EOF。为什么当文件有写入者时我会遇到EOF?如果我在“exit”上退出,它会造成死锁吗?(线程在EOF上停止,还是只是尝试循环读取)如果我不在EOF上退出,会发生什么? - fedden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接