无法打开FIFO进行写入

时间:2013-05-06 05:19:09

标签: c unix file-io fifo mkfifo

'服务器'计划方:

#define RESP_FIFO_NAME "response"

/* Global Variables */
char *cmdfifo = CMD_FIFO_NAME; /* Name of command FIFO. */
char *respfifo = RESP_FIFO_NAME; /* Name of response FIFO. */

int main(int argc, char* argv[]) {
int infd, outfd; /* FIFO file descriptors. */

... // blah blah other code here

/* Create command FIFO. */
if (mkfifo(cmdfifo, FIFO_MODE) == -1) {
    if (errno != EEXIST) {
        fprintf(stderr, "Server: Couldn’t create %s FIFO.\n", CMD_FIFO_NAME);
        exit(1);
    }
}

/* Create response FIFO. */
if (mkfifo(respfifo, FIFO_MODE) == -1) {
    if (errno != EEXIST) {
        fprintf(stderr, "Server: Couldn’t create %s FIFO.\n", RESP_FIFO_NAME);
        exit(1);
    }
}
/* Open the command FIFO for non-blocking reading. */
if ((infd = open(cmdfifo, O_RDONLY | O_NONBLOCK)) == -1) {
    fprintf(stderr, "Server: Failed to open %s FIFO.\n", CMD_FIFO_NAME);
    exit(1);
}

        /* Open the response FIFO for non-blocking writes. */
if ((outfd = open(respfifo, O_WRONLY | O_NONBLOCK)) == -1) {
            fprintf(stderr, "Server: Failed to open %s FIFO.\n", RESP_FIFO_NAME);
            perror(RESP_FIFO_NAME);
            exit(1);
        }

程序打印输出:

Server: Couldn’t create response FIFO.

我对FIFO很少了解,因为我的教授没有教它。这是我能够通过阅读他的例子和讲义来管理的。我试过没有O_NONBLOCK标志,但这只是导致程序挂起,所以它是必需的。我不明白为什么读FIFO很好但写FIFO无法打开。

1 个答案:

答案 0 :(得分:3)

从手册页:

  

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

你应该在'客户'中打开这个。