通常情況下,你只使用標準輸入重定向(FD 0,與<
重定向運算符),標準輸出(fd 1,>
)和標準錯誤(fd 2,2>
),這似乎限制您只有一個輸入流。
(當然你可以不喜歡cat f1 f2 f3 | program
,而是告訴文件除了會很難。)
但是,如果你真的真的想,你可以使用其他文件描述符號碼輸入了。這與重定向stderr
時的相同方式完成,只需在重定向操作符之前添加該數字即可。因此,運行
./prog 3<file1 4<file2 5< file3
會在打開給定文件FD的3,4和5,並通過那些上./prog
。該程序然後可以使用fdopen
將stdio流(FILE *
)與它們相關聯。這裏最大的問題是你需要一些方法來知道在程序中使用哪個fd,這很快就會需要使用諸如命令行參數之類的東西。下面的玩具例子是固定使用這三個fd的,當然這並不是一成不變的。
相反,你最好做所有其他程序做的事,並將文件名作爲命令行參數傳遞。即使在需要引用已經打開的文件描述符的情況下,許多Unix也可以通過名稱來引用它們:/dev/fd/1
等(Process substitution,它就像一個普通的管道,是需要的東西之一要做到這一點)
傻fdopen()
例如:
#include <stdio.h>
void read_a_line(int fd)
{
char buf[64];
FILE *f = fdopen(fd, "r");
fgets(buf, 64, f);
printf("fd %d: %s\n", fd, buf);
fclose(f);
}
int main(void)
{
read_a_line(3);
read_a_line(4);
read_a_line(5);
return 0;
}
不是'C'的問題,但答案是'cat',對於串聯流中的\ * nix的工具。 '貓f1 f2 f3 | 。/ a.out'完成這項工作。 –
@FelixPalmen當然,但他將無法區分文件。我認爲這個問題說得不好...... –
@示例代碼中的Jean-BaptisteYunès,看起來他已經知道了。否則,這應該是嘗試從'stdin'讀取的第一個疑問。 –