16.1.2 dup系统调用

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,文件描述符表的第一个空表项是1dup()函数调用将fd的文件描述符复制到该位置上。所以,程序以后的向标准输出写的内容都写到了文件output中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值