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: