C ++ FIFO奇怪的行为

时间:2012-07-05 21:46:28

标签: c++ linux fifo

我正在使用FIFO进行IPC。然而,他们执行一些奇怪的行为 至于演示,我在这里发布了一些可以编译和运行的代码。 其他信息,我在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

然而,我得到了这个,第二次打开失败了。为什么?为什么有这个愚蠢的错误信息?

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

我真的想重新打开FIFO进行写入。我想知道上面的代码不起作用的原因。

1 个答案:

答案 0 :(得分:2)

从重新打开中删除O_NONBLOCK标志,或者如果要保留该标志,请连接到已打开以供读取的fifo。 这是正确的行为。

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

  

进程可以在非阻塞模式下打开FIFO。在这种情况下,即使在写入端没有打开任何人,打开以进行只读也将成功,只有写入才会失败&gt;使用ENXIO(没有这样的设备或地址),除非另一端已经打开