Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 16

Thema: Wie Dateinamen zu einem File Pointer bestimmen?

  1. #1
    Registrierter Benutzer
    Registriert seit
    22.03.2001
    Beiträge
    650

    Question Wie Dateinamen zu einem File Pointer bestimmen?

    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?

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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)

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Nur daß bei tmpnam steht "Never use this function"

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    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.

  5. #5
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    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

  6. #6
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von anda_skoa
    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ä
    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)

  7. #7
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Zitat Zitat von peschmae
    Vor allem steht aber nicht wieso
    Stichwort race condition.

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von peschmae
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #9
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von Joghurt
    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ä
    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)

  10. #10
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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

  11. #11
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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)

  12. #12
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    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.

  13. #13
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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

  14. #14
    Registrierter Benutzer
    Registriert seit
    22.03.2001
    Beiträge
    650
    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.

  15. #15
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •