`

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
分享到:
评论

相关推荐

    Java FileDescriptor总结_动力节点Java学院整理

    FileDescriptor(int fd) 的操作:就是给 fd 对象(int 类型)赋值,并新建一个使用计数变量 useCount。fd 对象是非常重要的一个变量,“fd=1”就代表了“标准输出”,“fd=0”就代表了“标准输入”,“fd=2”就代表...

    libvlc播放本地文件、实时流、录制、停止录制

    LibVLC是一个强大的开源多媒体库,由VideoLAN项目开发,用于播放各种格式的音频和视频。这个库提供了跨平台的功能,使得开发者可以轻松地在不同的操作系统上实现多媒体播放功能。在"libvlc播放本地文件、实时流、...

    Android平台的txt文本文件读写操作

    - `FileWriter(FileDescriptor fd)`:通过`FileDescriptor`对象创建文件。 - `FileWriter(String filename)`:指定文件完整路径和名称来创建文件。 - `FileWriter(String filename, boolean append)`:与第二个构造...

    2009 达内Unix学习笔记

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

    mediaplayer常用函数.txt

    FileDescriptor fd = fis.getFD(); mediaPlayer.setDataSource(fd, 0, 1024 * 1024); // 读取前1MB fis.close(); ``` #### 18. setDataSource(FileDescriptor fd) 通过FileDescriptor设置数据源。 **示例代码:**...

    Android移动应用开发基础教程第6章.pptx

    int load(FileDescriptor fd, long offset, long length, int priority) ``` 其中,context 为当前应用上下文。resId 事先存放到应用的 res/raw 文件中的音频文件的资源 ID 。priority 为优先级,目前无效,用 1 ...

    Android Zygote启动流程源码解析

    FileDescriptor fd = new FileDescriptor(); fd.setInt$(fileDesc); // 使用fd创建socket,而不是通常的IP和端口方式 sServerSocket = new LocalServerSocket(fd); } } ``` 这里通过传入的Socket名称构建了...

    注入的核心代码

    FileDescriptor fd = readFromParent.getFileDescriptor(); BufferedReader reader = new BufferedReader(new FileReader(fd)); // 读取注入的DSO路径 String dsoPath = reader.readLine(); // 使用System.load()...

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

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

    Android如何远程下载安装的应用源码.zip

    FileDescriptor fd = sessionFd.getFileDescriptor(); FileOutputStream sessionStream = new FileOutputStream(fd); sessionStream.write(...); // 写入apk文件内容 sessionStream.close(); sessionFd.close(); ```...

    HarmonyOS应用开发实战-JS访问本地图片.docx

    FileDescriptor fd = helper.openFile(uri, "r"); ImageSource imageSource = ImageSource.create(fd, null); ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions(); // 设置图片...

    Android程序设计-MediaPlayer介绍.pptx

    FileDescriptor fd = context.openFileDescriptor(filePath, "r"); mediaPlayer.setDataSource(fd, fd.getFileDescriptor().getStatSize()); ``` 03. **准备MediaPlayer**: 准备MediaPlayer以便播放。这可以是同步...

    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,...

    疯狂android资料:第十一章多媒体应用开发.doc

    - **原生资源**:对于存储在assets目录下的文件,需要先通过`AssetManager`获取`AssetFileDescriptor`,然后调用`setDataSource(FileDescriptor fd, long offset, long length)`来设置数据源。 7. **播放流程总结*...

    Camera与MediaRecorder

    接着,通过`setOutputFormat(int format)`、`setOutputFile(String path)`或`setOutputFile(FileDescriptor fd)`设定输出格式和路径。 2. **摄像头设置**:若要录制视频,需使用`MediaRecorder.setCamera(Camera ...

    关于python的小练习(二)

    - **`fileno()`**:返回一个整型的文件描述符(file descriptor FD 整型),可以用在如os模块的read方法等一些底层操作。 - **`isatty()`**:如果文件链接到一个终端设备返回True,否则返回False。 - **`next()`**:...

    android界面设计专题

    - **从文件描述符解码位图**:`Bitmap decodeFileDescriptor(FileDescriptor fd)` 可以从文件描述符中解码位图。 #### 结语 通过以上介绍可以看出,Android界面设计不仅仅涉及到视觉效果的设计,还包括对底层图形...

    CommunicationAPI中文说明.doc

    - `open(FileDescriptor fd)`:通过文件描述符打开端口。 - `open(String appName, int timeout)`:打开端口,参数包括应用程序名称及超时时间。 #### 四、SerialPort类详解 - **定义**:`SerialPort`类是处理...

    Linux中文件描述符fd与文件指针FILE*互相转换实例解析

    在Linux操作系统中,文件描述符(File Descriptor, fd)和文件指针(FILE *)是两种不同的方式,用于访问和操作文件。它们各自有其特点和应用场景,有时需要在两者之间进行转换。以下是对这两个概念的详细解释以及...

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

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

Global site tag (gtag.js) - Google Analytics