Я работал над 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.
Я где-то читал, что dirfd()
недоступно в Солярисе 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
определяется или нет.