多次flose(fp)会怎样?

能不能多次对同一个文件描述符调用fclose?答案是不行的。为啥不行,我们需要看看fclose到底干了什么

fclose关闭的是一个文件流,当调用fclose时,将会使用户态(C库)缓冲区中的数据刷新到内核区域(或通过socket发送,或者仅仅写回硬盘)。
于此同时,fclose会调用free来释放fp所指向的用户态buffer。

因此,如果多次调用fclose,会多次调用free来释放一块已经被释放的区域,而这个动作是危险的。
很多解释是说,因为一旦被释放之后,这块区域就属于未知区域。有可能系统已经把该区域分给了其他进程,所以不能多次fclose。

但是我看过Linux关于close的内核源码,发现并不是这样,当第一次调用close时,将会把对应的文件描述符数组flip[fp] = NULL。如果再调用close时,会在前面判断该项是否为null,如果为null,return -EINVAL;因此,多次调用fclose时会报错,但不会影响系统其他进程。

下一个问题:调用fclose之后,FILE *fp会变成NULL吗?不会,没有什么机制把fp置空的动作,只是这个时候fp所指向的区域已经不再有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值