📅  最后修改于: 2023-12-03 15:40:04.624000             🧑  作者: Mango
文件描述符和文件指针是UNIX和Linux中不同的I/O系统的两个核心概念。本文将对两者进行介绍与比较。
文件描述符是一个非负整数,表示内核为每个进程所维护的一个文件或socket的索引。它是进程读写文件或socket的唯一标识符。当一个进程打开一个现有文件或socket时,内核会为它分配一个文件描述符,它是该文件或socket在进程中文件表中的索引值。文件描述符范围一般从0开始,最大可达到1024或更多。
在C语言中,文件描述符是用int类型表示的,通常被定义为常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,分别表示标准输入、标准输出和标准错误输出。
文件指针是C语言中的一个概念,是用来标识文件中位置的变量。文件指针在打开文件时被初始化为文件的起始位置,向后读写文件时,文件指针也会随之移动。在C语言中,文件指针是指FILE类型的指针。通过fopen()函数打开文件时,返回指向文件结构体的指针,其中包含了文件指针。
文件描述符和文件指针虽然都用于处理文件 I/O,但它们的使用方式有些不同。文件描述符是内核提供的一种机制,主要用于进程之间的通信和文件的读写。而文件指针则是C语言中提供的一种概念,主要用于文件的读写操作。他们之间的区别可以从以下几个方面来看:
文件描述符是int类型的,而文件指针是指向FILE结构体的指针类型。
文件描述符使用read、write等系统调用函数读写文件,而文件指针使用fread、fwrite等库函数读写文件,屏蔽了底层实现的细节,更加方便易用。
文件描述符不能用于文件操作,如文件打开、关闭、移动文件指针等,而文件指针主要用于文件操作。
使用文件描述符和文件指针打开同一文件并输出内容:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#define BUF_SIZE 1024
int main() {
int fd, n;
char buf[BUF_SIZE];
// 使用文件描述符读取文件
fd = open("file.txt", O_RDWR);
if (fd == -1) exit(1);
n = read(fd, buf, BUF_SIZE);
write(STDOUT_FILENO, buf, n);
close(fd);
// 使用文件指针读取文件
FILE *fp = fopen("file.txt", "r");
if (fp == NULL) exit(1);
fread(buf, BUF_SIZE, 1, fp);
fwrite(buf, BUF_SIZE, 1, stdout);
fclose(fp);
return 0;
}