Я пытаюсь использовать Inotify в C++ внутри нити но выбор блокирует, поэтому я никогда не может выйти за пределы нити, когда мое приложение выходитнеблокирующем выбрать для Inotify
как я создаю Inotify часы
fd=inotify_init1(IN_NONBLOCK);
// checking for error
if (fd < 0)
log->Print("Could not init files listener");
else
{
// use select watch list for non-blocking inotify read
FD_ZERO(&watch_set);
FD_SET(fd, &watch_set);
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
// watch directory for any activity and report it back to me
int wd=inotify_add_watch(fd,folder.c_str(),IN_ALL_EVENTS);
// add wd and directory name to Watch map
watch.insert(-1, folder, wd);
// start listening thread
run(FilesListener::threadBootstrap);
}
здесь функция вызывается в моей петле нити
void FilesListener::refresh()
{
char buffer[1024];
// select waits until inotify has 1 or more events.
// select needs the highest fd (+1) as the first parameter.
select(fd+1, &watch_set, NULL, NULL, NULL);
// Read event(s) from non-blocking inotify fd (non-blocking specified in inotify_init1 above).
int length = read(fd, buffer, EVENT_BUF_LEN);
if (length < 0)
log->Print("Could not read inotify file descriptor");
else
{
....
«Никогда не может выйти за пределы« Что это значит? 'select' * * разработан * для блокировки, пока вы не сможете прочитать или написать. Его также можно использовать, чтобы проверить, есть ли у вас что-то, что нужно читать, без блокировки, но вы не проверяете, что 'select' возвращает, так что это явно не то, что вы хотите. Вы можете просто удалить вызов на 'select' вообще. –
Что вы пытаетесь достичь с помощью выбора? –
Я удалил select и отлично работает, все еще задаюсь вопросом, зачем использовать «select», если не написать программу, которая будет убита CTRL + Z – user7082181