`

File descriptor(FD)

    博客分类:
  • Unix
阅读更多
Contains:
1、FD
2、fcntl
3、dup、dup2    
4、ioctl
文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。

引用
文件描述符在形式上是一个非负整数。
     实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。


优点:
文件描述符的优点主要有两个:
   * 基于文件描述符的I/O操作兼容POSIX标准。
   * 在UNIX、Linux的系统调用中,大量的系统调用都是依赖于文件描述符。
FD的生成
   * open(), open64(), creat(), creat64()
   * socket()
   * socketpair()
   * pipe()

对于内核而言,所有打开的文件都通过文件描述符引用。
内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。
1、每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是:
  • a、文件描述符标志(close_on_exec)
  • b、指向文件表项的指针

2、内核为所有打开文件维持一张文件表。每个文件表项包含:
  • a、文件状态标志(读、写、添写、同步和非阻塞等)
  • b、当前文件偏移量
  • c、指向该文件v节点表项的指针

3、每个打开文件都有一个v节点结构,v节点包含了文件类型和对此文件进行各种操作的函数的指针。对于大多数文件,v节点还包含了该文件的i节点。

关于多个进程同时写同一文件的时候,会产生覆盖的问题,unix提供了一种方法使这个操作成为原子操作,该方法是打开文件时设置O_APPEND标志。每次对文件进行写之前,都将进程的当前偏移量设置到该文件的尾端处,于是在每次写之前就不再需要调用lseek。

dup和dup2

用来复制一个现存的文件描述符
#include <unistd.h>
int dup(int fieldes)
int dup2(int fieldes, int fieldes2)

dup返回的新文件描述符一定是当前可用的文件描述符中的最小数值。dup2的fieldes2参数可以制定新描述符的数值。如果fieldes2已经打开,则将其先关闭。
返回的新文件描述符与参数fieldes共享一个文件表项。
复制一个描述符的另外一种方法是使用fcntl
dup(fieldes); 等效于fcntl(fieldes, F_DUPFD, 0);
dup2(filedes, fieldes2);等效于
close(fieldes2);
fcntl(fieldes,F_DUPFD, filedes2)
fcntl函数

可以改变已经打开文件的性质。
#include <fcntl.h>
int fcntl(int fieldes. int cmd, .../* int arg */);

它提供了五种功能:
  • 1、复制一个现有的描述符(cmd = F_DUPFD).
  • 2、获得/设置文件描述符标记(cmd = F_SETFD 或 F_GETFD)
  • 3、获得/设置文件状态标志(cmd = F_GETFL 或 F_SETFL)
  • 4、获得/设置异步I/O所有权(cmd = F_GETOWN或 F_SETOWN )
  • 5、获得/设置纪录锁(cmd =  F_GETLK、F_SETLK或者F_SETLKW)

ioctl函数
ioctl函数是I/O操作的杂物箱。
dev/fd
较新的系统都提供名为/dev/fd的目录,其目录项是名为0、1、2等的文件。打开文件/dev/fd/n等效于复制描述符n

参考资料:
http://en.wikipedia.org/wiki/File_descriptor
http://zh.wikipedia.org/wiki/%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6
分享到:
评论

相关推荐

    2009 达内Unix学习笔记

    集合了 所有的 Unix命令... ln -s file1 file1.sln 创建软链接。可跨系统操作,冲破操作权限;也是快捷方式。 八、时间显示 date 显示时间,精确到秒 用法 date [-u] mmddHHMM[[cc]yy][.SS] date [-u] [+format] ...

    Python3 File 方法总结 (超详细!)

    file.fileno() — 返回一个整型的文件描述符(file descriptor FD 整型)4. file.isatty() — 检测文件是否连接到一个终端设备,如果是返回 True,否则返回 False5. file.next() — python3的内置函数next()通过迭代...

    Netdata Detects

    "FD" stands for "file descriptor". A file descriptor is an integer that the operating system assigns to an open file to track it. This includes regular data files, directories, network sockets, pipes,...

    jruby-complete-9.2.11.0.jar

    burpsuite插件接口ruby,直接在burp extend option里面添加,就可以在store里面添加需要的插件啦

    fd:Swift文件描述符套接字库

    FileDescriptor是包含单个属性(fileNumber)的协议。 protocol FileDescriptor { var fileNumber: FileNumber { get } } FileDescriptor有各种协议扩展,可以添加功能。 关闭 您可以关闭文件描述符。 try ...

    Linux shell编程中IO和条件及循环处理的细节问题讨论

    谈到I/O redirection,不妨先让我们认识一下File Descriptor(FD)。程序的运算,在大部份情况下都是进行数据(data)的处理,这些数据从哪读进?又,送出到哪里呢?这就是File descriptor(FD)的功用了。 在shell...

    Bash Redirections - Cheat Sheet-计算机科学

    1 is the default file descriptor (fd) for stdout.cmd 2&gt; file Redirect the standard error (stderr) of cmd to a file. 2 is the default fd for stderr.cmd &gt;&gt; file Append stdout of cmd to a file.cmd 2&gt;&gt; ...

    jdk:JDK原始码学习

    * FileDescriptor【文件描述类】(用来表示开放文件,开放socket(套接字)等,不透明的,被FileInputStream或FileOutputStream包含为属性): * 若干属性:fd(int)、handle(long)、parent(Closeable)、otherParents...

    linux 下socket通信中select的用法实例

    第一,struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(file descriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以...

    浅谈Linux 网络 I/O 模型简介(图文)

    Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有响应的描述符,称为...

    Socket Python示例

    fromfd() -- create a socket object from an open file descriptor [*] fromshare() -- create a socket object from data received from socket.share() [*] gethostname() -- return the current hostname ...

    shell 1filename重定向的含义和区别

    在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是: 0 是一个文件描述符,表示标准输入(stdin) 1 是一个文件描述符,表示标准输出(stdout) 2 是一个文件描述符,表示标准错误(stderr) 在标准...

    WaveFormViewDemo:提供显示音频波形的视图

    WaveFormView WaveFormView提供了一个显示音频波形的视图。 在运行时生成波形,您无需事先准备数据。 注意:这需要几秒钟的时间才能生成屏幕截图导入库将以下... Factory (afd.fileDescriptor, afd.startOffset, afd.le

    Git-2.21.0-64-bit.zip

    backend was mixed up, leading to an unrelated file descriptor getting closed, which has been fixed. * A "merge -c" instruction during "git rebase --rebase-merges" should give the user a chance to...

    Senfore_DragDrop_v4.1

    mail them as a single zip file. If I need a compiled version I will ask for it. If you feel you need to send me a screen shot, please send it in GIF or PNG format. If you mail a bug report to me, ...

    flingfd:一个很小的库,用于跨进程发送文件描述符

    flingfd:一个很小的库,用于跨进程发送文件描述符

    Bochs - The cross platform IA-32 (x86) emulator

    - Implemented Descriptor Table Access VMEXIT control - Implemented RDTSCP VMEXIT control - Implemented Virtualize X2APIC mode control - Implemented Virtual Process ID (VPID) - Implemented WBINVD ...

Global site tag (gtag.js) - Google Analytics