我有一个第三方库应用程序,它会连续运行并在发生某些事件时生成控制台打印。 我希望在发生某些特定事件时采取一些措施,因此我需要持续监视控制台打印以触发我的操作。
是否可以编写可以在控制台(stdout)上连续监视字符串转储程序的应用程序,并在检测到一行时进行处理。
我试图使用' popen'函数但它一直等到库应用程序停止执行。 这是我使用open
的示例代码#include <stdio.h>
int main()
{
FILE *fd = NULL;
char buf[512] = {0};
fd = popen ("./monitor","r");
while (fgets (buf, 512, fd) != NULL)
{
printf ("__FILE__ : message : %s\n",buf);
}
printf ("EOF detected!\n");
return 0;
}
任何人都可以让我知道监控控制台日志的正确方法并采取行动。
提前致谢。
PRATIK
答案 0 :(得分:0)
这是我最近编写的一段代码,它从stdin读取并打印到stdout。
void echo(int bufferSize) {
// Disable output buffering.
setbuf(stdout, NULL);
char buffer[bufferSize];
while (fgets(buffer, sizeof(buffer), stdin)) {
printf("%s", buffer);
}
}
据我所知,你有类似的问题,因为我最初没有使用延迟输出,因为我没有使用:
setbuf(stdout, NULL);
你也可以从stdin读取(这是我的示例代码所做的)只是将命令传递给你的c代码,或者如果你只想过滤输出管道到grep。如果它是标准化的系统日志日志,您还可以在日志文件中使用tail:
tail -f <logfile>| <your c prgoramme>
或 仅用于提交
tail -f <logfile>|grep "<your string here>"
或者如果没有日志文件管道stdout以这种方式记录:
<your app>|<your c prgoramme>
或
<your app>| grep "<your string here>"
答案 1 :(得分:0)
由写入stdout
的shell脚本模拟的第三方程序#!/bin/bash
while true; do
echo "something"
sleep 2
done
你想写这样的东西来捕获第三方程序的输出,然后对这些信息采取行动:
#!/bin/bash
while read line; do
if [[ $line == "something" ]]; then
echo "do action here"
fi
done
然后将它们与管道操作员结合使用:
./dosomething.sh | act.sh