1 实验目的
理解Linux系统的输入和输出重定向是如何实现的。
学会编写简单的输入输出重定向程序
2 背景知识
复制一个现存的文件描述符。
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
当调用dup函数时,内核在进程中创建一个新的文件描述符,此描述符是当前可用文件描述符的最小数值,这个文件描述符指向oldfd所拥有的文件表项。
dup2和dup的区别就是可以用newfd参数指定新描述符的数值,如果newfd已经打开,则先将其关闭。如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。dup2函数返回的新文件描述符同样与参数oldfd共享同一文件表项。
3实验内容
使用open打开一个文件data.txt用于写入,
调用dup2将得到的文件描述符复制为1,
调用printf向屏幕输入若干信息。
代码如下
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int fd1;
int fd2;
// 打开文件
fd1 = open("data.txt", O_CREAT|O_WRONLY, 0666);
if (fd1 < 0){
perror("open");
exit(-1);
}
printf("fd1 ============== %d\n", fd1);
// 通过 fd1 复制出 fd2, 最终 fd1, fd2 都指向 “1.txt”
// 指定 fd2 的值为 1,1 原来指向标准输出设备,先 close(),再复制
fd2 = dup2(fd1, 1);
// 下面这句话的内容不会打印到屏幕上,而会写到文件 “1.txt” 里
// printf()是标准库函数,最终还是会调用系统调用函数write()
// 相当于这样,write(1,),往 1 文件描述符写内容,
// 默认的情况下, 1 文件描述符指向标准输出设备(如,显示屏)
// 所以, printf()的内容先显示到屏幕上
// 但是现在 1 文件描述符指向文件 “1.txt”
// 所以,printf()的内容会写入文件 “1.txt”
printf("fd2 ============== %d\n", fd2);
close(fd1);
close(fd2);
return 0;
}
程序结束后,使用cat命令,看看data.txt的内容。