sig_atomic_t (Re: fetchmail)

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Úterý Květen 16 13:34:02 CEST 2000


On Tue, 16 May 2000, Petr Novotny wrote:

> No dobre, ale pokud provadim jen to, ze testuji, zda hodnota je 
> nulova nebo nenulova (stylem if (should_quit) { ...; exit(0); }), pak je 
> mi jedno, zda je zapis/cteni atomicke. Bud je tam presne nula, 
> nebo tam presne nula neni. Napada vas treti moznost?

Pokud se omezim pouze na to, co je specifikovano v poslednim odstavci, tak
existuje jeden hypoteticky scenar, kdy to bude fungovat zcela spatne.
Predpokladejme, ze mame dva ruzne handlery dvou ruznych signalu, ktere oba
nastavuji danou promennou, ale kazdy na jinou hodnotu. Predpokladejme pro
jednoduchost, ze zapis probiha po jednotlivych bajtech a zapisovane
hodnoty jsou { 1, 0 } pro signal A a { 0, 1 } pro B. Pak muze nastat toto:

program bezi normalne           hodnota promenne
...
prijde signal A                 { 0, 0 }
handler A:
  zapise 1 do 1. bajtu          { 1, 0 }
  prijde signal B
  handler B:
    zapise 0 do 1. bajtu        { 0, 0 }
    zapise 1 do 2. bajtu        { 0, 1 }
  konec handleru B
  zapise 0 do 2. bajtu          { 0, 0 }
konec handleru A
...

Toto ovsem nemuze nastat, protoze je zapisovana pouze jedina hodnota
(predpokladame-li, ze je zapis provaden nejakym rozumnym zpusobem (*)),
navic by se mel zapis dit pouze v handleru jedineho signalu, a proto by
nemelo byt mozno, aby mohlo behem jeho provadeni dojit k provedeni jineho
zapisu.

Takze zbyva pouze moznost, ze se zapis provede behem cteni, tj. prectena
hodnota bude zcasti puvodni a zcasti nova (opet predpokladam, ze je zapis
i cteni provadeno nejakym rozumnym zpusobem). To tedy nastesti nevadi,
protoze je-li u ziskane hodnoty pouze testovan prechod z nulove hodnoty na
nenulovou, pak to nejhorsi, co muze nastat, je, ze test vyda jeden
nespravny negativni vysledek. A to je neskodne, protoze signal mohl stejne
dobre prijit az po provedeni toho testu a pri dalsim testovani uz bude
vysledek spravne.

Cili v danem kontextu je pouziti int ok, ale IMHO je lepsi vzdycky psat
programy tak, aby spravna funkce kazde jeho casti zavisela na co nejmensi
mnozine predpokladu (specialne tech, co maji globalni charakter).

(*) Priklad nerozumneho zpusobu by byl treba ten, ze se cela oblast pameti
vynuluje a pak se do toho xorem zapise nova hodnota.

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux