在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)当特定文本出现在文件中时,如何实现使系统发出蜂鸣声的原始目标?
答案 0 :(得分:3)
--line-buffered
标志。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
单独执行此操作,因此您不必担心它。)