我知道我应该关闭打开的文件。我知道如果我不这样做,文件描述符就会泄漏。我也知道文件描述符只是一个整数。使用该整数os关联一些资源。这是问题所在。那些资源是什么?是什么让创建无限(很多)文件描述符变得困难?为什么不能检测到这些泄漏?为什么os不为相同的文件打开提供相同的文件描述符?
答案 0 :(得分:2)
这些资源是什么?
codeforester发布的link包含一些关于。
的资料无论如何,这些文件描述符只是内核为程序保存的复杂数据的句柄。它们可能是不透明的指针,但使用简单的数字有其优点(stdin,stdout,stderr有一个众所周知的数字,例如)。什么类型和数量的数据是内核的东西,程序不应该,也不需要知道。所以,你和我。但是,就是说,例如需要一些缓冲区。然后,内核必须随时知道打开了哪些文件,否则,例如,你可以用打开的文件卸载文件系统并让程序悬空。
创建无限(很多)文件描述符的难度是什么?
因为文件描述符花费ram(和CPU也是),这是一个有限的资源,并且没有人想要内核崩溃,因为一些(愚蠢的)程序员浪费文件描述符...... :-)。因此,内核为文件描述符(并非总是简单文件)保留了有限的资源。内核并非完全相同,每个内核都可以有自己的策略,并且通常可以通过某种方式让用户管理相关设置。
为什么os不能检测到那些泄漏?
因为它不能。内核无法区分泄漏资源的糟糕编写程序与合法分配许多资源的程序之间的区别。而且,尝试区分好程序和坏程序并不是内核的责任。内核必须快速有效地提供服务 - 其余的都是程序员的责任。
为什么os不为同一个文件打开提供相同的文件描述符?
因为两次或更多次打开同一文件是合法的。两个程序可以打开同一个文件,两个线程可以打开,甚至可以打开一个线程。并且内核必须始终尊重其API声明的“契约”,总是以同样的方式:再次,程序员必须知道他在做什么。