Znovu FIFO a blokovani v open()

Mikulas Patocka mikulas na artax.karlin.mff.cuni.cz
Úterý Říjen 19 21:46:25 CEST 1999


>To jsem pouzival v CGIckach, ktere pres FIFO komunikovaly s demonem. Ted
>to CGI prepisuju jako modul do Apache a tim padem je pouziti signalu pase.
>
>Samozrejme, ze se nabizi moznost udelat to nejak takhle:
>
>while (i++ < 50)
>{
>    if (open(fifo, O_WRONLY|O_NONBLOCK) == -1)
>        if (errno == ENXIO)
>           usleep(100);
>        else
>            failed
>    else
>        v poradku
>}
>
>Mam ale strach, ze jednak se nejake konexe netrefi do stavu, kdy demon
>zrovna otevira FIFO pro cteni i pres vysokou cetnost pokusu o otevreni pro
>zapis a jednak mi vadi, ze i vsechny operace budou non-blocking, coz
>komplikuje praci.
>
>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.

Mikulas Patocka


Další informace o konferenci Linux