为什么我必须使用close()来关闭文件?

时间:2012-06-19 06:24:40

标签: c operating-system

我正在学习一些文件功能,因此有疑问。

我很好奇为什么有必要调用close()来关闭文件?如果我在读/写文件后没有调用close(),可能会发生什么?如果我打电话给close(),我还可以使用文件描述符吗?

6 个答案:

答案 0 :(得分:9)

  • 如果文件背后有任何缓冲,并且您没有调用关闭,那么您可能会丢失数据。

  • 如果操作系统资源有限(例如打开文件数),那么不关闭文件就会浪费系统资源。

  • 文件关闭后使用描述符充其量是没有意义的,最糟糕的是大量错误(有点像在释放后使用内存)

答案 1 :(得分:3)

close()函数关闭程序和句柄标识的打开文件之间的连接。任何未写入的系统缓冲区都会刷新到磁盘,文件使用的系统资源将被释放

粗体部分是文件关闭的主要原因

关闭文件会产生以下后果:

1)取消分配文件描述符。
2)文件上进程拥有的任何记录锁都被解锁。
3)当关闭与管道或FIFO相关联的所有文件描述符时,将丢弃任何未读数据。

答案 2 :(得分:2)

如果您没有关闭为阅读而打开的文件,则可以阻止其进行并发写入。 如果你没有关闭为写入而打开的文件 - 你可以丢失操作系统在缓冲区中保存的最后写入的数据。

永远不要使用已经关闭的文件的描述符。这毫无意义。

答案 3 :(得分:0)

使用write()系统调用写入文件时,它不会立即写入文件。因此,在执行操作之后,必须调用close(),以便将缓冲区刷新到文件并继续更改。 调用close()后,您无法使用文件描述符。

答案 4 :(得分:0)

关闭文件: 完成文件后,必须使用函数fclose()关闭它。

fclose(ifp);
fclose(ofp);

关闭文件非常重要,尤其是对于输出文件。原因是输出经常被缓冲。这意味着当你告诉C写出一些东西时,例如,

fprintf(ofp, "Whatever!\n");

它不必立即写入磁盘,但最终可能会在内存中的缓冲区中结束。此输出缓冲区将暂时保留文本:

示例输出缓冲区:

----------------------------------------------
| a | b  | c | W | h | a | t | e | v | e | r |
----------------------------------------------
| ! | \n |   |   |   |   |   |   |   |   |   |
----------------------------------------------
|   |    |   |   |   |   |   |   |   |   |   |
----------------------------------------------
|   |    |   |   |   |   |   |   |   |   |   |
----------------------------------------------
...

(尽管有这样的图,缓冲区实际上只是一维的。)

当缓冲区填满时(或文件关闭时),数据最终写入磁盘。

参考http://www.cs.bu.edu/teaching/c/file-io/intro/

答案 5 :(得分:0)

  • 当您写入文件时,首先将其写入缓冲区,其中一些 函数调用flush并将数据写入文件,但是 其他人只是写入缓冲区。当缓冲区已满时,它会刷新 在没有任何直接调用刷新的文件上。你也可以 如果你想确定,请随时刷新。
  • 关闭后,您无法再使用文件描述符。