文件IO-dup

函数功能

  • 复制已有的文件描述符
#include <unistd.h>
int dup(int  fd) ; 
int dup2(int  fd, int fd2) ;
// 调用dup(oldfd)等效于
fcntl(oldfd, F_DUPFD, 0)
// dup2(fd, fd2) ;
close(fd2);
fcntl(fd, F_DUPFD, fd2);
  • dup和dup2都可以用来复制一个现有的文件描述符,返回的新的文件描述符与fd共享一个文件表项。
  • 两者不同之处是,dup2可以用参数fd2指定新的描述符。
  • 若fd2已经打开,则先将其关闭。若fd等于fd2,则不关闭它。fcntl函数的功能之一就是复制一个现有的描述符。

简单示例代码

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

#define TXT "a.txt"

int main(int argc, char * argv[])
{
    int fd1, fd2;

    fd1 = open(TXT, O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
    if (fd1 == -1)
    {
        perror("Error open func.\n");
        exit(EXIT_FAILURE);
    }

    fd2 = dup(fd1);
    if (fd2 == -1)
    {
        perror("Error dup func.\n");
        exit(EXIT_FAILURE);
    }

    int n;
    char buf[1000];
    while ((n = read(STDIN_FILENO, buf, 1000)) > 0)
    {
        if (write(fd2, buf, n) < n)
        {
            perror("Error write func.\n");
            exit(EXIT_FAILURE);
        }
    }

    exit(EXIT_SUCCESS);
}

题目:要求不使用fcntl来实现dup2的功能。

posted @ 2022-08-20 16:37  starc的miao  阅读(38)  评论(0)    收藏  举报