LINUX.ORG.RU

Чтение FIFO должно быть в цикле?

 ,


0

1

Если два процесса открывают именованный канал в блокирующем режиме, то иногда (очень редко) чтение завершается с кодом 0 (0 байт прочитано). Как такое может быть?
P.S. решил через чтение в цикле while( read( fifofd, &data, sizeof( data ) ) == 0 );



Последнее исправление: nerdogeek (всего исправлений: 1)

Лучше >0 , еще и отрицательный код в случае ошибки может быть

ilovewindows ★★★★★
()

просто используй poll().

anonymous
()
Ответ на: комментарий от nanoolinux

Сигнал пришёл?

Не, перед открытием и чтением ставлю sigprocmask.

Закрыли с другой стороны?

Пишущий процесс открывает пайп, пишет и закрывает. Читающий открывает, читает, закрывает. Вот ошибка на читающем: broken pipe.

nerdogeek
() автор топика

документы не читай, сразу спрашивай на лоре:

$ man 2 read
...
RETURN VALUE
       On success, the number of bytes read is returned (zero indicates end of file)
...

интересно, а какой у тебя сейчас критерий окончания чтения?

anonymous
()
Ответ на: комментарий от nerdogeek

Вот ошибка на читающем: broken pipe.

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

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

Да, я затупил. Нет у меня сейчас такой ошибки broken pipe

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

Не позорься - почитай что-нибудь о программировании в Unix.

:D читал Роббинса «Linux. Программирование в примерах». Но сейчас действительно не понимаю что происходит. Почему read иногда возвращает 0, когда на пишущей стороне всегда записывается ровно 4 байта.

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

On success, the number of bytes read is returned (zero indicates end of file)

Как там может периодически возникать EOF, если всегда первым в FIFO приходят данные (4 байта)?

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

Как там может периодически возникать EOF, если всегда первым в FIFO приходят данные (4 байта)?

если read() вернул 0, то это означает, что писатель на другой стороне пайпа отправил все что хотел и закрыл fifo, а читатель ранее уже получил все, что записал писатель и больше данных в пайпе нет и появиться больше не может (т.к. писателя нету)

чего не понятного то?

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

писатель на другой стороне пайпа отправил все что хотел и закрыл fifo

Так и есть, но

читатель ранее уже получил все, что записал писатель и больше данных в пайпе нет и появиться больше не может

Как раз если читать в цикле, то он все-таки прочитает данные (иногда после нескольких read, которые возвращают 0). Читатель только в одном месте кода читает из фифо, поэтому читатель не мог ранее что-либо получить

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

поэтому читатель не мог ранее что-либо получить

ну, значит писатель ничего не писал...

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

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