8

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

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

4

6 回答 6

9
  • 如果文件后面有任何类型的缓冲,并且您没有调用 close,那么您可能会丢失数据。

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

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

于 2012-06-19T06:27:51.420 回答
3

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

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

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

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

于 2012-06-19T06:31:37.493 回答
2

如果您不关闭为读取而打开的文件,则可能会阻止并发写入。如果您不关闭为写入而打开的文件 - 您可能会丢失 OS 在缓冲区中保存的最后写入数据。

并且永远不要使用已关闭文件的描述符。这没有任何意义。

于 2012-06-19T06:26:46.613 回答
0

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

于 2012-06-19T06:27:51.770 回答
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/

于 2012-06-19T06:29:26.840 回答
0
  • 当您写入文件时,您首先写入缓冲区,一些函数调用刷新并将数据写入文件,但其他人只是写入缓冲区。当缓冲区已满时,它会刷新到文件,而不需要直接调用刷新。如果你想确定的话,你也可以随时冲洗。
  • 关闭文件描述符后,您将无法再使用它。
于 2012-06-19T07:32:37.453 回答