2017-02-17 6 views
0

Я пытаюсь разработать небольшое приложение в C++ в среде Linux, который делает следующее:Запись/Чтение потока данных (двойной) с использованием именованных каналов в C++

1) получает поток данных (ряд массивов двойников) от выхода «черного ящика» и записывает его в трубу. Черный ящик можно рассматривать как АЦП;

2) считывает поток данных из трубы и передает его в другое приложение, которое требует, чтобы эти данные были stdin;

К сожалению, я не смог найти учебники или примеры. Лучший способ я нашел, чтобы понять это суммируется в следующем примере стендовых:

#include <iostream> 
#include <fcntl.h> 
#include <sys/stat.h> 
#include <stdio.h> 

#define FIFO "/tmp/data" 

using namespace std; 

int main() { 

    int fd; 
    int res = mkfifo(FIFO,0777); 
    float *writer = new float[10]; 
    float *buffer = new float[10]; 

    if(res == 0) { 
     cout<<"FIFO created"<<endl; 

     int fres = fork(); 

     if(fres == -1) { 
     // throw an error 
     } 
     if(fres == 0) 
     { 
     fd = open(FIFO, O_WRONLY); 

     int idx = 1; 
     while(idx <= 10) { 
      for(int i=0; i<10; i++) writer[i]=1*idx; 

      write(fd, writer, sizeof(writer)*10); 
     } 
     close(fd); 
     } 
     else 
     { 
     fd = open(FIFO, O_RDONLY); 
     while(1) { 
      read(fd, buffer, sizeof(buffer)*10); 

      for(int i=0; i<10; i++) printf("buf: %f",buffer[i]); 
      cout<<"\n"<<endl; 
     } 
     close(fd); 
     } 

    } 

    delete[] writer; 
    delete[] buffer; 

} 

Проблема заключается в том, что, запустив этот пример, я не получаю распечатку всех 10 массивов я скармливания в то время как я всегда получаю первый массив (заполненный 1).

Любое предложение/исправление/ссылка очень приветствуется, чтобы заставить его работать и больше узнать о поведении труб.

EDIT:

Извините, ребята! Я обнаружил очень простую ошибку в моем коде: в цикле while внутри части записи я не увеличиваю индекс idx ... как только я его исправлю, я получаю распечатку всех массивов. Но теперь я столкнулся с другой проблемой: при использовании большого количества массивов они случайным образом распечатываются (вся последовательность не печатается); как будто часть читателя не в состоянии справиться со скоростью писателя. Вот новый пример кода:

#include <iostream> 
#include <fcntl.h> 
#include <sys/stat.h> 
#include <stdio.h> 

#define FIFO "/tmp/data" 

using namespace std; 

int main(int argc, char** argv) { 

    int fd; 
    int res = mkfifo(FIFO,0777); 
    int N(1000); 
    float writer[N]; 
    float buffer[N]; 

    if(res == 0) { 
     cout<<"FIFO created"<<endl; 

     int fres = fork(); 

     if(fres == -1) { 
     // throw an error 
     } 
     if(fres == 0) 
     { 
     fd = open(FIFO, O_WRONLY | O_NONBLOCK); 

     int idx = 1; 
     while(idx <= 1000) { 
      for(int i=0; i<N; i++) writer[i]=1*idx; 

      write(fd, &writer, sizeof(float)*N); 
      idx++; 
     } 
     close(fd); 
     unlink(FIFO); 
     } 
     else 
     { 
     fd = open(FIFO, O_RDONLY); 
     while(1) { 
      int res = read(fd, &buffer, sizeof(float)*N); 

      if(res == 0) break; 
      for(int i=0; i<N; i++) printf(" buf: %f",buffer[i]); 
      cout<<"\n"<<endl; 

     } 
     close(fd); 
     } 

    } 

} 

Есть ли какой-то механизм, чтобы осуществить для того, чтобы сделать запись() ждать до чтения() все еще читает данные из FIFO, или я что-то отсутствует тривиальное и в этом дело?

Благодарим за тех, кто уже дал ответы на предыдущую версию моего вопроса, я внедрил эти предложения.

+0

Почему вы распределяете эти массивы динамически? Кроме того, sizeof() в вашем вызове писать не так, он должен быть sizeof (float), хотя он может работать случайно. –

ответ

0

Недопустимы аргументы read и write. Правильные из них:

write(fd, writer, 10 * sizeof *writer); 

read(fd, buffer, 10 * sizeof *buffer); 

Кроме того, эти функции могут выполнять частичное чтение/запись, так что код должен проверить возвращаемые значения, чтобы определить, следует ли продолжать операцию.


Не знаю, почему while(idx <= 10) петля в писателе, этот цикл никогда не заканчивается. Даже на 5 ГГц процессоре. Тот же комментарий для читателя.