一、输入输出重定向
输入重定向:将文件导入指定命令中
输出重定向:将原本输出打开屏幕上数据信息写入到文件当中
标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可以从其他文件或者命令中输入
标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕
标准输出重定向符号
1“>”将标准输出重定向到指定文件中(清空原有数据)
2“>>”将标准输出重定向到指定文件中(追加到原有数据后面)
下面以>为例
1.首先用touch创建一个空白文件夹readme.txt
2.用运行date>readme.txt 将原本应该显示在屏幕上的内容写入到readme.txt中
二、dup与dup2
dup创建一个文件描述符的副本,但是新的fd(file descriptor)不可以被指定,默认为最小的没有被使用的文件描述符,dup2与dup相同可以创建一个文件描述符的副本,并且可以指定具体的文件描述符。
dup与dup2的函数原型如下:
int dup(int oldfd);
int dup2(int oldfd, int newfd);
失败返回-1
成功返回新fd
注意:dup和dup2创建的文件描述符并不继承原fd的属性
案例:
本案例将首先利用open函数打开一个文件,然后利用dup2将STDOUT重定向到打开的文件,然后调用printf,这时printf打印的内容就会输入到打开的文件当中。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
int main(int argc,char*argv[])
{
int fd=open("./duptest.txt",O_RDWR|O_CREAT); //打开一个文件
if(fd==-1)
{
perror("open error\n");
}
int newfd=dup2(fd,STDOUT_FILENO);//将文件描述符STDOUT_FIEN重定向到fd中,这样输出到屏幕的内容就会写入fd指向的文件中
if(newfd==-1)
{
perror("dup2 error\n");
}
printf("------输入到屏幕------\n"); //原本应该是打印在屏幕上,但是现在运行程序不会显示在屏幕上,而是写入./duptest.txt这个文件当中
close(fd);
return 0;
}
从下图可以看出运行上面代码后屏幕上没有任何输出,但是我们查看duptest.txt这个文件,文件的内容就是原本我们要输出到屏幕上的内容。