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

Re: oftopic: (2) select()& O_NONBLOCK



>>>>> "PO" == Pavel Orehov <opa@oniltz.da.ru> writes:

PO> FIFO (устройства) ASCIIz строку.  Поступаю просто
PO> (http://oniltz.da.ru/~opa/test.c) $mkfifo file ..
PO> fd=open(file,O_RDONLY); FD_SET(fd,&set); if(select(,&set,0,0,0)>0)
PO> if(FD_ISSET(fd,&set)) read(fd,buf+ofs,1); if(buf[ofs]=='\n')printf("we
PO> got a line"); ...

PO> ладно... так все делают, но не охото на чтение _КАЖДОГО_БАЙТА_
PO> (напоминаю: строка ASCIIz) ходить до селекта (кто видел основной цикл
PO> ucd-snmpd согласится)

Читай целый буфер, килобайта четыре.  read вернет, сколько на самом деле
прочитано... 

PO> ладно пишу fd=open(file,O_RDONLY|O_NONBLOCK); ...  for(;;){
PO> n=read(fd,buf+ofs,1); if(n<=0)return; if(buf[ofs]=='\n')printf("we got
PO> a line"); ofs++; }

PO> и тут случается чудо: после получения первого байта у select начинается
PO> недержание: непрерывно срывается с моим fd, но read, разумеется, честно
PO> возвращает 0.

А что вы хотели от O_NONBLOCK? :)  select() не блокируется ровно поэтому.
Решение см. выше. 

PO> Вопрос: как бороться с этой тварью, или 1. как узнать кол-во
PO> данных/места в буфере для чтения/записи 

Просто попробовать прочитать сколько-нибудь.  Оно само скажет, сколько
прочиталось.  

PO> 3. что
PO> почитать на эту тему и окрестности кроме текстов ядра если сильно не
PO> хочется за каждым байтом ходить к селекту и еще сильнее не хочится
PO> переходить на бинарный формат с фиксированным размером блока.  подпорки
PO> типа семафоров/msgq/сигналов еще больше не нравятся (это близко к
PO> вопросу о M$vsUNIX)

http://alexm.here.ru/manpages-ru/?  Там вроде бы все основные вопросы на
эту тему затронуты. 

PO> 4. вообще какая книжка по программированию Unix хорошая?

Вопрос же совершенно тривиальный, там никакой книжки не нужно, нужно
просто прочитать всю группу манов и воспринять ее сущностно. 

PO> хоть какая отмазка: все это программируется под потатой и для работы на
PO> потате

Welcome to fido7.ru.unix? 

--alexm



Reply to: