zoukankan      html  css  js  c++  java
  • linux文件设备与I/O: dup和dup2函数

    linux文件设备与I/O: dup和dup2函数_面包坊_百度空间

    linux文件设备与I/O: dup和dup2函数

    dup 和dup2 都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file 结构体。如果两个文件描述符指向同一个file 结构体,File Status Flag和读写位置只保存一份在file 结构体中,并且file 结构体的引用计数是2。如果两次open 同一文件得到两个文件描述符,则每个描述符对应一个不同的file 结构体,可以有不同的File Status Flag和读写位置。

    #include <unistd.h>
    int dup(int oldfd);
    int dup2(int oldfd, int newfd);

    如果调用成功,这两个函数都返回新分配或指定的文件描述符,如果出错则返回-1。dup 返回的新文件描述符一定该进程未使用的最小文件描述符,这一点和open 类似。dup2 可以用newfd 参数指定新描述符的数值。如果newfd 当前已经打开,则先将其关闭再做dup2 操作,如果oldfd 等于newfd ,则dup2 直接返回newfd 而不用先关闭newfd 再复制。

    newfd=dup(oldfd);
           dup2(oldfd,newfd);
         是相同的,但是第一句的newfd是系统分配的,未使用的最小描述符,而第二句的newfd可以自己指定。。结果都是让 newfd 指向 oldfd。


    #include <unistd.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main(void)
    {
            int fd, save_fd;
            char msg[] = "This is a test\n";
            fd = open("somefile", O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);
            if(fd<0)
           {
                    perror("open");
                    exit(1);
            }
            save_fd = dup(STDOUT_FILENO);
            dup2(fd, STDOUT_FILENO);
            close(fd);
            write(STDOUT_FILENO, msg, strlen(msg));
            dup2(save_fd, STDOUT_FILENO);
            write(STDOUT_FILENO, msg, strlen(msg));
            close(save_fd);
            return 0;
    }


    对于dup,dup2函数,还有两种等效的表示方法。
    (1) f2=dup(f1)       ---------> f2 =fcntl(f1, F_DUPFD, 0)
       dup(f2,f1)             ------->         fcntl(f1, F_DUPFD, f2)
        (2)     f2=dup(f1)    ---------> f2=open("/dev/fd/f1", mode);
              打开 /dev/fd/n 等效于复制文件描述符n
  • 相关阅读:
    C语言I博客作业06
    C语言I博客作业05
    C语言I博客作业04
    C语言I博客作业03
    C语言I博客作业02
    第一次作业
    C语言I博客作业09
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
  • 原文地址:https://www.cnblogs.com/lexus/p/2869723.html
Copyright © 2011-2022 走看看