Cygwin读取输入从尾部-f输入

时间:2011-02-04 19:37:32

标签: c windows-7 cygwin pipe

在Windows上使用Cygwin,我希望在服务器日志中发出特定消息的声音通知。我写了以下内容:

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *f = fopen("/dev/stdin", "r");
    char bar=' ';
    if(f==NULL) {
        return 1;
    }
    do {
        bar = fgetc(f);
        if((bar=='\n') || (bar=='\r')) {
            printf("\a");
        }
        if(bar!=EOF) {
            printf("%c", bar);
        }
    } while(bar!=EOF);
    fclose(f);
    printf("Done.\n");
    return 0;
}

然后我运行了以下命令:

tail -f serverlog | grep myMessage | ./alerty.exe

有时候我会收到通知,有时候却没有。

我的问题有两方面: 1)在我的C程序中,错了什么?为什么我不能一直读取管道输入?它引起了我的好奇心,所以我很想知道。

2)当特定文本出现在文件中时,如何实现使系统发出蜂鸣声的原始目标?

2 个答案:

答案 0 :(得分:3)

  1. 默认情况下,stdin / stdout是行缓冲的(如果它们是终端的,否则是块缓冲的)。这不仅影响你的程序(当有东西可用时你会立即返回并且你正在打印行),但也是grep 。它需要--line-buffered标志。
  2. Sed应该能够为你做的工作。试试吧:

    tail -f serverlog | sed -une's / myMessage / \ a&amp; / p'

    -u设置unbuffered-hopefuly cygwin支持它 - 我正在检查Linux)

答案 1 :(得分:1)

stdout默认是缓冲的,因此输出不一定会立即出现。请尝试在fflush(stdout)之后插入printf("\a")

正如Jan提到的,你也可能在stdin上遇到缓冲问题。 grep--line-buffered选项可能有所帮助。 (tail -f单独执行此操作,因此您不必担心它。)