文件描述符
c语言常用文件操作函数
FILE *fopen( const char *filename, const char *mode );
int fclose( FILE *stream );
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
fopen成功打开一个文件后返回一个
FILE*的文件指针
,以后读文件关文件都需要这个文件指针。这个文件指针代表这个文件。
Linux中常用文件操作函数
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
ssize_t write(int fd, const void *buf, size_t count);
int close(int fd);
open成功打开一个文件后返回一个
数字
,这个数字即使文件的文件描述符(fd)
以后读文件,给文件些数据,关闭这个文件都需要一个文件描述符,文件描述符是这个文件的唯一标识符
。open
参数
:
pathname
:带路径的一个文件名
flags
:以只读(O_RDONLY)
或只写(O_WDONLY)
或读(O_RDWR)
方式打开,表示当前文件文件状态(O_CREAT
若当前文件不存在则创建当前文件)
一个整数可以传32个标志位,每个标志位只占一个bite位,想要将几个标志位一同传入可按位或
mode
:指的是八进制的权限,例0644(-rw-r–r-)所以说
FILE*
和fd
在功能上是相同的,都用来表示一个文件
write
参数fd:文件描述符
buf:写入的数据
count:数据个数
返回值:ssize_t实际写入数据个数
注意open的参数
O_WRONLY|O_CREAT
以只读的方式打开,若没有该文件则新建一个,为什么有|
参考flgs
参数解释说明
0664
:即mode,给新创建文件设置权限
在第二幅图中可以发现mylog的权限是(-rw-r–r-)
可以看到
fd = 3
,mylog
的权限是644
为什么fd会是三呢
我们再打开两个文件看看
fd分配从三开始
因为
当一个进程运行起来以后,系统会默认打开三个标准文件,分别是一个键盘文件和两个显示器文件,对应的文件描述符分别是0(stdin)
,1(stdout)
,2(stderr)
文件类型分别是键盘,显示器,显示器。
所以一个进程分配fd从三开始
fd分配规则
数组下表的形式从0开始依次分配
进程和文件本质关联
操作系统管理进程,首先将一个进程描述起来(task_struct)找到这个结构体就找到该进程
操作系统管理文件,首先将一个文件描述起来(file_struct)这个file_struct就在task_struct里
file_struct
file_struct
里有很多东西,例如文件的大小、文件创建的时间、文件权限etc,而里面的文件描述副就是file_struct结构体里的一个个数组的下表,一个进程运行起来系统默认打开三个标准文件,如何默认打开,只需要将文件的地址写到对应下标位置的数组中,所以0,1,2分别是键盘文件和两个tty