dup和dup2的功能及区别

本文详细解析了Linux系统中dup与dup2函数的工作原理,包括如何复制文件描述符,以及dup2如何指定新文件描述符的值,并在特定情况下关闭原有描述符。通过具体代码示例,展示了这些函数在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <sys/socket.h>
#include <errno.h>
#include <unistd.h>

/* dup/dup2 test case. */
int main()
{

    int sockfd = socket(AF_INET, SOCK_STREAM, 0);  //sockfd = 3
    if(sockfd < 0)
    {
        printf("call to socket fial! And error number is %d\n",errno);
        return -1;
    }

    /*  #include <unistd.h>
     *  int dup(int exist_fd);
     *  dup用来复制参数exist_fd文件描述符。
     *  当复制成功时,返回最小的尚未被使用过的文件描述符,出错时,返回-1并设置errno.
     *  返回的新文件描述符和参数exist_fd指向同一个文件.
     *
     *  --------------------------------------------------------------------
     *
     *  #include <unistd.h>
     *  int dup2(int exist_fd, int specified_fd);
     *  dup2与dup区别是dup2可以用参数specified_fd指定新文件描述符的值。
     *  若参数specified_fd文件描述符已经被本进程使用,则本进程就会将specified_fd所指的文件关闭
     *  若specified_fd等于exist_fd,则返回specified_fd,而不关闭exist_fd所指的文件。
     *  若dup2调用成功则返回新的文件描述符,出错则返回-1并设置errno.
     *
     *  注意:通过dup和dup2创建的文件描述符并不继承原文件描述符的属性,比如close-on-exec和non-blocking等
     */

    int dup_ret1 = dup(sockfd); // dup_ret1 = 4
    int dup2_ret = dup2(sockfd,5); // fd_arg = 5 ---> fd_arg = 100 ---> fd_arg = 4 --->fd_arg = 3
    int dup_ret2 = dup(sockfd);

    int empty_dup = dup(101);/* 指定复制一个不存在的文件描述符,则将会出错返回-1并设置errno=9 */
                             /* #define	EBADF		 9	 Bad file number  */
    if(empty_dup < 0)
    {
        printf("dup fail! errno is %d\n", errno);
    }

    printf("sockfd = %d, dup_ret1 = %d, dup2_ret = %d, dup_ret2 = %d\n",sockfd, dup_ret1, dup2_ret, dup_ret2);
    return 0;
}

对dup2的测试可按代码中的注释顺序修改dup2的第二个参数值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值