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