文件描述符fd与FILE

文件描述符

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实际写入数据个数

fd

注意open的参数

O_WRONLY|O_CREAT以只读的方式打开,若没有该文件则新建一个,为什么有|参考flgs参数解释说明 
0664:即mode,给新创建文件设置权限在第二幅图中可以发现mylog的权限是(-rw-r–r-)

fdinfo

可以看到fd = 3,mylog的权限是644

为什么fd会是三呢 
我们再打开两个文件看看 
fd123
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

file_struct

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值