2012-11-20 73 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中读取,然后你就可以开始了。