我知道可以使用realpath()函数获取文件的绝对路径。然而,根据man页面中的BUGS部分,实现中存在一些问题。具体如下:
BUGS
避免使用此函数。由于(除非使用非标准的resolved_path == NULL特性),无法确定适合输出缓冲区resolved_path的大小,因此它的设计有缺陷。根据POSIX,大小为PATH_MAX的缓冲区就足够了,但是PATH_MAX不一定是定义常量,并且可能需要使用pathconf(3)来获取。询问pathconf(3)并不能帮助解决问题,因为一方面,POSIX警告pathconf(3)的结果可能很大且不适合malloc内存;另一方面,pathconf(3)可能返回-1,表示PATH_MAX没有界限。 libc4和libc5实现存在缓冲区溢出(已修复在libc-5.4.13)。因此,像mount(8)这样的set-user-ID程序需要一个私有版本。
那么,问题是获取文件的绝对路径最佳实践是什么?
BUGS
避免使用此函数。由于(除非使用非标准的resolved_path == NULL特性),无法确定适合输出缓冲区resolved_path的大小,因此它的设计有缺陷。根据POSIX,大小为PATH_MAX的缓冲区就足够了,但是PATH_MAX不一定是定义常量,并且可能需要使用pathconf(3)来获取。询问pathconf(3)并不能帮助解决问题,因为一方面,POSIX警告pathconf(3)的结果可能很大且不适合malloc内存;另一方面,pathconf(3)可能返回-1,表示PATH_MAX没有界限。 libc4和libc5实现存在缓冲区溢出(已修复在libc-5.4.13)。因此,像mount(8)这样的set-user-ID程序需要一个私有版本。
那么,问题是获取文件的绝对路径最佳实践是什么?