📜  文件描述符和文件指针的区别

📅  最后修改于: 2022-05-13 01:57:01.166000             🧑  作者: Mango

文件描述符和文件指针的区别

文件描述符只是文件描述符表的索引。对于我们操作系统中的每个进程,都有一个进程控制块(PCB)。 PCB 跟踪过程的上下文。所以其中的一个字段是一个称为文件描述符表的数组。

该数组跟踪进程拥有和可以操作的所有资源。文件描述符表保存指向资源的指针。资源可能是

  • 文件
  • 终端输入/输出
  • 管道
  • 机器之间通信通道的套接字
  • 任何设备

因此,如果任何进程打开或使用任何资源,文件描述符表中都会有一个条目。任何进程在首次启动时都可以访问三个资源。这些资源是:

  • 标准输入
  • 标准输出
  • 标准错误

用一个例子来理解这一点。假设我们在终端上工作,然后输入是标准输入,输出是标准输出,错误是标准错误。如果我们打开任何其他终端,那么现在两者都是两个不同的进程。新打开的终端将有自己的标准输入、标准输出,因为它是一个不同的进程。

文件描述符只是您从open()系统调用中获得的整数。

文件描述符示例:

文件指针fopen()库函数返回的指针。它用于标识文件。它被传递给fread()fwrite()函数。

文件指针示例:

文件指针提供了高效率和高可移植性。与文件描述符不同,它是缓冲的。通常,我们在读取文件时使用文件指针。

文件描述符与文件指针

以下是文件描述符和文件指针之间的差异表

 

File Pointer

File Descriptor

1.File pointer is allocated with fopen function call
FILE *fp;
fp = fopen(“sample.txt,”a”);
File descriptor is allocated with open system call
int fd = open( filePath, mode );
2.It is generally, use for the application which is doing extensive read 
or write from a file
It is generally used for the application that do frequently random access of file 
3.It is a pointerIt is an integer value like 0, 1, 2
4.The file pointer is bufferedThe file descriptor is not buffered
5.It is highly portable and efficientIt is less portable and efficient in comparison with the file pointer
6.It is passed to fread() and fwrite() functionIt is passed to read() and write() function
7.It is not suitable for inter-process communicationIt is suitable for inter-process communication
8.Library functions generally use file pointerSystem call generally use the file descriptor