![名前付きパイプ通信を介してC ++型を派生させることは不可能ですか? [閉鎖]](https://linux33.com/image/72833/%E5%90%8D%E5%89%8D%E4%BB%98%E3%81%8D%E3%83%91%E3%82%A4%E3%83%97%E9%80%9A%E4%BF%A1%E3%82%92%E4%BB%8B%E3%81%97%E3%81%A6C%20%2B%2B%E5%9E%8B%E3%82%92%E6%B4%BE%E7%94%9F%E3%81%95%E3%81%9B%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E4%B8%8D%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
派生型を参照に送信すると、派生したC ++型(opencv Matなどの派生型)の通信がパイプを通過することがわかりました。
//Measurement FIFO while(1) { Mat xboxobs = some value; //changes in every iteration const char * obsfifo = "/tmp/obsfifo"; mkfifo(obsfifo, 0666); fm = open(obsfifo, O_WRONLY | O_NONBLOCK); write(fm, &xboxobs, 1024 ); close(fm); }
そして、次のように読者の参考文献を読んでください。
while(1)
{
//READ kalman measurement fifo
const char * obsfifo = "/tmp/obsfifo";
fm = open(obsfifo, O_RDONLY );
Mat xboxobs;
read(fm, &obs, 1024 );
close(fm);
fflush(stdout);
}
unlink(obsfifo);
を使用または印刷してMat xboxobs
リーダーのコンテンツにアクセスしようとすると、エラーが発生します。同じLinuxシステムにリーダーとライターを実装しています。STDOUT
std::cout
printf
質問1:一般的に名前付きパイプを介して派生型を安全に移動することは不可能ですか、それともここに何かがありませんか?
質問2Mat xboxobs
:バイパス、行列の各要素と他の要素を名前付きパイプを介して浮動小数点に送信し、さまざまなパイプを介して約Mats
30個の浮動小数点と通信する必要があります/tmp/somefifo
。合計30個の浮動小数点を送信し、そのうち15個は同時に実行される2つの別々のC ++コードからのもので、浮動小数点を受信者コードの行列に再集計しました。
良い点は、これがうまくいくということです。ただし、各fifoからデータを読み取るときと、行列で異なる数学を実行する前に、行列float要素を再び行列に組み立てるまでの読み取り時間(約2〜3秒)は非常に遅いです。
また、ビルダーコードでO_NONBLOCKを使用していない場合、リーダーを実装するとプログラムが停止することがわかりました。デバッグはgdb
私に特別なことを伝えませんが、デバッグプロセスを停止すると、次のような結果が表示されます。
../sysdeps/unix/syscall-template.S:81 81 ../sysdeps/unix/syscall-template.S の __write_nocancel() にある 0x00007ffff68ba870: そのファイルやディレクトリはありません。
作成者コードのロックを解除しないと、なぜこれら3つのプログラムを安全に実行できないのかわかりません。送信する前に行列を分割すると、受信者コードがなぜこんなに遅いのですか?これは普通ですか?
どんな助けにも感謝します。
答え1
read
そしてwrite
引用しないでください。針。 Prefix-& はポインタを返すアドレス指定演算子です。それサフィックス-& は引用を意味します。
このようにしてデータを他のプログラムに渡すできる働くがただ次の場合:
- このクラスはポインタを使用しませんが、クラス自体の内部にすべてを格納します。
- どちらのプログラムも同じC ++ ABI(コンパイラとC ++標準ライブラリによって定義されています)を使用します。
- クラス(およびクラスで使用される他のクラス)の定義は、両方のプログラムで同じです。
- どちらのプログラムも同じ最適化レベルでコンパイラを呼び出します。
そのうちの1つに該当しない場合は、クラス内の一部のデータ要素のオフセットが異なる可能性が高く、状況が変わる可能性があります。繁栄。運が良ければそうかもしれない。すべて見かけ上ランダムではないタイミング。
データを他のプログラムに渡すより良い方法は、シリアライズライブラリを使用することです。選択できるものがいくつかあります。強化に含まれる