目录
前言
重定向在linux中的应用比较多,重定向就是把原本要写入A的数据,不写入A,反而写入B了,在linux中可以用重定向来完成进程间通信(使用管道)。
重定向
重定向就是将原本要输入A的数据,不写入A,而是写入B。对linux来说键盘、鼠标就是一种输入设备,也叫标准输入设备,显示器,屏幕,音响等就是标准输出设备,重定向就是将本应该由标准输入/输出设备要输入的数据,转由其他文件或设备输入/输出
文件标识符:linux用整数来指明与特定进程间的数据流,一般是0~9,其中系统在打开任意一个进程时都会默认打开三个文件:stdin(标准输入,0)、stdout(标准输出,1)、stderr(标准错误,2),所以如果要给进程打开其他文件,则只能从3开始。
另外一提,通常向文件写入数据时,会先将数据写入缓冲区,但对于系统调用接口(open、read、write等)没有缓冲区,是直接写入/打印文件,但printf、fprintf、fwrite等是有缓冲区的,如果在不刷新缓冲区就退出进程的情况下,缓冲区里的数据会丢失。
指令
~ 输出重定向
Command > filename 将标准输出重定向到一个新文件
Command >> filename 将标准输出以追加的方式重定向到一个新文件
Command > filename 2>&1 将标准输出和标准错误一起重定向到一个新文件中
Command 2 > filename 将标准错误重定向到一个新文件中
Command 2 >> filename 将标准错误以追加的方式重定向到一个新文件中
Command >> filename 2>&1 将标准输出和标准错误以追加的方式重定向到一个新文件中
~ 输入重定向
Command < filename > filename2: command命令以filename作为标准输入,以filename2作为标准输出
Command < filename:以filename作为标准输入
Command < delimiter:从标准输入中读入,直到遇到delimiter分界符
~ 绑定重定向
Command > &m:将标准输出重定向到文件描述符m中
Command < &-:关闭标准输入
Command 0 > &-:关闭标准输入
举例:
ls 1 > test.txt:将标准输出重定向到text.txt文件
2 > &1 :&1表示标准输出,该指令表示将标准错误重定向到标准输出
./main > /dev/null 2 > &1 :将标准错误标准输出都重定向到/dev/null文件,该指令是先将1重定向到文件,再将2重定向到1,所以,1和2其实都重定向到了文件
./main 2 > &1 > /dev/null :将标准错误重定向到标准输出,然后将标准输出重定向到/dev/null,该指令和上面一条并不一样。这个是先将2重定向到1也就是显示器,再将1重定向到文件,1和2最终指向不一样
相关函数
int dup2(int oldfd,int newfd):让newfd和oldfd都指向oldfd所代表的文件,相当于把newfd重定向到oldfd,如果newfd本身代表了一个已经打开的文件,则重定向前会释放其文件。
管道符 |
管道就是重定向的一种表现,可以将一个命令的输出作为下一个命令的输入,可通过多个命令相互配合来完成比较复杂的内容。