Problem s FIFO (mirne OT)

Mikulas Patocka mikulas na artax.karlin.mff.cuni.cz
Neděle Červen 6 23:10:47 CEST 1999


>Zdravim,
>
>mam demona, se kterym komunikuji CGI scripty pres FIFO. Jak znamo, operace s
>FIFO jsou blocking a to tak, ze se blokuje i open(), dokud nekdo neotevre
>"druhou stranu".

Divim se, jak to vubec muze fungovat. Pokud data nezapises na jeden write(),
tak v tom je race-condition (vic skriptu soucasne zapisuje a data se pomichaji).

>Muj problem spociva v tom, ze onen demon pouziva MySQL. Stalo se mi, ze MySQL
>spadlo a demon se v dusledku toho restartuje. Dokud vsak MySQL nebezi, demon
>nezacne odebirat data z FIFA. No a protoze tech CGIcek, ktere se snazi o
>konexi je moc a neukoncuji se (diky bloknuti v open()), behem par vterin to
>posle server do vecnych lovist.
>
>Takze otazka zni: lze nejak dosahnout napriklad timeoutu ve volani open()?
>Funkce select() samozrejme pouzit nejde, protoze jeste nemam file descriptor.
>Nebo by mel nekdo nejakou jinou ideu, jak to resit?
>
>Mozna by sla pouzit konstrukce
>
>while (cnt++ < 10)
>{
>    if ((fd = open(fifo, O_WRONLY | O_NONBLOCK)) == -1)
>        sleep(1);
>    else
>        break;
>}
>if (fd != -1)

Ja myslim, ze pokud se open blockne, tak je to jen proto, ze fifo zatim nikdo
neotevrel pro cteni (t.j. daemon nebezi). Takze by stacilo

if ((fd = open(fifo, O_WRONLY | O_NONBLOCK)) == -1) {
	daemon nebezi => zrusit.
}

Mikulas Patocka


Další informace o konferenci Linux