oftopic: (2) select()& O_NONBLOCK
Прошу прощения за дикий офтопик, но сильно надо, а в книжках и мане вопрос
совершенно не освещен и других _дружественных_ мест я не знаю...
вобщем писал модуль к ucd-snmnpd и обнаружил эфект:
Надо прочитать из FIFO (устройства) ASCIIz строку.
Поступаю просто (http://oniltz.da.ru/~opa/test.c)
$mkfifo file
..
fd=open(file,O_RDONLY);
FD_SET(fd,&set);
if(select(,&set,0,0,0)>0)
if(FD_ISSET(fd,&set))
read(fd,buf+ofs,1);
if(buf[ofs]=='\n')printf("we got a line");
...
ладно... так все делают, но не охото на чтение _КАЖДОГО_БАЙТА_
(напоминаю: строка ASCIIz) ходить до селекта (кто видел основной цикл
ucd-snmpd согласится)
тут возникает вопрос: а сколько байтов есть в буфере? fstat.st_size==0
ладно пишу
fd=open(file,O_RDONLY|O_NONBLOCK);
...
for(;;){
n=read(fd,buf+ofs,1);
if(n<=0)return;
if(buf[ofs]=='\n')printf("we got a line");
ofs++;
}
и тут случается чудо: после получения первого байта у select начинается
недержание: непрерывно срывается с моим fd, но read, разумеется,
честно возвращает 0.
Вопрос: как бороться с этой тварью, или
1. как узнать кол-во данных/места в буфере для чтения/записи
2. как ее успокоить
3. что почитать на эту тему и окрестности кроме текстов ядра
если сильно не хочется за каждым байтом ходить к селекту и еще сильнее не
хочится переходить на бинарный формат с фиксированным размером блока.
подпорки типа семафоров/msgq/сигналов еще больше не нравятся (это близко
к вопросу о M$vsUNIX)
4. вообще какая книжка по программированию Unix хорошая?
хоть какая отмазка: все это программируется под потатой и для работы на
потате
Reply to: