dup dup2 不仅仅是int那么简单

dup和dup2都是复制文件描述符的函数。作用像指向某个文件流的指针。但是文件描述符的值又像int那样直观。所以有时候如果直接赋值,其实是没有多大效果的。

在uulp中(understand unix/linux programming)中第329页给出了一个dup函数的使用案例:

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

#define CLOSE_DUP
//#define USE_DUP2

int main(){
    int fd;
    //int newfd;
    char line[100];

    fgets(line ,100, stdin); printf("%s",line);
    fgets(line ,100, stdin); printf("%s",line);
    fgets(line ,100, stdin); printf("%s",line);

    

    fd = open("data", O_RDONLY);
#ifdef CLOSE_DUP
    close(0);
    //printf("fd=%d\n",fd);
    newfd = dup(fd);
    
   
    printf("newfd = %d\n",newfd);
#else
    printf("fd = %d\n",fd);
    newfd = dup2(fd,0);
    printf("newfd = %d\n",newfd);
#endif
    
  if(newfd != 0){
        fprintf(stderr, "Could not duplicate fd to 0\n");
        exit(1);
    }

    fgets(line ,100, stdin); printf("%s",line);
    fgets(line ,100, stdin); printf("%s",line);
    fgets(line ,100, stdin); printf("%s",line);

    return 0;
}


上面这个程序首先从标准输入获取三行,然后关闭标准输入文件描述符0,然后把打开data文件的文件描述符复制为0,这样就把标准输入重定向到data文件。然后最后三行代码从data文件获取三行输入。

测试结果:

abd
abd
ekd
ekd
loi
loi
fd = 3
newfd = 0
1234566444 3874732
1237 328318 443.223
19384 54030  0504045 1234566444 3874732

这里我做了一个实验。就是把newfd直接赋值为0,而不是通过dup函数复制,结果发现是没有用的,这样做的后果是不会发生重定向,最后三行是从前面buf中最后的数据输出了三遍。

abc
abc
ifj
ifj
atlast
atlast
fd=0
atlast
atlast
atlast

然后找到了一片kernel源码分析的文章,在这里做个保存

Linux内核分析:dup、dup2的实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值