我正在尝试使用命名管道进行进程间通信,但我看到了一些我无法理解的奇怪事情。 我有这个“作家”代码:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#define FIFO_NAME "american_maid"
int main(void)
{
char s[300];
int num, fd;
mknod(FIFO_NAME, S_IFIFO | 0666, 0);
printf("waiting for readers...\n");
fd = open(FIFO_NAME, O_WRONLY);
printf ("FD = %d", fd);
printf("got a reader--type some stuff\n");
while (gets(s), !feof(stdin)) {
if ((num = write(fd, s, strlen(s))) == -1)
perror("write");
else
printf("speak: wrote %d bytes\n", num);
}
return 0;
}
现在当我做一个“tail -f american_maid”时,尾部会阻塞一个作家。 然后我运行编写器代码,它发现tail -f正在管道的另一端等待。到现在为止还挺好。 当我在编写器应用程序中输入任何内容时,没有任何内容显示在尾窗中,但是,只要我关闭(Ctrl-C)编写器应用程序,我输入的所有内容都会出现在尾窗口中。
就像作家必须在尾巴显示任何东西之前关闭。任何想法发生了什么,为什么会发生以及如何解决这个问题?
由于
答案 0 :(得分:0)
这里没有错。 tail
想要提取最后行。为了确定它们是什么,它正在寻找fifo中的文件结尾,它只能在作者关闭fifo的写入结束后才能看到。