Я работал над 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
.
Я искал это fucntion в /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
или нет.
test.c:13: error: structure has no member named fd
. Это единственно возможное решение?