select() a pojmenovane fifo

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Středa Červenec 5 12:15:12 CEST 2006


On Wed, 5 Jul 2006, Michal Kubecek wrote:

> On Mon, Jul 03, 2006 at 11:11:13AM +0200, Jiri Kosina wrote:
> >      * If no process has the pipe open for writing, read()
> >        shall return 0 to indicate end-of-file.
> Takhle se ale Linux podle mých zkušeností nechová. Pokud rouru nemá
> nikdo otevřenou pro zápis, read() blokuje.

Ony jsou to ve skutečnosti dvě různé situace:
1. po neblokujícím open() s O_RDONLY, dokud ještě nebyla nikým
   otevřena pro zápis,
2. poté, co byl uzavřen poslední zapisovací deskriptor.

V první případě se to blokuje a čeká na zapisovatele (nebo tedy
v neblokujícícm módu vrací EWOULDBLOCK). V druhém případě okamžitě
vrací EOF. O tuto dvojakost si nabil ústa původní tazatel: nejdřív to 
jakoby fungovalo dobře, a pak se to najednou dostalo "do vývrtky".

Je pravda, že standard to popisuje tak, jako by existoval jen druhý
případ, což je asi nějaké opominutí (možná v tom hraje roli to, že první
lze pozorovat jen po neblokujícím open()).

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux