2017-02-17 19 views
0

私は次のことを行い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からデータを読み取っているか、私はこの中でも、些細な何かが欠けています場合?

私の質問の前のバージョンへの回答を既に与えてくれてありがとう、私は提案を実装しました。

+0

なぜこれらの配列を動的に割り当てるのですか?また、sizeof()はあなたの呼び出しでは間違っていますが、sizeof(float)でなければなりません。 –

答えて

0

readwriteの引数が正しくありません。正しいもの:

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

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

また、これらの機能は、部分的に行うことができ、コードが動作を継続する必要があるかどうかを判断するために、戻り値をチェックする必要があるように、読み取り/書き込み。


ない作家でwhile(idx <= 10)ループは、このループは決して終わらない理由を確認してください。 5GHzのCPUでも読者にも同じコメント。

関連する問題