Znovu FIFO a blokovani v open()

Mikulas Patocka mikulas na artax.karlin.mff.cuni.cz
Středa Říjen 20 08:33:32 CEST 1999


>> >Zkratka sikla by se nejaka casovana asynchronni udalost, jina nez signal.
>>
>> A co takhle to udelat takhle: konzument fifo otevre jednou pro cteni a
>> jednou pro zapis. S tim handlem pro zapis nebude nic delat, ale
>> zabrani to zavreni fifa, pokud je vsichni producenti zavrou. Konzument
>> nebude zavirat fifo, bude je drzet otevrene porad. Producenti ho
>> otevrou s O_NONBLOCK a pokud se to nepovede, je jasne, ze konzument je
>> mrtvy.
>
>Musel bych to vyzkouset, ale neni mi jasne, jak otevrit FIFO dvakrat - na
>prvnim otevreni se to prece blokne, ne? Zrejme by musel ten proces
>odforkovat potomka, ktery by drzel handle pro zapis.
>
>A nebo mozna jednoduse, i kdyz ne tak elegantne, spoustet konzumenta ze
>skriptu nejak takhle:
>
>cat > FIFO &
>konzument

Ani by nebylo nutne se forkovat. Prvnve se fifo otevre pro cteni a blokne
se. Pak prijde prvni request, open pro cteni se odblokuje a otevre
se handle pro zapis, ktery zabrani zavreni fifa, az je klient zavre.

int hr = open("fifo", O_RDONLY); // <-tady se to blokne, ale az prijde
		prvni request, tak se to zas odblokuje
int hw = open("fifo", O_WRONLY); // <-zabranime zavreni pipy, s tim
		handlem nebudeme uz nic delat
while (1) {
	read(hr ... a tak dal)

Mikulas Patocka


Další informace o konferenci Linux