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 <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#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 error\n");
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 <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFMAX 32
那如何将输出重定向到其他文件呢,只需要再打开一个文件,将其定向为输出位置,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#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 error\n");
exit(1);
}
if((fd1=open(argv[2],O_WRONLY))<0)
{
perror("open error\n");
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 <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFMAX 32
int loop=0;
以上就是文件操作中的标准输入、输出、重定向用法。感兴趣的可以去看看Unix环境高级编程,Linux开发的圣经值得反复读。