Solaris 10:dirfd()的替代方案

时间:2015-01-19 10:29:17

标签: c++ c linux solaris-10

我曾在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搜索了这个功能,但它不存在。 dirent.h版本的Linux中也提供了相同的功能。

我在某处读过Solaris 9和10中没有dirfd()

那么,Solaris 10中是否有此函数的等效解决方法?

1 个答案:

答案 0 :(得分:0)

这个晚期BSD功能在2008年被标准化,而Solaris 9在2001年发布,Solaris 10在2005年发布。这就是为什么它不适用于这些版本。

dirfd适用于当前版本Solaris 11。

对于旧版本,重新实现dirfd似乎是显而易见的,因为文件描述符已经在传递的结构中,dir->d_fddir->dd_fd取决于__XOPEN_OR_POSIX是否已定义。