2009-08-15 3 views
0

я использую Inotify с «ПРЕРЫВАЙТЕ ю», установив флаг O_ASYNC на Inotify дескриптора файла, а затем с помощью Fcntl (inotifyfd, F_SETOWN, GETPID()) в сочетании с сигналом (sighandler, SIGIO), все из одного процесса, , чтобы настроить обработчик события дескриптора файла inotify.Inotify «основного цикла»

Идея заключается в том, чтобы иметь дескриптор файла Inotify генерируют сигнал SIGIO (через установленный флаг O_ASYNC) и имеют дэ сигнал (..), зарегистрированный обработчик обращаться с SIGIO сигналы , поскольку они испускаются таким образом избегая опроса Inotify дескриптор файла.

После установки начальной настройки и обработки сигнала процесс не имеет ничего общего с и обычно выходит.

Мне нужен тот же процесс, чтобы оставаться без дела после установки, поскольку он действует как демон, ожидающий сигналов SIGIO. Здесь я ищу помощь.

Как я могу проиграть процесс, чтобы получить наименьшее количество ресурсов процессора?

+0

Я подозреваю, что это * NIX? Можете указать, что в тегах. – Skurmedel

ответ

2

Один простой способ - просто sleep(3) в течение очень большого количества времени. Поскольку сигналы пробуждают процесс, вы должны положить спать в цикле:

while(1) 
    sleep(1000); 

Более правильным способом является, вероятно, использовать sigsuspend(2):

sigsuspend(NULL); 
0

Просто петля на sigsuspend(); , или даже sleep() в этой ситуации. Имейте в виду, однако, что один сигнал SIGIO может быть один или более События IO доступны.

5

Если ваш процесс будет оставаться свободным до тех пор, пока он не увидит события inotify, тогда вы сильно преувеличиваете вещи.

Просто выполните нормальную блокировку read() в дескрипторе файла inotify. Ваш процесс просыпается, когда есть событие inotify. Если вы хотите заблокировать-с-тайм-аутом, чтобы вы могли периодически проверять что-то еще, используйте select().

В общем, я считаю, что если ответ «сигналы», то вы, вероятно, задал неправильный вопрос :)

+0

select (за ним следует прочитать), безусловно, правильный подход здесь. –

Смежные вопросы