On Mit, 18 Jul 2001 at 23:34 (+0200), David Haller wrote:
On Mit, 18 Jul 2001, Bernd Brodesser wrote:
* David Haller schrieb am 18.Jul.2001: [...]
$ mktemp /root/${prg}.$$.XXXXXX Cannot create temp file /root/.12760.YTRUBd
Ich mache meine Fehlermeldung lieber selber. Was soll der Endanwender mit obiger Meldung anfangen?
Du weisst ja auch nix genaues (Rechte, Disk voll, uebergeordnetes Verz. existiert nicht)... Du weisst du dass es nicht geklappt hat (mkstemp liefert nur 1 als exit-status).
Naja, so viele Fälle gibt es ja wohl nicht und es ist für den Anwender nicht primär entscheidend zu wissen, was denn nun genau schief gelaufen ist (wenn er Ahnung hat, kann er mittels df, ls und so weiter selbst auf Fehlersuche gehen, wenn nicht, dann nützen ihm genauere Meldungen auch nichts). Wichtig ist vorrangig, zu entscheiden ob das Programm weitermachen kann. Das kann man einfach so klären, dass in einer Schleife n-mal versucht wird, eine temp. Datei anzulegen und dann erst aufgegeben wird (wobei n nicht zu hoch sein sollte - vielleicht 5 - 10). Wenn man es ganz sauber macht, dann prüft man im Fehlerfall ein paar Sachen ab (habe ich Schreibrechte im Verzeichnis, ist das FS voll?), in denen ein nochmaliges Probieren sinnlos wäre und versucht es dann einfach ein paar Mal. So kann man evtl. Namensgleichheiten abfangen. [...]
Wichtig ist doch, daß mktemp überprüft, ob der vorgeschlagene Dateiname schon existiert oder nicht. Wenn es das nicht tut, dann ist es nicht zu gebrauchen.
Tut es. Es scheitert dann (bzw. mkstemp(3) scheitert und gibt in errno EEXIST ("File exists" bzw. "Die Datei existiert bereits") zurueck. Leider gibt die gepatchte Version von mktemp diese Fehler- ursachen weder aus noch weiter (z.B. mittels 'exit(errno);')...
Es ist schade, dass der Patch das tut. Kennst du einen Grund dafür?
Dann schlage ich sowas wie
${prg}.`date +%s`.$$.tmp vor. Da gibt es so schnell keine doppelte, es sei denn es werden im Prozeß selber mehere tmp angelegt. Die kann ich dann aber hart anders nennen, etwa:
$TMP1=$TMPDIR/$PRG.A`date +%s`.$$.tmp $TMP2=$TMPDIR/$PRG.B`date +%s`.$$.tmp $TMP3=$TMPDIR/$PRG.C`date +%s`.$$.tmp
Sollte man in einer Schleife Tempdateien anlegen (könnte ja sein, daß man das braucht. ;)) dann wird der Schleifenzähler mit im Namen aufgeführt.
Ack.
Das ist genauso unsicher wie eine von mktemp erzeugte Version (in die man per Vorlage ja auch $$ und $prg einfließen lassen kann). Man kann sich nie 100% sicher sein, dass das Anlegen der temp. Datei klappt und muss in jedem Fall einen potenziellen Fehler abfangen. Jan