我很惊讶地发现手册页中包含readdir
的两个冲突变体的条目。
在READDIR(2)中,它特别声明您不想使用它:
这不是您感兴趣的功能。查看符合POSIX的C库接口的readdir(3)。本页记录了裸内核系统调用接口,该接口已由getdents(2)取代。
我知道一个函数可能会在另一个函数出现时变得不推荐使用,并且会更好地完成其工作,但是我不熟悉其他用户空间函数进入并替换同名内核函数的情况。是否有一个已知的理由选择它而不是使用新的函数名(如手册页中提到的getdents
在取代readdir
时所做的那样)而不是使用新的函数名。
答案 0 :(得分:2)
编程接口POSIX稳定。您不仅可以不必要地替换其中的功能,因为您想更高效地实现后端。 Linux系统调用readdir
从未实现readdir
函数,因为它具有错误的签名。它是用于实现readdir
函数的旧的,效率低下的后端。当有更好的后端出现时,它已经过时了。
答案 1 :(得分:2)
您完全倒退了:库函数readdir(3)
早于Linux及其readdir(2)
系统调用,而不是相反。
以这种方式命名系统调用肯定是一个错误的决定,并且可能背后有故事,但是由于没有人在使用它,所以它现在已经无关紧要了。
在Unix上,目录以前是以特殊方式格式化的简单文件,并且通过其读取文件的系统调用接口仅为read(2)
[1]。后来的系统引入了诸如getdirentries
(44BSD)和getdents
(SVR3)之类的系统调用,但是它们不愿意或无法在接口上进行标准化,因此我们仍然陷于高水平和崩溃的境地[2] readdir(3)
库功能是读取目录的唯一标准接口。
[1]在BSD之类的某些系统上,至少在使用默认文件系统(FFS)时,您仍然可以cat
目录。
[2]已损坏,因为它不安全,并且针对错误和NULL
均返回EOF
,这意味着可以安全使用的唯一方法是首先设置{{1 }}设为0,然后同时检查其返回值和errno
。好吧。