LINUX.ORG.RU

проблемка с select


0

0

Пишу программку которая должна при записи в какой-то файлик просыпатся и делать что-нибудь полезное.
По аналогии с отловом нажатия на клавишу решил попользоваться select'ом. Передаю ему дескриптор открытого файлика и жду события, чтобы считать данные.
Но select почему-то не усыпляет мой процесс засыпает, а сразу возвращает, что в файлике есть данные для счтывания. Подскажите пожалуйста, как можно этого избежать.


Никак. select говорит не то, что "есть данные", а что "read не
заблокируется". При чтении из файла read не заблокируется
никогда. Один из вариантов решения -- писать не сразу в файл,
а сначала в трубу или в сокет, каковые и пробовать селектом.

vnp
()

Re:

почитай сигналы
man kill ; info libc
там есть пара сигналов которые посылаются процессу
если в фаил можно писать и если из файла можно читать
может поможет. сам не знаю не пробывал.

Aleks_IZA
()

С сигналами пробовал через fcntl, но у меня не работает :((( Может кто подскаэет где взять напильник для моих кривых /dev/lhand и /dev/rhand

joker
() автор топика

Дело в том, что писать в этот самый файлик, за которым мне надо следить будет чужеродная программа, к которой я никакого отношения не имею :((
А мне надо в реал-тайме отслеживать изменение этого файла.
Ести ли какой нить выход кроме
while (1)  {
     if (!stat(filename, &st) ) { 
 .           .................
      //чё нить связанное с  st.st_mtime или размером файла
.            ................
     }
}

joker
() автор топика

Читать Documentation/dnotify.txt в исходниках ядра. Может, man есть по F_NOTIFY, я не знаю. Также см. fs/dnotify.c

idle ★★★★★
()

Сенкс 2ALL за полезные советы.
А где эти самые сорцы тейла то взять можно ??
мне в принципе тоже самое сделть надо, что тейл делает
только свой обработчик на дописывание файла повесить
А юзать баш или вызывать тейл exec'ом не хочу
типа шоб увеличить быстродействие :)))

joker
() автор топика
Ответ на: комментарий от joker

Кстати, еще несколько идей:

1. while (1) { терзаем stat } вполне проканает, если не нужно большое разрешение,
например, while (1) { sleep(1); терзаем stat }

2. Если "чужеродная программа" слинкована динамически, можно перехватить
запись в файл через LD_PRELOAD и свистеть (пайпом или IPC) из переватчика.

3. Подсунуть "чужеродной программе" FIFO, читать из него своей свистелкой и
переспасать прочитанное в регулярный файл.

Die-Hard ★★★★★
()
Ответ на: комментарий от joker

Насколько я помню, tail в цикле при помощи fstat проверяет файл (типа, размер сравнивает). Нечто вроде того, что Die-Hard написал.

svd
()

Ну до линуксовых сорцов tail я ещё не добрался, но в BSD там tail
точно делаетя sleep(1), а потом проверяет вызовом kevent()
произошло ли что нибудь с файловый дескриптором и так - while(1)...

joker
() автор топика

Да не надо исходники tail смотреть, достаточно
strace tail -f file. У меня tail 1.22 проверяет
файл раз в секунду.

Неужели какие-то сложности с F_NOTIFY ? Там же
все так просто написано, с примером.

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.