多次flose(fp)会怎样?

来源:互联网 发布:php上传文件 绕过 编辑:程序博客网 时间:2024/05/16 23:02

能不能多次对同一个文件描述符调用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所指向的区域已经不再有效。

0 0
原创粉丝点击