攀升·Uranus


Something Different,Something New
数据加载中……

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

    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个变量的文件描述符相同,进程表项中并不产生新的项目。

关于socket的文件描述符

    socket接口增加了网络通信操作的抽象定义,与文件操作一样,每个打开的socket都对应一个整数,我们称它为socket描述符,该整数也是socket描述符在文件描述符表中的索引值。但socket描述符在描述符表中的表项并不指向文件表,而是指向一个与该socket有关的数据结构。BSD UNIX中新增加了一个socket调用,应用程序可以调用它来新建一个socket描述符,注意进程用open只能产生文件描述符,而不能产生socket描述符。socket调用只能完成建立通信的部分工作,一旦建立了一个socket,应用程序可以使用其他特定的调用来为它添加其他详细信息,以完成建立通信的过程。

posted on 2009-12-22 10:10 攀升 阅读(850) 评论(0)  编辑 收藏 引用 所属分类: Linux


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理