Я пишу программу для мониторинга, когда файлы записываются в файловую систему Mac OSX с использованием C ++. Я вызываю fsevents напрямую, чтобы получить PID процесса, который записал файл в файловую систему.
Когда я запускаю программу под своим именем пользователя, я получаю сообщение об ошибке «kevent register: Bad file descriptor», относящееся к строке 43 моей программы. Если я запускаю его как sudo, программа запускается без ошибок, но никогда не получает уведомления о записанных файлах. Я проверяю это, выпуская: echo "blah" >> /tmp/1234
,
Код:
#include "fcntl.h" //for O_RDONLY
#include "errno.h" //for errno
#include "stdio.h" //for fprintf()
#include "string.h" //for strerror()
#include "stdlib.h" //for EXIT_SUCCESS
#include "sys/event.h" //for kqueue() & more
#include "unistd.h" //for close()
#include <err.h>
#include <sys/ioctl.h> //for iotcl control working with fsevents
int main(int argc, char *argv[])
{
printf("Exectuted");
struct kevent kev_set; /* Event we want to monitor */
struct kevent kev_retr; /* Event triggered */
int kq, fd, ret;
// directory to monitor, NO checks for errors here
fd = open ("/dev/fsevents", O_RDONLY);
//if (ioctl(fd, TIOCMGET, &status) >= 0)
// err(EXIT_FAILURE, "TIOCMGET failed:");
kq = kqueue();
if (kq == -1)
err(EXIT_FAILURE, "kqueue() failed");
/* Initialize kevent structure. */
EV_SET(&kev_set, fd, EVFILT_VNODE, EV_ADD | EV_CLEAR, NOTE_WRITE, 0, NULL);
/* Attach event to the kqueue. */
ret = kevent(kq, &kev_set, 1, NULL, 0, NULL);
if (ret == -1)
err(EXIT_FAILURE, "kevent register");
for (;;) {
/* Sleep until something happens */
printf("Starting loop\n");
ret = kevent(kq, NULL, 0, &kev_retr, 1, NULL);
if (ret == -1)
{
err(EXIT_FAILURE, "kevent wait");
}
else if (ret > 0) {
printf("Something was written: ");
}
}
close(fd);
}
Выход:
$ ./fsmon-test
fsmon-test: kevent register: Bad file descriptor
Заранее спасибо!
Задача ещё не решена.
Других решений пока нет …