gpt4 book ai didi

c - 如何包含 linux_dirent64 结构使用的 s64 和 u64 类型?

转载 作者:太空宇宙 更新时间:2023-11-04 11:56:17 28 4
gpt4 key购买 nike

我正在尝试使用 getdents64 64 位 Ubuntu 上的 Linux 系统调用。我的代码,这是一个基于 getdents 的最小示例man page ,看起来像这样:

    #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尝试获取 s64u64 .我找到了一个使用 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.

所以我不得不以某种方式导入这两种类型( s64u64 ),我完全不知道。非常感谢任何建议。谢谢!

最佳答案

我猜 <types.h>是 linux 内核源代码中的 header 。

参见 this来源链接。

这是该文件的摘录:

#if defined(__GNUC__)
typedef u64 uint64_t;
typedef u64 u_int64_t;
typedef s64 int64_t;
#endif

所以,我想您可以将其添加到您的代码中以使其编译。

#include <stdint.h>
typedef u64 uint64_t;
typedef s64 int64_t;

关于c - 如何包含 linux_dirent64 结构使用的 s64 和 u64 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54241059/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com