Solaris 10:替代 dirfd()
Solaris 10: Alternative to dirfd()
我曾在 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
是否定义。
我曾在 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
是否定义。