2012-11-20 72 views
1

我正在尋找一種方法來從終端的管道或通過指定一個文件名作爲參數拉入到我的程序輸入。有效地C輸入通過管道或參數

1. foo | myprogram 
OR 
2. foo > bar; myprogram -w bar 

第二個操作僅通過讀取文件即可實現。然而,我正在繪製一個空白的如何使用管道將輸出從foo重定向到myprogram。在我設法找到的所有例子中,Pipes幾乎全部用於從父母到孩子的流程。我是在想一個合適的管道還是這是一個不同的機制?

我也意識到,當執行foo | myprogram時,程序會被模擬執行。如果連續讀入foo,這是如何處理的。

編輯:

忘了包括這一點:

int main(){ 
    char buff[255]; 
    int i = read(0, buff, 255); 
    printf("Debug: %s\n", buff); 
    return 0; 
} 

例如如果我執行ls | myprogram我傾向於接受。

. ../ files 
Debug: 

代替

Debug: . ../ files 
+1

你會想用'dup2'系統調用。 – squiguy

+0

另請參見http://advancedlinuxprogramming.com/ –

+0

做這樣的'read'不能保證NUL終止的字符串,這是'printf'正常工作所需的字符串。另外,'read'將會阻塞,直到看到255個字符 - 數組中將不會有空間放置NUL字符。 – prprcupofcoffee

回答

0

你可以做這樣的事情:

FILE* input; 
//... 
if (argc == 1) { 
    input = stdin; 
} else { 
    input = fopen(argv[2] /* or whatever */, "r"); 
} 
3

第二操作是通過讀取文件簡單地accoplished。 但是,我正在繪製一個空白的如何使用管道將foo 的輸出重定向到myprogram中。

當使用管道重定向,外殼建立的過程中stdout左邊轉到右邊的過程stdin。正如你平常所想的那樣,你只需要從stdin中讀取,然後你就可以開始了。