PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie Dateinamen zu einem File Pointer bestimmen?



nobody0
26-08-2005, 12:07
Ich brauche den Namen der Temporärdatei, die von tmpfile angelegt wird.
Da tmpfile nur den File Pointer liefert, brauche ich noch eine Funktion, die mir zum File Pointer den Dateinamen ausgibt.
Welche Funktion kann das? :confused:

peschmae
26-08-2005, 12:19
Ich glaube nicht dass du vom FILE* irgendwie zum Dateinamen zurückkommst.

Am besten verwednest du einfach die Funktion
char *tmpnam(char *)
anstatt tmpfile und öffnest die Datei dann halt mit fopen.

MfG Peschmä

anda_skoa
26-08-2005, 13:55
Nur daß bei tmpnam steht "Never use this function" ;)

Ciao,
_

Joghurt
26-08-2005, 14:05
Warum willst du den Dateinamen denn haben? tmpfile löscht die Datei sofort, nachdem sie angelegt wurde; sie erscheint also nicht im Dateisystem. Da sie noch geöffnet ist, kannst du aber solange mit ihr arbeiten, bis du sie schließt.

Kurz gesagt: die Datei hat gar keinen Namen.

Pingu
26-08-2005, 15:13
Ich verstehe ihn. Es kann manchmal Sinn machen den Nahmen der Datei zu wissen. Zum Beispiel wenn man auch dem eigenen Programm heraus ein fremdes Aufrufen möchte und des Ausgabe auswerten möchte. Wenn man hierbei die Ausgabe des externen Programmes in eine temporäre Datei umleiten kann und dann diese temporäre Datei einlesen kann, dann ist einem viel geholfen.

Ich bin auch an der Lösung dieses Problemes interessiert, habe bis auf die Verfendung von tmpnam() aber bisher auch keine andere Lösung gefunden.

Pingu

peschmae
26-08-2005, 16:13
Nur daß bei tmpnam steht "Never use this function" ;)


Hmm, hatte einen Blick in den Herold geworfen, dort stand das nicht.
Vor allem steht aber nicht wieso :)

MfG Peschmä

Joghurt
26-08-2005, 18:06
Vor allem steht aber nicht wieso :)Stichwort race condition.

anda_skoa
26-08-2005, 18:39
Hmm, hatte einen Blick in den Herold geworfen, dort stand das nicht.

Steht in der man page :)

Für Dateien, die man mit anderen Programmen teilen möchte, würde ich eher zu Dateien im Benutzerverzeichnis oder so tendieren.
Dort hat vermutlich nur der Benutzer Schreibrechte.

Ciao,
_

peschmae
26-08-2005, 20:12
Stichwort race condition.

Ich wäre jetzt davon ausgegangen dass derartige Problem bei einer Implementierung in Betracht gezogen wurden (z.B. in dem man die PID oder so mit in den Dateinamen nimmt - das sollte zumindest die Kollisionswahrscheinlichkeit sehr tief halten)

MfG Peschmä

anda_skoa
26-08-2005, 21:04
Es geht nicht um die Kollision, sondern um eine Möglichkeit Dateien zu zerstören.
zB stell dir vor eine Applikation schreibt eine Datei in /tmp und du änderst zwischen Angelegen und Schreiben den Verzeichniseintrag von einer Datei auf einen Link, der auf eine andere Datei zeigt und die der anderen User schreiben darf.

Und dann stell dir vor dieser andere User hat mehr Rechte als du ;)

Ciao,
_

peschmae
27-08-2005, 08:47
Ok, da kann was schiefgehen.

Aber wie wird das Problem mit tmpfile gelöst? Ich meine das muss ja auch 1) sich einen Namen ausdenken 2) die Datei öffenen was ja Aufrufen von tmpname()/fopen() entspricht.

MfG Peschmä

locus vivendi
27-08-2005, 10:47
Aber wie wird das Problem mit tmpfile gelöst? Ich meine das muss ja auch 1) sich einen Namen ausdenken 2) die Datei öffenen was ja Aufrufen von tmpname()/fopen() entspricht.
Solange es keinen Systemcall gibt, der beides macht, behilft man sich damit, einen schwer zu erratenden Dateinamen auszudenken und beim Aufruf von open als Flags O_CREAT und O_EXCL zu setzen. Sollte open Fehlschlagen, könnte man es dann noch einmal mit einem anderen Namen versuchen.

anda_skoa
27-08-2005, 12:16
Außerdem macht ja open sowohl den Eintrag im Verzeichnis als auch das Öffnen der Datei.

Wenn also das Erzeugen (wie locus vivendi gesagt hat gesichert über O_EXCL) funktioniert hat, hat man ziemlich sicher diese Datei offen.

Da Problem ist dann nur mehr das Löschen, weil ja jemand die temporäre Datei löschen könnte und eine andere mit dem selben Namen erzeugen könnte.
Allerdings bringt das nicht so viel, weil zB das Löschen eines Symlinks nur den Symlink löscht, nicht die Datei auf die er zeigt und Hardlinks nur von root erzeugt werden können.

Ciao,
_

nobody0
05-09-2005, 20:05
Hm, die Benachrichtigung funktioniert nicht; trotz Abo habe ich von hier keine Mail erhalten.

Das tmpfile habe ich in einem gut 10 Jahre alten und kürzlich überarbeiteten Programm und ich würde mal gerne sehe, welche Temporärdatei denn angelegt wird.

Joghurt
05-09-2005, 21:37
Wahrscheinlich wird die Datei geöffnet und sofort gelöscht, das heisst, sie ist im Verzeichnisbaum nicht mehr vorhanden und nur das Programm kann noch schreiben und lesen bis es diese schließt.

bischi
05-09-2005, 21:47
Naja - du könntest ja laufend md5-checksummen von deinem System erstellen und jedes mal prüfen, ob eine Datei geändert wurde ;)

MfG Bischi