对于unix中的文件描述符的复制,是一个非常重要的操作,系统提供了两个函数
案例分析:
这个图左边是一个进程的文件描述符表,其中0,1,2分别代表系统的标准输入,标准输出,以及标准错误输出,而3为路径为/home/tarena/tt文件,我们可以使用dup函数将1复制到空文件描述符4中,从而1和4都指向标准输出。
这个图左边是再将3中的tt文件指向复制到1中,则1和4都指向tt文件,右边是将3号文件描述符关闭,只有1指向tt文件
这个图意思是再将4指向的标准输出复制到1中,然后再关闭。
这三个图为大家举了一个文件描述符复制转移来实现输入输出重定向的例子,接下来给大家演示具体操作
#include<t_stdio.h> #include<t_file.h> #include<string.h> //重定向文件通过argvp[1]参数传递给进程 int main(int argc , char *argv[]){ char * msg= "this is a test\n"; //0 1 2 //文件以写的方式打开,文件不存在则创建,权限0644 //文件存在则将文件内容清空 int flags = O_WRONLY | O_CREAT | O_TRUNC; int fd = open(argv[1],flags,0644); if(fd==-1) E_MSG("open",-1); int s_fd=dup(1);//s_fd==4; 将标准输出保存到4; dup2(fd , 1);//将打开文件的描述符,复制到标准输出 //关闭文件描述符 close(fd); //通过标准输出将信息输出到件 write(1,msg,strlen(msg)); //恢复标准输出,重新指向显示器 dup2(s_fd , 1); close(s_fd); //写到了显示器 write(1,msg,strlen(msg)); return 0; }
该代码是先指定一个文件参数,如果不存在就创建,然后我们将标准输出复制到s_fd(4)中
然后将fd即我们创建的文件作为1,即标准输出的输出位置,此时第一个write就会输出到我们的创建文件中,然后我们将s_fd 即屏幕输出重新复制到1中,然后关闭s_fd, 然后再次通过1
write 则是输出到屏幕中: