0

IPC に FIFO を使用しています。しかし、彼らは奇妙な振る舞いをします。デモストレーションに関しては、コンパイルして実行できるコードをここに投稿します。追加情報、私は Linux Ubuntu を使用しています。基本的な g++ コンパイラが付属していますが、特別なことは何もありません。

#include <iostream>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <iostream>
using namespace std;

int main() {

    cout << "START" << endl;

    int fifo;
    int code;
    mkfifo("/tmp/FIFO", 666);
    if ((fifo = open("/tmp/FIFO", O_RDONLY | O_NONBLOCK)) < 0) {
        perror("open failed");
    }
    else {
        cout << "open successed" << endl;
        code = close(fifo);
        cout << "close: " << code << endl;
        if ((fifo = open("/tmp/FIFO", O_WRONLY | O_NONBLOCK)) < 0) {
            perror("reopen failed");
        }
        else {
            cout << "reopen successed" << endl;
            code = close(fifo);
            cout << "close: " << code << endl;
        }
    }

    cout << "END" << endl;
    return 0;
}

正常に閉じるので、出力についての私の期待は次のようなものです。

START
open successed
close: 0
reopen successed
close: 0
END

しかし、私はこれを得ました、2回目のオープンは失敗します。なんで?そして、なぜこのばかげたエラー メッセージが表示されるのでしょうか。

START
open successed
close: 0
reopen failed: No such device or address
END

書き込み用に FIFO を再度開きたいと思います。そして、上記のコードが機能しない理由を知りたいです。

4

1 に答える 1

2

O_NONBLOCKフラグを再度開くことから削除します。フラグを保持する場合は、読み取り用にすでに開いているFIFOに接続します。 それは正しい振る舞いです。

http://linux.die.net/man/7/fifo

プロセスは、非ブロッキングモードでFIFOを開くことができます。この場合、書き込み側で誰も開いていなくても、読み取り専用のオープンは成功します。書き込み専用のオープンは、もう一方の端がすでに開かれていない限り、ENXIO(そのようなデバイスまたはアドレスなし)では失敗します。

于 2012-07-05T21:56:59.750 に答える