2014-08-28 165 views
0

我想要做什么:在C++的FIFO(阻塞读)工作

1,创建并开放供过程1

2.Open in.fifo在过程2

阅读写作in.fifo

3.Write从CIN到in.fifo由过程1线

4.Read和cout线通过过程2

5.当输入 “退出” CIN(过程2)时,它关闭文件in.fifo,删除它并退出

6.process2退出,因为in.fifo没有作家

在我的程序进程2不退出。在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; 
} 

我可以” t找到我在哪里可以读取有关阻止读取像流http://linux.die.net/man/3/read关于阻止读取

如果process2关闭,如果输入“退出”,就像process1是一个生命锁? (读取时是否阻塞,或只是尝试读取)

回答

1

没有办法使用C++标准库来做你想做的事情,因为在C++中没有过程和文件共享的概念。您必须使用特定于操作系统的API,其最可能是C(如open()),但理论上它们可以是C++。

+0

感谢您的回答! 我在c上有程序,就像我想要的那样工作。我如何在C++中使用open()之类的函数? – fedden 2014-08-28 11:50:05

+0

@fedden就像你在C使用他们一样。 – 2014-08-28 11:54:39

+0

谢谢,所有的工作。在C++中需要包含一些不同的库:)) – fedden 2014-08-28 12:25:48

0

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

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

+0

感谢您的回答! 我想退出EOF,当文件没有作家。 为什么我的文件有文件时有EOF? 如果我退出“退出”,它是生命锁定吗? (线程停在EOF上,或者只是试图在循环中读取) 如果我不退出EOF, – fedden 2014-08-28 11:34:24