[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: