首页 > 解决方案 > 如何在 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 获得绝对路径。
但是,我不知道如何在内核中获得绝对路径。

标签: ckernelfreebsd

解决方案


您无法(可靠地)获得路径。openat() 打开相对于目录的给定文件描述符的相对文件名。因此,您必须首先找出打开文件描述符的绝对路径。描述符的目录可能不再存在,可能在程序文件系统名称空间之外(chroot、pivot_root、switch_root、容器......导致)或者可能挂载了一些东西。

在 Linux 下 /proc/self/fd/ 是一个符号链接,显示 FD 的绝对路径。所以内核有点知道 FD 的绝对路径。BSD 可能有类似的东西供您用来获取 FD 的路径。但即便如此,由于上述原因,该路径也可能无效。


推荐阅读