创建和打开 FIFO 后 fprintf() 到 stdout 不工作
fprintf() to stdout not working after creating and opening a FIFO
当我的程序启动时,它只是创建一个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);
.
.
.
}
这是我的输出:
我尝试注释掉 fifo 的创建和打开,当我这样做时,消息会正确地打印到屏幕上。
打开 FIFO 通常会阻塞,直到另一端也打开为止,参见 http://man7.org/linux/man-pages/man7/fifo.7.html。所以你的程序可能在 open(SERVER_FIFO_PATH, O_RDONLY)
等待并且没有到达任何其他 fprintf
或 perror
。
您尝试打开 FIFO 先读取再写入的尝试不起作用,因为第一个打开没有 return。
当您使用调试器单步执行程序时,您应该能够看到这一点。
顺便说一句:当 mkfifo
returns -1
你应该检查 errno
是否是 EEXIST
。可能还有其他错误也会导致 return 值 -1
,请参阅 https://linux.die.net/man/3/mkfifo
正如您从输出中看到的那样,存在阻塞。也就是说,你当前的流程不能继续,直到FIFO的另一端打开write
。你应该看一眼 the man page.
关于您的错误,有两种情况可能是您要放置 FIFO 的目录不允许这样做。第二种情况可能是由于系统错误。要解决此问题,您需要按以下方式更改 fprintf
。
#include <string.h>
#include <stdlib.h>
..
..
fprintf(stderr, "server FIFO not created as it already exists. Error: %s\n", strerror(errno));
exit(EXIT_FAILURE);
当我的程序启动时,它只是创建一个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);
.
.
.
}
这是我的输出:
我尝试注释掉 fifo 的创建和打开,当我这样做时,消息会正确地打印到屏幕上。
打开 FIFO 通常会阻塞,直到另一端也打开为止,参见 http://man7.org/linux/man-pages/man7/fifo.7.html。所以你的程序可能在 open(SERVER_FIFO_PATH, O_RDONLY)
等待并且没有到达任何其他 fprintf
或 perror
。
您尝试打开 FIFO 先读取再写入的尝试不起作用,因为第一个打开没有 return。
当您使用调试器单步执行程序时,您应该能够看到这一点。
顺便说一句:当 mkfifo
returns -1
你应该检查 errno
是否是 EEXIST
。可能还有其他错误也会导致 return 值 -1
,请参阅 https://linux.die.net/man/3/mkfifo
正如您从输出中看到的那样,存在阻塞。也就是说,你当前的流程不能继续,直到FIFO的另一端打开write
。你应该看一眼 the man page.
关于您的错误,有两种情况可能是您要放置 FIFO 的目录不允许这样做。第二种情况可能是由于系统错误。要解决此问题,您需要按以下方式更改 fprintf
。
#include <string.h>
#include <stdlib.h>
..
..
fprintf(stderr, "server FIFO not created as it already exists. Error: %s\n", strerror(errno));
exit(EXIT_FAILURE);