select() a pojmenovane fifo

Michal Kubecek mike na mk-sys.cz
Středa Červenec 5 00:10:36 CEST 2006


On Tue, Jul 04, 2006 at 12:02:17PM +0200, Petr Janda wrote:
> > To vypada zcela spravne -- SIGPIPE neni proc dostat, neb do roury
> > nezapisujete, cteni korektne hlasi EOF, protoze roura byla uzavrena.
> > Jak by se to melo chovat jinak?
> 
> Proc select vraci 1 (v kombinaci s tim, jak ho volam znamena ze z toho
> lze cist) A hlavne proc se to chova jinak pred prvnim zapisem a po
> nem.

To, že vám select() vrátí deskriptor jako "ready to read", neznamená, že
z něj budete schopen přečíst nějaká data. Znamená to, že zavoláte-li na
něj read(), nebude blokovat. Což stav, kdy tam máte EOF, splňuje. Před
prvním zápisem by ale read() blokoval, takže vám ho select() nevrátí.
Pokud byste chtěl deskriptor roury dostat zpět do stavu, kde byl před
prvním zápisem, musel byste ho zavřít a otevřít znovu.

Zkuste si vytvořit pojmenovanou rouru, v jednom terminálu napsat 'cat
roura' a ve druhém 'echo ahoj > roura'. A pak ty příkazy zkuste spustit
v opačném pořadí. Když si to rozeberete, zjistíte, že se to chová přesně
tak, jako ve vašem programu, kde se na to ovšem díváte z nižší úrovně.

							  Michal Kubeček



Další informace o konferenci Linux