2014-01-22 57 views
0

我试图建立一个尾部使用tail -f文件的C程序,但我想它做的数据随时东西写入文件的东西。Ç - 尾矿文件和拦截输出

我是一个JavaScript程序员,所以接下来的例子可能不会太大的意义在C语言的环境中,但我想这样做是这样的:

#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); 

} 

是我”试图做到可能吗?感谢您的帮助

+1

检查[POPEN](http://linux.die.net/man/3/popen)。 – BLUEPIXY

+0

或者,如果程序是比较通用的,有时你想给它的'尾-f'输出,刚刚从'stdin'和命令行管它读取。 – Shahbaz

+0

也许你应该在它的读取文件启动整个。如果你有这个工作,去阅读其他人链接的系统命令“tail”的源代码,然后再扮演你自己的角色。简单地从C文件启动系统命令的方法没有多大意义。为什么不直接调用'tail',而是将其包装到C启动器中。 – alk

回答

0

这是一个稍微复杂一点的C.你需要创建一个运行的“尾-f”命令另一个进程,并处理此过程中,您重定向到您的进程正在运行的主要标准输出。

幸运如果只想在一个方向上popen()功能派上用场(即尾-f的过程输出)进行通信。

看一看这个问题#1使用POPEN:how to control popen stdin, stdout, stderr redirection?

你已经打开了,你必须检索使用的fread或其他类似职能所需的输出管道之后。

+2

用popen(或任何其他相似性)来访问尾巴做的工作就像是杀苍蝇用砖头 - 是的,它可以工作,但有更好的方式 - 如直接读取文件在自己的代码。由于尾部程序是开源的,阅读它看它是如何工作的很容易完成。 – mah

+1

@mah,'tail -f'在文件被附加到后会一直更新输出。如果我们已经有'tail -f',那么我个人不希望这样做。看一看的[源代码(http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tail。c)如果你想看看应该照顾多少事情! – Shahbaz

+0

@Shahbaz一个比你想要的更难的问题并不能证明它是以可怕的方式解决它!所有尾巴都不可能在非一般情况下执行。有时候需要popen,但是作为非阻塞文件I/O的代理(这是所有这些使用的 - 在启动两个额外的进程的过程中将其变为阻塞)不属于它们。 – mah

1

我将实施类似的独立长时间运行的线程的尾巴。 Here是一个例子,如何阅读不断使用C.

而且here你可以找到尾程序

+1

我同意@Dabo--最好是在自己的程序中简单地管理阅读,而不是依靠另一个人来完成这项微不足道的工作。 – mah

+0

注意:这里是gnu的实现:http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tail.c – Shahbaz

+0

@Shahbaz是的,这个更好。 – Dabo

0

的来源。如果你需要使用tail -f打开的文件,而你不想尾文件自己,你需要打开一个管道。

正如其他人所说,popen是做到这一点的好办法:这就像fopen只不过它采用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用途在幕后。