Я пытаюсь использовать системный вызов getdents64
Linux на 64-битной Ubuntu.Мой код, который является минимальным примером, основанным на справочной странице getdents
, выглядит следующим образом:
#define _GNU_SOURCE
#include <dirent.h> /* Defines DT_* constants */
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/types.h>
#define handle_error(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)
struct linux_dirent64 {
u64 d_ino;
s64 d_off;
unsigned short d_reclen;
unsigned char d_type;
char d_name[0];
};
#define BUF_SIZE 1024
int
main(int argc, char *argv[])
{
int fd, nread;
char buf[BUF_SIZE];
struct linux_dirent64 *d;
int bpos;
char d_type;
fd = open(argc > 1 ? argv[1] : ".", O_RDONLY | O_DIRECTORY);
if (fd == -1)
handle_error("open");
for ( ; ; ) {
nread = syscall(SYS_getdents64, fd, buf, BUF_SIZE);
if (nread == -1)
handle_error("getdents64");
if (nread == 0)
break;
printf("--------------- nread=%d ---------------\n", nread);
printf("inode# file type d_reclen d_off d_name\n");
for (bpos = 0; bpos < nread;) {
d = (struct linux_dirent64 *) (buf + bpos);
printf("%8d ", d->d_ino);
d_type = *(buf + bpos + d->d_reclen - 1);
printf("%-10s ", (d_type == DT_REG) ? "regular" :
(d_type == DT_DIR) ? "directory" :
(d_type == DT_FIFO) ? "FIFO" :
(d_type == DT_SOCK) ? "socket" :
(d_type == DT_LNK) ? "symlink" :
(d_type == DT_BLK) ? "block dev" :
(d_type == DT_CHR) ? "char dev" : "???");
printf("%4d %10lld %s\n", d->d_reclen,
(long long) d->d_off, d->d_name);
bpos += d->d_reclen;
}
}
exit(EXIT_SUCCESS);
}
Действительно важная часть (где мой код ломается) такова:
struct linux_dirent64 {
u64 d_ino; // this is this problem
s64 d_off; // this too
unsigned short d_reclen;
unsigned char d_type;
char d_name[0];
};
Когда я компилирую свою программу, я получаю следующую ошибку:
hc-24@HP24:~$ gcc v.c
v.c:14:5: error: unknown type name ‘u64’
u64 d_ino;
^
v.c:15:5: error: unknown type name ‘s64’
s64 d_off;
^
Мне кажется, проблема в том, что я включаю sys/types.h
, чтобы попытаться получить s64
и u64
.Я нашел пример кого-то, кто использует linux_dirent64
онлайн, а они просто #include <types.h>
.Когда я пытаюсь это сделать, я получаю сообщение об ошибке:
hc-24@HP24:~$ gcc v.c
love.c:8:19: fatal error: types.h: No such file or directory
compilation terminated.
Так что мне как-то приходится импортировать эти два типа (s64
и u64
), и я абсолютно не понимаю.Любые предложения очень ценятся.Спасибо!