【发布时间】: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。