我正在学习一些文件功能,因此有疑问。
我很好奇为什么需要调用close()
来关闭文件?如果我在读/写文件后没有调用close()
,可能会发生什么事情?如果我确实打电话close()
,我还能使用文件描述符吗?
我正在学习一些文件功能,因此有疑问。
我很好奇为什么需要调用close()
来关闭文件?如果我在读/写文件后没有调用close()
,可能会发生什么事情?如果我确实打电话close()
,我还能使用文件描述符吗?
如果文件后面有任何类型的缓冲,并且您没有调用 close,那么您可能会丢失数据。
如果操作系统的资源有限(例如打开文件的数量),那么不关闭文件就是在浪费系统资源。
关闭文件后使用描述符充其量是毫无意义的,最坏的情况是大量错误(有点像在释放内存后使用内存)
close() 函数关闭程序与句柄标识的打开文件之间的连接。任何未写入的系统缓冲区都会刷新到磁盘,并释放文件使用的系统资源
粗体部分是关闭文件的主要原因
关闭文件会产生以下后果:
1)文件描述符被释放。
2) 文件上进程拥有的任何记录锁都被解锁。
3) 当与管道或 FIFO 关联的所有文件描述符都已关闭时,任何未读数据都将被丢弃。
如果您不关闭为读取而打开的文件,则可能会阻止并发写入。如果您不关闭为写入而打开的文件 - 您可能会丢失 OS 在缓冲区中保存的最后写入数据。
并且永远不要使用已关闭文件的描述符。这没有任何意义。
当您使用 write() 系统调用写入文件时,它不会立即写入文件。因此,在您的操作之后,您必须调用 close() 以便将缓冲区刷新到文件并保持更改。调用 close() 后,不能使用文件描述符。
关闭文件:完成文件后,必须使用函数 fclose() 将其关闭。
fclose(ifp);
fclose(ofp);
关闭文件非常重要,尤其是输出文件。原因是输出经常被缓冲。这意味着当你告诉 C 写出一些东西时,例如,
fprintf(ofp, "Whatever!\n");
它不需要立即写入磁盘,但可能最终会在内存中的缓冲区中。此输出缓冲区将临时保存文本:
样本输出缓冲区:
----------------------------------------------
| a | b | c | W | h | a | t | e | v | e | r |
----------------------------------------------
| ! | \n | | | | | | | | | |
----------------------------------------------
| | | | | | | | | | | |
----------------------------------------------
| | | | | | | | | | | |
----------------------------------------------
...
(尽管有这张图,缓冲区实际上只是一维的。)
当缓冲区填满时(或文件关闭时),数据最终写入磁盘。