如何使用 statx 系统调用?
How to use statx syscall?
Ubuntu 18.04
我正在尝试使用 Linux 内核 4.11
中引入的 statx
系统调用。有手动输入:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h> /* Definition of AT_* constants */
int statx(int dirfd, const char *pathname, int flags,
unsigned int mask, struct statx *statxbuf);
所以我试着自己写了一个例子:
const char *dir_path = NULL;
const char *file_path = NULL;
//read from command line arguments
int dir_fd = open(dir_path, O_DIRECTORY);
struct statx st; //<--------------------------- compile error
statx(dir_fd, file_path, 0, &statx);
但它根本无法编译。错误是 sizeof(statx)
未知。实际上它没有在 sys/stat.h
中定义,而是在 linux/stat.h
中定义,而 sys/stat.h
中没有包含它。但是在包含 linux/stat.h
之后,问题是
没有定义
int statx(int dirfd, const char *pathname, int flags,
unsigned int mask, struct statx *statxbuf);
我预计自从
$ uname -r
4.15.0-39-generic
和比 4.11 更新的 4.15.0-39-generic 我可以使用它。
怎么了?
目前,由于 glibc 不为 statx
调用提供包装器,您必须使用内核定义。因此,要么从内核中复制 statx
结构定义,要么只使用 linux 内核提供的 API 结构定义。 struct statx
当前在 linux/stat.h
中定义。
linux 提供了对 statx
可用的示例调用 here。
@update 库支持已添加到 glibc 2.28
Ubuntu 18.04
我正在尝试使用 Linux 内核 4.11
中引入的 statx
系统调用。有手动输入:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h> /* Definition of AT_* constants */
int statx(int dirfd, const char *pathname, int flags,
unsigned int mask, struct statx *statxbuf);
所以我试着自己写了一个例子:
const char *dir_path = NULL;
const char *file_path = NULL;
//read from command line arguments
int dir_fd = open(dir_path, O_DIRECTORY);
struct statx st; //<--------------------------- compile error
statx(dir_fd, file_path, 0, &statx);
但它根本无法编译。错误是 sizeof(statx)
未知。实际上它没有在 sys/stat.h
中定义,而是在 linux/stat.h
中定义,而 sys/stat.h
中没有包含它。但是在包含 linux/stat.h
之后,问题是
int statx(int dirfd, const char *pathname, int flags,
unsigned int mask, struct statx *statxbuf);
我预计自从
$ uname -r
4.15.0-39-generic
和比 4.11 更新的 4.15.0-39-generic 我可以使用它。
怎么了?
目前,由于 glibc 不为 statx
调用提供包装器,您必须使用内核定义。因此,要么从内核中复制 statx
结构定义,要么只使用 linux 内核提供的 API 结构定义。 struct statx
当前在 linux/stat.h
中定义。
linux 提供了对 statx
可用的示例调用 here。
@update 库支持已添加到 glibc 2.28