dup()和dup2()

  dup和dup2函数都是复制文件描述符的函数,其会将目标文件描述符的文件表项复制给一个其他的文件描述符。

  简而言之,dup等函数可以一个已经打开的文件描述符表项复制给另一个文件描述符中,即可以通过两个不同的文件描述符来操控同一个文件。

  函数形式:

  int dup(int oldfd);成功返回目标文件的描述符,失败则返回-1.如int fd2 = dup(fd); fd2则会得到一个新的文件描述符,而且可以和fd一起操控同一个文件。

  在使用之后也需要将两个文件描述符关闭:

  close(fd);
  close(fd2);

 int dup2(int oldfd, int newfd); 成功则返回目标文件描述符,失败返回-1.oldfd 为源文件的描述符, newfd为目标文件描述符。其在运行时,会先检查newfd是否存在,如果存在,则会先关闭newfd,后将其复制给后者。如果空闲,则直接复制。

  实例代码如下:

  

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
int main(void) {
    int fd1 = open("dup.txt", O_RDWR | O_CREAT |
        O_TRUNC, 0644);
    if (fd1 == -1) {
        perror("open");
        return -1;
    }
    printf("fd1 = %d\n", fd1);
    int fd2 = dup(fd1);
    if (fd2 == -1) {
        perror("dup");
        return -1;
    }
    printf("fd2 = %d\n", fd2);
    int fd3 = dup2(fd2, 100);
    if (fd3 == -1) {
        perror("dup2");
        return -1;
    }
    printf("fd3 = %d\n", fd3);
    const char* text = "Hello, World!";
    if (write(fd1, text, strlen(text) * sizeof(
        text[0])) == -1) {
        perror("write");
        return -1;
    }
    if (lseek(fd2, -6, SEEK_CUR) == -1) {
        perror("lseek");
        return -1;
    }
    text = "Linux";
    if (write(fd3, text, strlen(text) * sizeof(
        text[0])) == -1) {
        perror("write");
        return -1;
    }
    close(fd3);
    close(fd2);
    close(fd1);
    return 0;
}

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值