【Linux系统编程】19.dup、dup2

文章详细介绍了Linux系统调用dup和dup2的功能及使用方法,包括文件描述符的复制以及重定向到其他文件。通过示例代码展示了如何在C语言中实现这两个功能,以及使用fcntl进行dup操作的另一种方式。测试结果验证了代码的正确性。
摘要由CSDN通过智能技术生成

目录

dup

参数oldfd

返回值

测试代码1

测试结果

dup2

参数oldfd

参数newfd

返回值

测试代码2

测试结果

测试代码3

测试结果

文件重定向。

 

dup

        文件描述符拷贝。 使用现有的文件描述符,拷贝生成一个新的文件描述符,且函数调用前后这个两个文件描述符指向同一文件。 后续作保存使用。

man 2 dup

 

参数oldfd

已有文件描述符。

返回值

新的文件描述符。

测试代码1

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

int main(int argc, char *argv[])
{
    int fd = open(argv[1], O_RDWR);		//得到一个文件描述符
    int fd1 = dup(fd);		//文件描述符拷贝
    printf("fd=%d\n", fd);
    printf("fd1=%d\n", fd1);
    close(fd);
    close(fd1);
    return 0;
}

测试结果

dup2

        文件描述符拷贝。重定向文件描述符指向。 通过该函数可实现命令行“重定向”功能。使得原来指向某文件的文件描述符,指向其他指定文件。

man 2 dup2

参数oldfd

已有的文件描述符。

参数newfd

待重定向文件描述符。

返回值

成功:newfd

失败:-1

测试代码2

        读取两个文件,修改第2个文件描述符的重定向到第1个文件描述符,再向第2个文件描述符写入内容,修改1的文件描述符重定向到第1个文件,终端输出内容。

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

int main(int argc, char *argv[])
{
    int fd1 = open(argv[1], O_RDWR);
    int fd2 = open(argv[2], O_RDWR);
    int flag;
    flag= dup2(fd1, fd2);		//fd2文件描述符重定向到fd1文件描述符
    flag=write(fd2,"hello world!",12);
    if(flag<0){
        perror("write error");
    }
    dup2(fd1,STDOUT_FILENO);		//终端输出重定向到fd1
    printf("\n你好,世界!\n");
    close(fd1);
    close(fd2);
    return 0;
}

测试结果

测试代码3

通过fcntl实现dup的功能。

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

int main(int argc, char *argv[])
{
    int fd1 = open(argv[1], O_RDWR);
    printf("fd1:%d\n", fd1);
    int fd2=fcntl(fd1,F_DUPFD,0);	//已被占用的文件描述符,返回最小可用的
    printf("fd2:%d\n",fd2);
    int fd3=fcntl(fd1,F_DUPFD,7);	//未被占用的文件描述符,返回该值
    printf("fd3:%d\n",fd3);
    close(fd1);
    close(fd2);
    close(fd3);
    return 0;
}

测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

因心,三人水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值