Linux下一切皆文件,所谓的终端那个黑框也可以视为一个文件,在Linux驱动开发中各个设备也可以被认为是文件操作,所以文件的操作很重要。我们通常将键盘叫做标准输入设备、将显示器叫做标准输出设备,下面由几个例子来解释文件的标准输入、标准输出、输出重定向。
一、命令行下的标准输入、标准输出、输出重定向在命令行中可以使用echo命令将想输的字符串输出在终端上,结果如下:
lzn@ubuntu:~$ echo abcdefdg abcdefdg
这就是标准输出。
在终端中可以使用cat命令来展示标准输入,cat命令后加文件,会在终端展示文件内容,如果不加文件,则你从键盘输入什么消息,他就会在终端展示什么消息,结果如下:
lzn@ubuntu:~$ cat abc 这里是文件的内容 lzn@ubuntu:~$ cat 现在是键盘输入的内容 现在是键盘输入的内容 只有使用Ctrl+C才可以退出回到命令行 只有使用Ctrl+C才可以退出回到命令行 ^C lzn@ubuntu:~$
这里展示的是标准输入,其实也包含了标准输出,因为也是在终端显示的信息。cat abc是查看abc文件的内容。
重定向多用于输出重定向,所以下面只在终端做输出重定向的例子,输出重定向用>,>>,2>。输入重定向号用符号<表示,<表示输出重定向并覆盖以前的数据,<<表示输出重定向追加在以前的数据后。2>表示错误输出,最后还是会把数据输出在终端上即输出在标准输出设备上。下面是例子(test是我的测试文件):
lzn@ubuntu:~$ echo abcd abcd lzn@ubuntu:~$ echo abcd > test lzn@ubuntu:~$ cat test abcd lzn@ubuntu:~$ echo efgh > test lzn@ubuntu:~$ cat test efgh lzn@ubuntu:~$ echo abcd >> test lzn@ubuntu:~$ cat test efgh abcd lzn@ubuntu:~$ echo aaaaaaaa 2> test aaaaaaaa lzn@ubuntu:~$ cat test 注意:错误输出虽然不会输出在test文件里,但是还是会清空test文件,还有2>>重定向就不演示了。
以上内容就是命令行中标准输入、输出、重定向的用法。
二、文件操作中的标准输入、输出、重定向用法
每一个文件都有自己的文件描述符,系统会将0、1、2分配给标准输入、标准输出、错误输出。所以我们打开的文件名是从3开始的。当然我们也可以将文件描述符改为0、1、2,这里就不说了。
下面根据代码来展示标准输入输出、重定向的用法。
#include#include #include #include #include #include #define BUFFMAX 32 int main(int argc,char **argv) //argc表示执行文件后的参数数量,argv[]表示后面参数代表的 文件,argv[0]代表本段代码的文件名 { if(argc<2) { perror("少于1个文件!n"); exit(1); } int fd0; if((fd0=open(argv[1],O_RDONLY))<0) //打开文件并判断文件是否正确打开 { perror("open errorn"); exit(1); } int len; char buf[BUFFMAX]; while(1) { len=read(fd0,buf,BUFFMAX); //read和write都是简单的函数,不懂可以去搜 if(len>0) { write(1,buf,len); //这里1表示标准输出,就是将数据显示在终端上 } if(len==0) break; } close(fd0); exit(0); }
以上代码功能就是将文件的内容标准输出,当然输出的文件就是屏幕即终端界面,运行结果如下:
lzn@ubuntu:~$ ./a a.c //执行a.c的代码来输出a.c的程序,以下是输出,只截取部分。 #include#include #include #include #include #include #define BUFFMAX 32
那如何将输出重定向到其他文件呢,只需要再打开一个文件,将其定向为输出位置,代码如下:
#include#include #include #include #include #include #define BUFFMAX 32 int main(int argc,char **argv) { if(argc<2) { perror("少于2个文件!n"); exit(1); } int fd0,fd1; if((fd0=open(argv[1],O_RDONLY))<0) { perror("open errorn"); exit(1); } if((fd1=open(argv[2],O_WRONLY))<0) { perror("open errorn"); close(fd0); exit(1); } int len; char buf[BUFFMAX]; while(1) { len=read(fd0,buf,BUFFMAX); if(len>0) { write(fd1,buf,len); //把刚才的1换成了另一个文件的文件描述符 } if(len==0) break; } close(fd0); close(fd1); exit(0); }
下面是执行结果:
lzn@ubuntu:~$ vim a.c
lzn@ubuntu:~$ gcc -o a a.c
lzn@ubuntu:~$ ./a a.c test //执行a.c的代码将a.c程序重定向输出到test文件中。以下只是部分输
出
lzn@ubuntu:~$ cat test
#include
#include
#include
#include
#include
#include
#define BUFFMAX 32
int loop=0;
以上就是文件操作中的标准输入、输出、重定向用法。感兴趣的可以去看看Unix环境高级编程,Linux开发的圣经值得反复读。



