函数原型: #define _GNU_SOURCE /* See feature_test_macros(7) */ #include <fcntl.h> int name_to_handle_at(int dirfd, const char *pathname, struct file_handle *handle, int *mount_id, int flags); int open_by_handle_at(int mount_fd, struct file_handle *handle, int flags);
name_to_handle_at()和open_by_handle_at()系统调用将openat(2)的功能分为两部分:
name_to_handle_at(): 返回一个对应于指定文件的不透明句柄;
open_by_handle_at(): 打开与前面调用name_to_handle_at()返回的句柄对应的文件,并返回一个打开的文件描述符。
struct file_handle结构体如下:
struct file_handle {
unsigned int handle_bytes; /* Size of f_handle [in, out] */
int handle_type; /* Handle type [out] */
unsigned char f_handle[0]; /* File identifier (sized by
caller) [out] */
};
调用者有责任分配一个足够大的结构来容纳f_handle返回的句柄。
在调用之前,应该初始化handle_bytes字段以包含为f_handle分配的大小。
(常量MAX_HANDLE_SZ在<fcntl.h>中定义,指定文件句柄的最大期望大小。由于未来的文件系统可能需要更多的空间,因此不能保证这个上限。)
成功返回后,handle_bytes字段被更新为包含实际写入f_handle的字节数。
调用者可以通过handle->handle_bytes为零,来发现file_handle结构所需的大小;
在这种情况下,调用失败并出现EOVERFLOW错误,handle->handle_bytes设置为指示所需的大小;
然后调用者可以使用这些信息来分配正确大小的结构。
这里需要注意的是,EOVERFLOW还可能表明,在通常支持文件句柄查找的文件系统中,这个特定名称没有可用的文件句柄。当返回EOVERFLOW错误而没有增加handle_bytes时,可以检测到这种情况。
除了使用handle_bytes字段之外,调用者应该将file_handle结构视为不透明的数据类型:
handle_type和f_handle字段可以在随后对open_by_handle_at()的调用中使用。
调用者还可以使用不透明的file_handle来比较在不同时间和可能在不同路径上查询的文件系统对象的标识。
fanotify子系统可以用包含file_handle的信息记录报告事件,以标识文件系统对象。
flags参数是一个位掩码,通过将AT_HANDLE_FID、AT_EMPTY_PATH和AT_SYMLINK_