16.1.2 dup系统调用
系统调用dup用来复制一个文件描述符,该操作是通过对u区中文件描述符复制实现的。因此,系统调用dup能让多个文件描述符指向同一文件,便于管道操作。与该调用相关的函数有两个,分别是dup()函数和dup2()函数,一般形式如下:
int dup(int oldfd);
int dup2(int oldfd, int newfd);
其中,oldfd是原有的文件描述符,newfd为指定的新文件描述符。这两个函数的区别为,dup()函数自动分配新文件描述符,并保证该文件描述符没有被使用。dup2()函数使用newfd参数指定新文件描述符,如果该文件描述符已存在,则覆盖对应的文件描述符。新旧文件描述符可交换使用,并共享文件锁、文件指针和文件状态。调用成功时,函数返回值为新文件描述符,否则返回–1。如下例所示:
#include <unistd.h> // 标准函数库
#include <stdio.h> // 基本输入输出函数库
#include <sys/types.h> // 该头文件提供系统调用的标志
#include <sys/stat.h> // 进程状态及相关操作函数库
#include <fcntl.h> // 该头文件包含文件I/O操作相关
// 标志
int main()
{
int fd;
if ((fd = open("output", O_CREAT|O_RDWR,0644)) == -1) {
// 打开或创建文件
perror("打开或创建文件出错");
return 1;
}
close(1); // 关闭标准输出
dup(fd); // 复制fd到文件描述符1上
close(fd); // 关闭文件描述符fd
puts("该行数据将输出到文件中");
return 0;
}
代码中,标准输出(文件描述符为1)关闭,并将一个普通文件output的文件描述符复制到标准输出上。因为刚关闭了文件描述符1,文件描述符表的第一个空表项是1,dup()函数调用将fd的文件描述符复制到该位置上。所以,程序以后的向标准输出写的内容都写到了文件output中。