inotify_add_watch 相对于 O_PATH dirfd
inotify_add_watch relative to O_PATH dirfd
我正在尝试呼叫 inotify_add_watch to watch a file. I would like to specify the file relative to an O_PATH | O_DIRECTORY file descriptor, a la symlinkat, fstatat, or openat。
这可能吗?它看起来不像是。有人知道解决方法吗?
编辑
最接近的似乎是 "Rationale for openat" 下 man 2 open 中描述的 "trick"。示例见 user1643723 的回答。
您可以使用 procfs 提供的符号链接来实现大多数 *at 调用的功能。打开目录描述符并使用 /proc/self/fd/<dir descriptor>/filename
而不是 filename:
的完整路径
#define _GNU_SOURCE
#include <sys/stat.h>
#include <sys/inotify.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
int main() {
int inotify = inotify_init();
mkdir("tmp", 0777);
mknod("tmp/foo", 0777 | S_IFREG, 0);
int dirFd = open("tmp", O_DIRECTORY | O_PATH);
char buf[40] = { '[=10=]' };
sprintf(buf, "/proc/self/fd/%d/foo", dirFd);
int watchd = inotify_add_watch(inotify, buf, IN_MOVE | IN_ATTRIB);
if (watchd < 0) {
printf("Failed: %s", strerror(errno));
} else {
printf("ok");
}
}
上面的程序在 Linux 4.4.x.
上打印 "ok"
我正在尝试呼叫 inotify_add_watch to watch a file. I would like to specify the file relative to an O_PATH | O_DIRECTORY file descriptor, a la symlinkat, fstatat, or openat。
这可能吗?它看起来不像是。有人知道解决方法吗?
编辑
最接近的似乎是 "Rationale for openat" 下 man 2 open 中描述的 "trick"。示例见 user1643723 的回答。
您可以使用 procfs 提供的符号链接来实现大多数 *at 调用的功能。打开目录描述符并使用 /proc/self/fd/<dir descriptor>/filename
而不是 filename:
#define _GNU_SOURCE
#include <sys/stat.h>
#include <sys/inotify.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
int main() {
int inotify = inotify_init();
mkdir("tmp", 0777);
mknod("tmp/foo", 0777 | S_IFREG, 0);
int dirFd = open("tmp", O_DIRECTORY | O_PATH);
char buf[40] = { '[=10=]' };
sprintf(buf, "/proc/self/fd/%d/foo", dirFd);
int watchd = inotify_add_watch(inotify, buf, IN_MOVE | IN_ATTRIB);
if (watchd < 0) {
printf("Failed: %s", strerror(errno));
} else {
printf("ok");
}
}
上面的程序在 Linux 4.4.x.
上打印 "ok"