我已经在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/

10-13 04:47