C - 拖尾文件和拦截输出

时间:2014-01-22 12:13:17

标签: c tail

我正在尝试使用tail -f构建一个使用#include <stdio.h> #include <stdlib.h> int main (){ printf("Tailing file"); system("tail -f read.txt", function(){ // this callback is called everytime new data is outputted from tail doSomething(); }); exit(0); } 来填充文件的C程序,但我希望它可以随时将某些内容写入文件。

我是一名javascript程序员,所以下一个例子可能在C语言的上下文中没有多大意义,但我想做的是:

{{1}}

我正在尝试做什么?谢谢你的帮助

3 个答案:

答案 0 :(得分:1)

我会在单独的长时间运行的线程中实现类似tail的东西。 Here是如何使用C连续读取打开的文件的示例。

here你可以找到尾程序的来源

答案 1 :(得分:0)

这在C中有点复杂。您需要创建另一个运行“tail -f”命令的进程,并处理此进程的stdout,然后重定向到正在运行main的进程。

幸运的是,如果你只想在一个方向上进行通信(即tail -f的进程输出),popen()函数就派上用场了。

看一下使用popen的这个Stackoverflow问题:how to control popen stdin, stdout, stderr redirection?

打开管道后,您必须使用fread或其他类似功能检索所需的输出。

答案 2 :(得分:0)

如果您需要使用tail -f,并且您不想自己拖尾文件,则需要打开一个管道。

正如其他人所说,popen是一种很好的方法:它就像fopen,除了它需要一个shell命令字符串,通过shell执行它,并返回一个FILE您可以使用fread阅读。管道中的读取将阻塞,直到数据可用。您可能需要大致类似的内容:

#define BUFSZ 1024
FILE *pipe = popen("tail -f yourfile", "r");
while (you still want to tail the file) {
    char buf[BUFSZ];
    fread(buf, BUFSZ, 1, pipe);
    /* do something with the data in buf */
}

如果您在等待尾部输出时需要执行其他操作,则需要使用pipe,这是popen在幕后使用的(较低级别)系统调用

相关问题