Problem s FIFO (mirne OT)
Michal Krause
mike na navrcholu.cz
Pondělí Červen 7 15:49:13 CEST 1999
Dne 6. 6. 1999 Mikulas Patocka napsal:
> >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).
Ja data zapisu na jeden write, ale paklize jsou oba konce fifo obsazene
(demon<---->cgi1), tak se cgi2 blokne v open(), dokud demon svuj konec
neuzavre a znovu neotevre. Pseudokod demona:
nekonecny cyklus A
{
otevri fifo pro cteni
nekonecny cyklus B
{
cti z fifo
pokud jsi dostal konec souboru (read() == 0), pak prerus cyklus B
pokud jsi dostal data, pak je zpracuj
}
zavri fifo
}
Abych se nechlubil cizim perim, tenhle kod mam od Pavla Kankovskeho
(tentokrat to nepopre, nasel jsem si to v archivu :) a funguje naprosto
spolehlive.
> 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.
> }
V mem pripade to neplati, viz vyse.
S pozdravem
Michal Krause /\
ICQ: 7665279 Informace (nejenom) ze sveta Linuxu /\/ \
email: mike na navrcholu.cz ______ http://www.root.cz/ ______ NAVRCHOLU.cz
There are three kinds of lies: lies, damn lies, and benchmarks.
Jeremy Allison
Další informace o konferenci Linux