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?
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?
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ä
The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)
Nur daß bei tmpnam steht "Never use this function"
Ciao,
_
Qt/KDE Entwickler
Debian Benutzer
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.
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
Homepage: www.pingu.info
Hmm, hatte einen Blick in den Herold geworfen, dort stand das nicht.Zitat von anda_skoa
Vor allem steht aber nicht wieso
MfG Peschmä
The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)
Stichwort race condition.Zitat von peschmae
Steht in der man pageZitat von peschmae
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,
_
Qt/KDE Entwickler
Debian Benutzer
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)Zitat von Joghurt
MfG Peschmä
The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)
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,
_
Qt/KDE Entwickler
Debian Benutzer
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ä
The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)
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.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.
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,
_
Qt/KDE Entwickler
Debian Benutzer
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.
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.
Lesezeichen