函数原型:
#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来比较在不同时间和可能在不同路径上查询的文件系统对象的标识

本文详细介绍了Linux系统调用name_to_handle_at和open_by_handle_at的功能和使用,包括它们如何分开完成openat(2)的部分功能,以及struct file_handle结构体的使用。这两个调用涉及到文件句柄的获取和打开,同时讨论了挂载ID、文件句柄的透明性、符号链接处理和错误情况,如EOVERFLOW。文章提供了调用的参数解析和应用场景,适合Linux驱动和系统开发者阅读。
最低0.47元/天 解锁文章
5187

被折叠的 条评论
为什么被折叠?



