使用C / C ++应用程序

时间:2015-11-16 23:11:24

标签: linux console stdout stdin popen

我有一个第三方库应用程序,它会连续运行并在发生某些事件时生成控制台打印。 我希望在发生某些特定事件时采取一些措施,因此我需要持续监视控制台打印以触发我的操作。

是否可以编写可以在控制台(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

2 个答案:

答案 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