On Sat, Jun 02, 2001 at 06:35:42PM +0700, Pavel Orehov wrote: > Прошу прощения за дикий офтопик, но сильно надо, а в книжках и мане вопрос > совершенно не освещен и других _дружественных_ мест я не знаю...
comp.unix.programmer место весьма достойное. > > вобщем писал модуль к 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); А кто результат read проверять будет? Да и чтение по байтику -- удовольствие дорогое. Очень. result = read (fd, buf+ofs, spaceleft); if (result == 0) { /* данные кончились, больше не будет */ } if (result < 0) { /* случилось страшное */ } ofs += result; spaceleft -= result; И неблокирующее чтение в этом случае уже и не нужно. > 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; Это бесчеловечный поступок. Нельзя неблокирующим чтением в цикле без остановки ... Опять же, кто на EWOULDBLOCK проверять будет? Не все то ошибка, что -1 из read. > if(buf[ofs]=='\n')printf("we got a line"); > ofs++; > } > > и тут случается чудо: после получения первого байта у select начинается > недержание: непрерывно срывается с моим fd, но read, разумеется, > честно возвращает 0. Если select сказал, что из fd читать можно, а read вернул 0, то это однозначно кончились данные и в этом fd уже ничего интересного не будет. > > Вопрос: как бороться с этой тварью, или > 1. как узнать кол-во данных/места в буфере для чтения/записи Не надо. > 2. как ее успокоить Аккуратно проверять, что вернул read. > 3. что почитать на эту тему и окрестности кроме текстов ядра Stevens. APUE. Полная библиографическая ссылка в разных FAQ. В FAQ из comp.unix.programmer она точно есть. > если сильно не хочется за каждым байтом ходить к селекту и еще сильнее не > хочится переходить на бинарный формат с фиксированным размером блока. > подпорки типа семафоров/msgq/сигналов еще больше не нравятся (это близко > к вопросу о M$vsUNIX) > Ужас какой. Не надо придумывать никаких сигналов. А уж тем более семафоров и очередей, ибо на них тот же select не скажешь. > 4. вообще какая книжка по программированию Unix хорошая? > См. пункт 3. > хоть какая отмазка: все это программируется под потатой и для работы на > потате > > :)) -- dg