LINUX.ORG.RU

select и non-blocking fifo


0

0

Вот возникли непонятки с сабжем:
Создаю fifo, открываю его с параметром O_RDONLY | O_NONBLOCK, вызываю на него select, все ок. 
После того, как другой процесс пишет 1 байт в этот fifo, select завершается и я вычитываю этот байт из fifo. 
Однако при следующем вызове select, fifo снова становится готовым на чтение, хотя данные в него никто больше не писал. 
Почему такое может быть? 

Код:
    for (;;)
    {
        FD_ZERO(&fds);

        FD_SET(fifo, &fds);
        fd_max = MAX(fifo, fd_max);
...
/* добавляем еще дескрипторы: 2 пайпа и 1 сокет */
...
        if (select(fd_max + 1, &fds, 0, 0, 0) < 0)
        {
            if (errno != EINTR)
                err(1, "select");
        }
...
/* обрабатываем готовность других дескрипторов на чтение */
...

        if (FD_ISSET(fifo, &fds))
        {
            while (read(fifo, &i, 1) == 1)
            ; /* empty non-blocking fifo */

            some_func();
            continue;
        }
    }

Ответ на: комментарий от tailgunner

нет, не помогло. fcntl проходит успешно, а select ведет себя как и прежде. read из этого fifo возвращает 0

BreadFan ★★
() автор топика
Ответ на: комментарий от tailgunner

да, это так. а как обрабатывать такую ситуацию? держать с той стороны пайп всегда открытым? просто я думал, что поюзаный и закрытый с одной стороны fifo будет вести себя в точности так же, как и ни разу не открывавшийся fifo

BreadFan ★★
() автор топика
Ответ на: комментарий от BreadFan

> да, это так. а как обрабатывать такую ситуацию?

Вот так и обрабатывать - AFAIK, вычитываение 0 байт из готового к чтению дескриптора - это EOF (на сокетах тоже так, IIRC). Так что после такого ты можешь закрыть и открыть заново файл на приемной стороне.

> просто я думал, что поюзаный и закрытый с одной стороны fifo будет вести себя в точности так же, как и ни разу не открывавшийся fifo

Теперь ты точно знаешь, что это не так :D

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

поправил свой код как ты посоветовал, теперь вроде нормально.
спасибо за помощь!

BreadFan ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.