创建并打开FIFO后,fprintf()到stdout无效

136*_*136 0 c printf stdout fflush

当我的程序启动时,它只是创建一个fifo并将其打开,之后我只想在屏幕上输出一些信息,但是什么也没打印出来。这是我的代码片段:

void listen(const server_config_t* server_conf)
{
    // Create FIFO
    if (mkfifo(SERVER_FIFO_PATH, 0660) == -1) {
        fprintf(stdout, "server FIFO not created as it already exists. continuing...\n");
    }

    // Open FIFO (for reading)
    int fd;
    if ((fd = open(SERVER_FIFO_PATH, O_RDONLY)) == -1) {
        // fprintf(stderr, "error: could not open server FIFO\n");
        perror("FIFO");
        exit(1);
    }

    // Open dummy FIFO (for writing, prevent busy waiting)
    // TODO: find way to wait without another file descriptor?
    int fd_dummy;
    if ((fd_dummy = open(SERVER_FIFO_PATH, O_WRONLY)) == -1) {
        perror("DUMMY FIFO");
        exit(1);
    }

    // TODO: this should print immediately after starting,
    //       but doesn't for some reason
    fprintf(stdout, "server listening... %d %s\n", server_conf->num_threads,
        server_conf->password);
    fflush(stdout);

.
.
.

}

Run Code Online (Sandbox Code Playgroud)

这是我的输出:

这是输出

我尝试注释掉fifo的创建和打开,并且在执行此操作时,该消息已正确打印到屏幕上。

Bod*_*odo 5

通常,打开FIFO会阻塞,直到另一端也打开为止,请参见http://man7.org/linux/man-pages/man7/fifo.7.html。所以,你的程序可能在等待open(SERVER_FIFO_PATH, O_RDONLY)并没有达到任何其他fprintfperror

您尝试先打开FIFO先读取然后再写入的尝试不起作用,因为第一次打开不会返回。

使用调试器逐步执行程序时,应该能够看到此消息。

顺便说一句:mkfifo返回-1时应检查是否errnoEEXIST。可能还有其他错误也会导致返回值-1,请参见https://linux.die.net/man/3/mkfifo