2014-08-28 2 views
0

То, что я хочу сделать:работа с ФИФО в C++ (блокирование чтения)

1.Create и открыт для записи in.fifo по process1

2.Open in.fifo для чтения в Process2

3.Write от CIN до in.fifo по линии Process1

4.Read и соиЬ линии от Process2

5.When входного "выхода" на Cin (Process2), он закрыт файл in.fifo, удалите его и выйдите из

6.process2 выход, потому что in.fifo не имеет ни один писатель

В моих программах Process2 не выходит. В с он работает с чтения, записи, когда 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 о блокировке, прочитанной

Если процесс2 закрыт, если вход «выход», как process1 - это блокировка жизни? (Блокируется ли это чтение или просто пытается и пытается прочитать)

ответ

1

Невозможно делать то, что вы хотите, используя стандартную библиотеку C++, потому что в C++ нет понятия процессов и совместного использования файлов. Вы должны использовать OS-специфичные API, которые, скорее всего, являются C (например, open()), но теоретически они могут быть C++.

+0

Спасибо за ваш ответ! У меня есть программа на c, которая работает, как я хочу. Как я могу использовать такие функции, как open() в C++? – fedden

+0

@fedden Просто используйте их, как в C. –

+0

Спасибо, все работает. В C++ нужно включить несколько разных libs :)) – fedden

0

Ваш читатель явно игнорирует eof, вместо этого очищая конец состояния файла и продолжая. Вы говорите, что ваш читатель не выходит. Конечно, это не так, вы явно очищаете EOF и продолжаете. Он собирается выйти только из чтения ошибки из FIFO, что будет довольно необычным событием.

Если вы хотите выйти из EOF, вам придется явно это сделать. Или, если вы хотите прекратить получение сообщения о выходе, ваш автор не отправит его. Когда сам писатель получает типичный «выход», он заканчивается, не записывая его в fifo (и ваш читатель должен проверить это).

+0

Спасибо за ответ! Я хочу выйти на EOF, когда у файла нет писателей. Почему у меня EOF, когда у файла есть писатель? Если я выйду на «выход», это жизненный замок? (нить останавливается на EOF или просто пытается прочитать цикл) Если я выйду не на EOF, – fedden