>>>>> "PO" == Pavel Orehov <[EMAIL PROTECTED]> 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