1.三个数据流
标准输入:需要处理得数据流。标准文件描述符:0--stdin
标准输出:结果数据流。标准文件描述符:1--stdout
标准错误输出:错误信息流。标准文件描述符:2--stderr
2.重定向I/O的是shell而不是程序
cmd>filename告诉shell将文件描述符1定位到文件。于是shell就将文件描述符与指定的文件连接起来。
shell并不将重定向标记和文件名传递给程序。
实例证明:
#include<stdio.h>
main(int argc,char *argv[]){
int i;
printf("%d args:\n",argc);
for(i=0;i<argc;i++){
printf("%s\n",argv[i]);
}
fprintf(stderr,"this is message sent to stderr.\n");
}
结果分析:
$ ./listargs testing >xyz one two 2> oops
只有testing、one、two是命令的参数,>xyz和2>oops是用来作重定向的,且testing、one、two和>xyz、2>oops的位置可以任意的交换都不影响结果。
stdout上没有输出,输出全部到了xyz和oops两个文件里:
$ cat xyz
4 args:
./listargs
testing
one
two
$ cat oops
this message is sent to stderr.
shell提供文件描述符2的重定向。
shell的重定向操作:
一 .who>userlist 将stdout文件连接到一个文件
二 .sort<data 将stdin连接到一个文件
三.who | sort 将stdout连接到stdin
3.”最低可用文件描述符“原则
”最低可用文件描述符“原则:当打开文件时,为此文件安排的描述符总是此数组中最低可用位置的索引。
因此将stdin定向到文件实现起来其实非常简单:先close(0),再打开一个文件,这时分配给该文件的文件描述符就是0。在读写文件时我们依然使用stdin(数字0)这个文件描述符,实现是在操作一上普通文件,而非标准输入。
实例:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<fcntl.h> 4 #include<string.h> 5 main(){ 6 int fd; 7 char line[100]; 8 fgets(line,100,stdin); 9 printf("%s",line); 10 close(0); 11 fd=open("/etc/passwd",O_RDONLY); 12 if(fd!=0){ 13 fprintf(stderr,"Could not open data as fd 0\n"); 14 exit(1);