2014-01-22 86 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用途在幕後。