Linux fanotify获取文件名,为什么/proc/self/fd/";数据->;fd";?

Linux fanotify获取文件名,为什么/proc/self/fd/";数据->;fd";?,linux,filenames,fanotify,Linux,Filenames,Fanotify,我正在检查当前fatrace的源代码 调用fanotify以获取数据值的主循环如下所示: res = read (fan_fd, buffer, 4096); ... data = (struct fanotify_event_metadata *) buffer; while (FAN_EVENT_OK (data, res)) { ... data = FAN_EVENT_NEXT (data, res); } 提取与

我正在检查当前fatrace的源代码

调用fanotify以获取数据值的主循环如下所示:

    res = read (fan_fd, buffer, 4096);
    ...
    data = (struct fanotify_event_metadata *) buffer;
    while (FAN_EVENT_OK (data, res)) {
        ...
        data = FAN_EVENT_NEXT (data, res);
    }
提取与事件关联的文件名时,代码如下所示:

   snprintf (printbuf, sizeof (printbuf), "/proc/self/fd/%i", data->fd);
   len = readlink (printbuf, pathname, sizeof (pathname));

我不明白为什么文件名是从
/proc/self/fd/“data->fd”
中提取的,而不是
/proc/“data->pid”/fd/“data->fd”

这是因为
data->pid
是一个不同的进程,具有不同的文件描述符集。fanotify返回的
数据->fd
在当前流程中有效,而不是被监控的流程。

这是一个主观问题吗?两者是相同的;在一种情况下,操作系统代替PID,而在另一种情况下,程序员代替PID。它们是一样的吗?我的理解是,/proc/self/fd/“fd”将引用进程中调用snprintf的文件。但是data->pid指的是生成fan_事件的进程,它可能相同,但通常不相同。@MSalters两者不相同<代码>数据->pid不是当前进程的pid,而是具有文件活动的进程的pid。