【问题标题】:fanotify obtaining file name, why /proc/self/fd/"data->fd"?fanotify 获取文件名,为什么是/proc/self/fd/"data->fd"?
【发布时间】:2014-04-27 08:20:03
【问题描述】:

我正在检查当前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" 中提取的?

【问题讨论】:

  • 这是一个主观问题吗?两者都是一样的;在一种情况下,操作系统会替换 PID,而在另一种情况下,程序员会替换。
  • 它们是一样的吗?我的理解是 /proc/self/fd/"fd" 将引用进程中调用 snprintf 的文件。但是data->pid指的是产生fan_event的进程,可能相同,但一般都不同。
  • @MSalters 两者都不相同。 data->pid不是当前进程的pid,而是有文件活动的进程的pid。

标签: linux filenames fanotify


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-02-25
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多