質問

私が送信し、パイプを使用して受信しようとしています:

send.cpp

struct
{
        long a;
        long b;
}T;
cout << "1" << endl;
if ( access ( FIFO_NAME, F_OK ) == -1 ) {
            res = mkfifo ( FIFO_NAME, 0755 );
            if ( res != 0 )
                    cout << " Can't make fifo" << endl;
}

cout << "2" << endl;
pipe_fd = open ( FIFO_NAME, O_WRONLY);
cout << "3: " << pipe_fd << endl;
a=b=1;
res = write ( pipe_fd, &T, sizeof ( T ) );
cout << "4" << endl;
close(pipe_fd);

recv.cpp

cout << "1" << endl;
pipe_fd = open(FIFO_NAME, O_RDONLY | O_NONBLOCK);
cout << "2" << endl;
res = read(pipe_fd, &T, sizeof(T));
cout << T.a << T.b << endl;
close(pipe_fd);

./送ります ./recv

オープンは正しいのですが、send.cppの実行時にプログラムが終了し、「4」が表示されていない「書き込み」!!!!私はT.aとT.bが修正されていない側をrecvを!

私のプログラムで何が悪いです!

(私はO_NONBLOCKのfalgを削除するとプログラムが正しく動作していることを言わなければなりません)

感謝

役に立ちましたか?

解決

あなたは、ノンブロッキングI / Oを使用している場合は特に、)((読み取りの戻り値を確認してください)と書く必要があります。読みたいデータは、それがすべて書かれていない、と彼らは、エラーコードEINTRやEAGAINで失敗する可能性があるため、彼らはすべてのデータをいくつかを返しますがないかもしれません、まだ存在していないので、彼らは失敗する可能性があります。あなたは、一般的に、あなたのいずれかが、あなたが望むすべてのデータを持っているまで読んで、ループ内でそれらを使用するか、EINTR / EAGAINのような回復不能なエラーを取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top