dup与赋值语句用于文件描述符的区别

时间:2021-06-06 21:59:25

转载自:  http://www.cppblog.com/iuranus/archive/2009/12/22/103672.html

dup/dup2的使用请参考其他资料,个人只是想了解dup后文件描述符,进程表项,文件表的关系。

    进程要对文件进行操作,一般使用open调用打开一个文件进行访问,每个进程都有一个文件描述符表,该表中存放打开的文件描述符。用户使用open等调用得到的文件描述符其实是文件描述符在该表中的索引号,该表项的内容是一个指向文件表的指针。应用程序只要使用该描述符就可以对指定文件进行操作。 
    
    为了了解dup与赋值语句用于文件描述符的区别,请看如下程序。

程序描述:

    打开一个文件描述符,分别适用dup和赋值语句进行复制,复制之后,打印原始和被复制的文件描述符id,看看是否具有相同的值,然后关闭文件,测试关闭是否成功。

程序示例:

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <unistd.h>

 

int sys_err(char *str)

{

    puts(str);

    exit(0);

}

 

int main(void)

{

    int p,q;

 

    if((p=open("c_fid.c", O_RDONLY)) == -1)

        sys_err("open error");

    q = dup(p);

    puts("dup:");

    printf("file p,q fd is:%d %d\n", q, p);

    printf("close file p ok?: %d\n", close(p));

    printf("close file q ok?: %d\n", close(q));

 

    if((p=open("c_fid.c", O_RDONLY)) == -1)

        sys_err("open error");

    q = p;

    puts("=:");

    printf("file p,q fd is:%d %d\n", q, p);

    printf("close file p ok?: %d\n", close(p));

    printf("close file q ok?: %d\n", close(q));

 

    return 0;

}

 

程序运行结果:

dup:

file p,q fd is:4 3   //文件p,q使用不同的文件描述符

close file p ok?: 0

close file q ok?: 0 //文件关闭成功

=:

file p,q fd is:3 3 //简单复制

close file p ok?: 0

close file q ok?: -1//关闭失败,原因是此描述符已经被关闭了

 

    由此证明,dup是产生一个新的文件描述符id和指针在进程表项中,但是他们共用文件表,这时,关闭一个文件描述符,另外一个仍旧可用,文件表并不会被释放。而赋值语句不同,它只是简单的在另外一个变量中记录原始文件指针等,2个变量的文件描述符相同,进程表项中并不产生新的项目。使用文件描述符关闭了一次后文件就真的关闭了。