私は次のことを行いLinux環境内で、C++での小さなアプリケーションを開発しようとしています:書き込み/ C++で名前付きパイプを使用してデータのストリーム(ダブル)を読む
1)は、データストリームを取得します( 'black-box'の出力から一連のdouble型の配列)を取り出し、それをパイプに書き込みます。ブラックボックスはADCと考えることができます。
2)パイプからデータストリームを読み込み、これらのデータを標準入力とする必要がある別のアプリケーションに送ります。
残念ながら、私はチュートリアルや例を見つけることができませんでした。私はこれを実現するために発見された最良の方法は、次のテストベンチの例に要約されている:
問題は、この例を実行することによって、私は私が摂食していますすべての10個のアレイのプリントアウトを取得しない、ということである#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;
}
私は常に最初の配列(1で満たされている)を取得し続けています。
パイプの動作について詳しく知りたい場合は、どんな提案/訂正/参照も大歓迎です。
編集:
ごめんなさい!私はコード内で非常に些細なエラーを発見しました。ライター側の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)でなければなりません。 –