命名管道上的tail -f表现很奇怪

时间:2013-12-05 19:41:36

标签: linux named-pipes tail

我正在尝试使用命名管道进行进程间通信,但我看到了一些我无法理解的奇怪事情。 我有这个“作家”代码:

#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)编写器应用程序,我输入的所有内容都会出现在尾窗口中。

就像作家必须在尾巴显示任何东西之前关闭。任何想法发生了什么,为什么会发生以及如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:0)

这里没有错。 tail想要提取最后行。为了确定它们是什么,它正在寻找fifo中的文件结尾,它只能在作者关闭fifo的写入结束后才能看到。