Я пытаюсь разработать небольшое приложение в 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, или я что-то отсутствует тривиальное и в этом дело?
Благодарим за тех, кто уже дал ответы на предыдущую версию моего вопроса, я внедрил эти предложения.
Почему вы распределяете эти массивы динамически? Кроме того, sizeof() в вашем вызове писать не так, он должен быть sizeof (float), хотя он может работать случайно. –