Unix: kritischen File-I/O vor Signals schützen

03/08/2008 - 17:46 von Nikolaus Schulz | Report spam
Hallo,

wie kann ich verhindern, daß kritischer File-I/O durch Signals
unterbrochen wird, und z.B. bei Empfang von SIGTERM eine Datei durch
einen unterbrochenen Schreibvorgang korrumpiert wird? Die kanonische
Antwort ist ja wohl, Signals zu blocken, aber das geht ja mit Python
nicht. Ignorieren ist natürlich auch keine gute Antwort.

Bei Signals bewege ich mich auf dünnem Eis, weiß da wenig drüber und
find das nicht leicht zu verstehen. :-/ Wenn ich das richtig verstehe,
reicht es nicht, für die Critical Section einen Signal-Handler zu
installieren, der etwa nur ein Abbruch-Flag setzt, da z.B. os.write()
trotzdem einen EINTR-Fehler auswerfen kann. Wie behandelt man das am
besten?

Nikolaus
 

Lesen sie die antworten

#1 Volker Grabsch
03/08/2008 - 18:52 | Warnen spam
Nikolaus Schulz schrieb:
wie kann ich verhindern, daß kritischer File-I/O durch Signals
unterbrochen wird, und z.B. bei Empfang von SIGTERM eine Datei durch
einen unterbrochenen Schreibvorgang korrumpiert wird? Die kanonische
Antwort ist ja wohl, Signals zu blocken, aber das geht ja mit Python
nicht. Ignorieren ist natürlich auch keine gute Antwort.



Bist du dir sicher? Es hat einen Grund, warum die Handler
standardmàßig so arbeiten, wie sie es tun. Wenn dein Programm
zum Beispiel abstürzt oder der Benutzer ausversehen eine
viel zu große Datei anlegen làsst, dann kann er normalerweise
das Schlimmste via Ctrl+C verhindern. Es wàre ziemlich blöd,
wenn das Programm in dem Fall darauf bestehen würde, seine
Operation fortzusetzen und erst mit einem SIGKILL brutal
abgebrochen werden müsste.

Aber das kommt natürlich auf deinen Anwendungsfall an. was
sind das denn für kritische Schreibvorgange, die auf gar
keinen Fall unterbrochen werden dürfen?

Übrigens kann ein Schreibvorgang aus vielen Gründen abbrechen,
etwa durch eine volle Festplatte, zu wenig RAM oder durch
einen Programmierfehler. Daher sollte ein Programm zum
Beispiel _niemals_ eine existierende Datei einfach überschreiben,
auch dann nicht, wenn es wàhrenddessen alle Signale blockiert.
In solch einem Fall ist es besser, entweder nur Daten an die
Datei anzuhàngen (öffnen im Append-Modus), oder in eine neue
temporàre Datei schreiben und diese ganz zum Schluss über die
alte Datei schieben (z.B. mit os.rename).


Gruß,

Volker

"Wenn du der Meinung bist, der andere sei ein Depp, dann überlass das
Antworten denjenigen, die nicht dieser Meinung sind."

Ähnliche fragen