Вы можете использовать символические ссылки, предоставленные PROCFS для достижения функциональности большинства * на звонков. Открыть дескриптор каталога и использовать /proc/self/fd/<dir descriptor>/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] = { '\0' };
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");
}
}
Программа выше гравюр «OK» на Linux 4.4.x.
Вы пытались (ab) использовать procfs? Когда вы хотите эмулировать функциональность системных вызовов XXXat, всегда полезно попробовать «/ proc/self/fd/
Я получаю ENOTDIR, когда использую путь прохождения, например/proc/self/fd/6/foo, toototify_add_watch –
В коде есть какая-то ошибка. Либо вы закрываете дескриптор каталога слишком рано, либо не используете правильный дескриптор в первую очередь. Пожалуйста, см. Мой ответ для рабочего кода. – user1643723