Znovu FIFO a blokovani v open()

Michal Krause mike na navrcholu.cz
Úterý Říjen 19 15:16:46 CEST 1999


Zdravim,

vim, ze uz se z toho pomalu stava evergreen, ale potrebuju opet resit
problematiku blocknuti v open() pri otevirani FIFO, na jehoz druhem konci
nikdo neni a stavajici reseni (asi) neni pouzitelne.

Doposud jsem pouzival naprosto bez problemu toto:

sigaction(SIGALRM, ...)
alaram(5)
if (open() == -1)
{
    perror("open");
    return -1;
}
pokracovani....

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.

Mel by nekdo nejaky jiny napad?

Nakonec mozna zacnu uvazovat o externim programu, ktery bude periodicky
zkouset FIFO otevrit s nejakym rozumnym timeoutem a pokud se mu to
nepovede, usoudi, ze demon je kaput a zacne sam odebirat a zahazovat
konexe.

Snad by sly pouzit nektere funkce z Apache API, ale zase az tak zbehly v
tom nejsem...

Obecne vzato by to asi nemelo nastat protoze demon se v provozu ukazuje
jako rockstable, ale jeden nikda nevi :(

Napadne nekoho neco?

-- 
S pozdravem

Michal Krause                                                      /\
ICQ: 7665279            Informace (nejenom) ze sveta Linuxu     /\/  \
email: mike na navrcholu.cz ______ http://www.root.cz/ ______ NAVRCHOLU.cz

Co napsat do signatury, aby to nikoho nepohorsilo? Snad jedine nejakou
obecne znamou pravdu. Doufam, ze vsichni vite, ze tucnak je bylozrava ryba. 



Další informace o konferenci Linux