我已经在RHEL 6.5上工作,并开发了一些将dirfd()
用作readdir_r()
的代码,如下所示:
#include <dirent.h>
#include <sys/types.h>
void some_function(){
DIR *dir = NULL;
struct dirent *pentry = NULL, *next_file = NULL;
if ((dir = opendir("/ZB_RQ/")) != NULL) {
len_pentry = offsetof(struct dirent, d_name) + fpathconf(dirfd(dir), _PC_NAME_MAX) + 1;
pentry = malloc(len_pentry);
if(!pentry){
exit(0);
}
for(;;){
readdir_r(dir, pentry, &next_file);
if(!next_file){
//No file to iterate.
break;
}
else{
// do something
}
}
}
}
这段代码在RHEL 6.5(Linux)中可以正常工作,但是当我在
Oracle Solaris 10
中运行它时,它会失败,并显示Undefined symbol dirfd
错误。我已经在
/usr/include/dirent.h
中搜索了此功能,但它不存在。 Linux的dirent.h
版本中也有此功能。我在某处读到
dirfd()
在Solaris 9和10中不可用。因此,在Solaris 10中是否存在此功能的等效解决方法?
最佳答案
最新的BSD功能在2008年进行了标准化,而Solaris 9于2001年发布,Solaris 10于2005年发布。这就是为什么这些版本无法使用它的原因。dirfd
在当前版本Solaris 11中可用。
对于较旧的文件,鉴于文件描述符已经存在于传递的结构中,因此重新实现dirfd
似乎很明显,此处取决于是否定义了dir->d_fd
,此处为dir->dd_fd
或__XOPEN_OR_POSIX
。
关于c++ - Solaris 10:替代dirfd(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28022507/