name_to_handle_at函数和open_by_handle_at函数

本文详细介绍了Linux系统调用name_to_handle_at和open_by_handle_at的功能和使用,包括它们如何分开完成openat(2)的部分功能,以及struct file_handle结构体的使用。这两个调用涉及到文件句柄的获取和打开,同时讨论了挂载ID、文件句柄的透明性、符号链接处理和错误情况,如EOVERFLOW。文章提供了调用的参数解析和应用场景,适合Linux驱动和系统开发者阅读。
摘要由CSDN通过智能技术生成
函数原型:
#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_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值