dup和dup2

int dup(int fd);

   dup的返回值是一个描述符,该描述符也指向fd所指向的文件,即复制了一份描述符。

int dup2(int f1, int f2);

  dup2吧f2设置成f1所指向的文件的描述符(复制),如果f2是已经打开的其他描述符,那么会先关闭f2在指定;如果f2==f1那么会返回f2.

===================以下是转载的例子=============================

dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。


#include <unistd.h>
int dup(int newfd);
int dup2(int newfd, int oldfd);
      
下面用一个简单的例子解释两个函数的用法和区别:
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 int main(void)
 {
     int fd, save_fd;
     char msg[] = "This is a test of dup() & dup2()\n";
     int test;
     fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
     if(fd<0) {
         perror("open");
         exit(1);
     }
     save_fd = dup(STDOUT_FILENO);                        //运行后save_fd指向STDOUT——FILENO,即save_fd指向标准输出
     printf("save_fd=%d\n",save_fd);                             //测试用
     test=dup2(fd, STDOUT_FILENO);                         //运行后STDOUT_FILENO指向fd所指向的文件,即
STDOUT_FILENO指向somefile
     printf("dup2_1=%d\n",test);                                   //测试用 此时的标准输出不再指向显示器,因此该段测试将写入somefile文件中
     close(fd);
     write(STDOUT_FILENO, msg, strlen(msg));           //此时STDOUT_FILENO所指向的是somefile文件不再是标准输出流,因此
该段将
                                                                              //写入somefile文件中

     test=dup2(save_fd, STDOUT_FILENO);                 //运行后STDOUT_FILENO指向save_fd所指向的文件,即标准输出流
     printf("dup2_2=%d\n",test);                                  //测试用 此时标准输出流重新指回显示器,因此该段测试将写入显示器
     write(STDOUT_FILENO, msg, strlen(msg));           //此时STDOUT_FILENO所指向的便回标准输出流该段将写入显示器
     close(save_fd);
     return 0;
 }
该程序运行后显示器上显示的内容为:
[crosslandy@localhost PIPE]$ ./dup_example 
save_fd=4
dup2_2=1
This is a test
somefile文件内的内容为:
dup2_1=1
This is a test


注:本例子转自他人
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值