c - 如何在 FreeBSD 系统调用 openat 中获取绝对路径?
问题描述
我正在编写一个简单的程序来挂钩 freebsd 系统调用。
像这样
static int
openat_hook(struct thread *td, register struct openat_args *uap)
{
uprintf(" SYS_openat: \"%s\", flags: %d, mode: %X\n", uap->path, uap->flags, uap->mode);
return sys_openat(td, uap);
}
这不会打印绝对路径。
当我在用户空间时,我可以通过 realpath 获得绝对路径。
但是,我不知道如何在内核中获得绝对路径。
解决方案
您无法(可靠地)获得路径。openat() 打开相对于目录的给定文件描述符的相对文件名。因此,您必须首先找出打开文件描述符的绝对路径。描述符的目录可能不再存在,可能在程序文件系统名称空间之外(chroot、pivot_root、switch_root、容器......导致)或者可能挂载了一些东西。
在 Linux 下 /proc/self/fd/ 是一个符号链接,显示 FD 的绝对路径。所以内核有点知道 FD 的绝对路径。BSD 可能有类似的东西供您用来获取 FD 的路径。但即便如此,由于上述原因,该路径也可能无效。
推荐阅读
- java - 在 Netbeans 8.2 RC 中为我的 Web 项目运行 JUnit 测试时出错说:需要在环境或系统属性中指定类名
- python-module - 运行python模块的Wifi互联网问题
- r - 将掩码变量(在“...”中)传递给 group_by() 时有条件地覆盖默认参数
- javascript - 如何使用 docker compose 更改 docker 容器内的文件夹权限?
- amazon-emr - 如何在 EKS 上为 EMR 进行日志记录(即 emr 容器)
- kotlin - 当有可为空的变量时,我在方法的未解决引用上遇到了一些错误?
- java - 使用扫描仪读取 CSV 文件
- android - 使用 Kotlin 将值从 Activity 传递到 Fragment
- r - 在 lapply 函数中使用 nls 时出现错误消息
- javascript - select2 搜索从 ajax 检索,同时保留默认选项