Linux文件描述符选择策略的讨论

本文发布时间: 2019-Mar-22
作者:[email protected]博客:blog.focus-linux.net linuxfocus.blog.chinaunix.net微博:weibo.com/glinuxerQQ技术群:4367710以前学习TCP/IP源码的时候,曾经分析过VFS与socket的关联。分析了函数alloc_fd。这里不在对alloc_fd进行分析了,只说一下结论:从alloc_fd的实现上看,一般情况下,Linux每次都从上一次分配的fd(利用文件表中的一个变量next_fd记录),来开始查找未用的文件描述符。这样保证新分配的文件描述符都是持续增长的,直到上限,然后回绕。今天我看了close的内核实现,它调用__put_unused_fd用于释放文件描述符。static void __put_unused_fd(struct files_struct *files, unsigned int fd){ struct fdtable *fdt = files_fdtable(files); __FD_CLR(fd, fdt->open_fds); if (fd < files->next_fd) files->next_fd = fd;} 从上面的代码中,可以发现,当释放的fd比文件表中的nextfd小的话,nextfd就会更新为当前fd。结合alloc_fd的代码,进一步得到Linux文件描述符的选择策略。当持有的文件描述符关闭时,Linux会尽快的重用该文件描述符,而不是使用递增的文件描述符值尽管posix标准没有说明文件描述符应该如何选择,但是我并不喜欢当前Linux的策略。当一个正在使用的fd,被另外一个线程关闭时(也许是bug,也许是意外),然后又创建了一个文件描述符。那么就正好与之前的描述符的值一样。但是使用之前fd的线程,却无法察觉到这个变化。结果,如果是普通文件,那么就可能读错或者写错文件,如果是socket,那么就与错误的对端进行通信了。当然,这样的错误可以说是应用层的错误。可是作为内核,应该提供好的容错性。对于fd,如果不迅速重用刚刚关闭的描述符,那么应用层在使用已关闭文件描述符时,可以立刻返回错误。从而避免更严重的,并且不易察觉,调试的错误。搞不明白,Linux当前的文件描述符选择策略有什么好处?从2.6内核到我目前看到的3.2内核,都是这样的策略。


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:10pm
栏目列表