PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C/C++] Blackout... Filename aus Handle



7.e.Q
02-11-2006, 09:10
Hi Leute,

ich brauch mal kurz 'ne Info, wie ich aus 'nem Filehandle (FILE*) den Dateinamen herausfinden kann. Danke!

Grüße,
Hendrik

7.e.Q
02-11-2006, 12:57
9 Betrachter und noch kein einziger Hit in fast 4 Stunden? Boar... Was das denn?!

lagalopex
02-11-2006, 14:45
Normalerweise ist doch bekannt, welche Datei geöffnet wurde... man musste doch den Pfad dazu angeben... :confused:

anda_skoa
02-11-2006, 18:31
Würde mich wundern, wenn das mit der Standard API möglich wäre, schließlich ist nicht gesichert, daß zu einem FILE Stream überhaupt ein zugeordneter Dateiname existiert.

Ciao,
_

peschmae
02-11-2006, 20:06
Wollte ich auch gerade sagen.

Mal abgesehen davon wollte ich noch sagen dass du wirklich ziemlich ungeduldig bist. ;)

MfG Peschmä

7.e.Q
02-11-2006, 22:37
Ich bin immer ungeduldig. An die Latenz von Foren hab ich mich inzwischen gewöhnt. Aber mir kam's halt spanisch vor, daß nach 4 Stunden noch nichtmal ein einziger Hit auf dem Beitrag gelandet ist, trotz 9 - 10 Beobachtern...

Zum Thema: Wenn ich 'n Filedeskriptor hab, den ich ja aus der FILE* Struktur ermitteln kann, dann müsste dazu passend doch auch eine Datei vorhanden sein. Die ich manuell ja auch über das /proc System ermitteln könnte. Das ist mir aber zu umständlich, weshalb ich halt gern gewusst hätt, ob's da auch 'ne API Funktion gibt.

locus vivendi
03-11-2006, 08:50
Zum Thema: Wenn ich 'n Filedeskriptor hab, den ich ja aus der FILE* Struktur ermitteln kann, dann müsste dazu passend doch auch eine Datei vorhanden sein.
Eine Datei schon, in einem gewissen Sinne (wenn man z. B. den Tastaturanschluss auch als Datei ansieht). Du hast aber nach dem *Namen* der Datei gefragt.

7.e.Q
03-11-2006, 09:26
Der Name/Bezeichner der "Datei" lässt sich dann doch über das Auslesen des Links ermitteln. Der zeigt doch aus dem /proc Dateisystem irgendwo hin. Und wenn es sich um eine /dev oder eine reguläre Datei handelt, kann man darüber doch auch ihren Namen ermitteln.

locus vivendi
03-11-2006, 10:44
Der Name/Bezeichner der "Datei" lässt sich dann doch über das Auslesen des Links ermitteln. Der zeigt doch aus dem /proc Dateisystem irgendwo hin. Und wenn es sich um eine /dev oder eine reguläre Datei handelt, kann man darüber doch auch ihren Namen ermitteln.
Manchmal ja, aber nicht immer. Denk doch mal an den Fall das die Datei gelöscht wird, während ein Programm sie geöffnet hat. Dann ist der Name weg.

7.e.Q
03-11-2006, 10:47
In dem Fall könnte eine ensprechende API Funktion immer noch einen NULL Zeiger liefern, wie es andere API Funktionen auch gerne tun, wenn was nicht hinhaut.

locus vivendi
03-11-2006, 13:51
In dem Fall könnte eine ensprechende API Funktion immer noch einen NULL Zeiger liefern, wie es andere API Funktionen auch gerne tun, wenn was nicht hinhaut.
Das könnte sie wohl irgendwie. Aber darum ging es ja nicht. Es ging nur darum, dass die Annahme jede Datei hätte einen Namen falsch ist.

anda_skoa
03-11-2006, 14:12
Und ein IP-Socket hat auch keinen Namen.

Der Dateiname ist ohnehin wegen der Möglichkeit der Löschung ziemlich irrelevant, zwischen dem (hypothetischen) Ermitteln des Dateinamens und dem Zugriff über eine API kann das schon längst eine andere Datei sein, als die auf die der FILE Handle zeigt.

Ciao,
_

sticky bit
03-11-2006, 19:07
Vielleicht liesse sich mittels fstat() der Inode ermitteln und dann durchs Dateisystem hangeln und die Inodes vergleichen, Etwa mit fts_read() (und Verwandten; weil bisschen schneller).
Hat man nen Treffer hat man den Filenamen. Hat man am Ende keinen gibts die Datei nicht (mehr) als solche...

Effizient ist das, sollte das tatsächlich gehen, allerdings mit Sicherheit nicht. Vielleicht solltest du auch mal näher erläutern was du vorhast?

7.e.Q
05-11-2006, 12:19
Eines unserer Programme, bzw. so ziemlich alle, da sie einen Grundstock an Funktionen anbieten, gibt uns die Möglichkeit, Dateien über das Netzwerk zu übertragen. Alles proprietär und schon seit 15 Jahren so im Einsatz. Also fragt nicht, wieso wir nicht die vorhandenen Mittel nutzen. Die Suche nach der Antwort zu dieser Frage habe ich schon lange aufgegeben. Ist halt so.

Einer der lange offenen Punkte ist die Tatsache, daß wir noch immer nicht mehr als 1 Datei zeitgleich übertragen können. Die Binärdaten der Dateien werden dabei in sogenannten IDF Records übertragen. Also im Prinzip ein Protokoll, das sowohl auf TCP, als auch auf UDP verwendet werden kann, da es eine Sicherungsschicht implementiert hat, die bei Bedarf aktiviert werden kann.

Nur soviel zum Protokoll. Allerdings läuft bei der Übertragung, bzw. der Verteilung der Daten auf die angelegten Dateien irgendwas schief. Die Daten werden irgendwie vermischt. Also wir finden Daten aus der einen Datei in der anderen wieder und umgekehrt.

Ich wollte nun über eine solche Funktion ermitteln, ob die Daten wirklich in die vorgesehene Datei geschrieben werden. Da ich inzwischen die Vermutung habe, daß die Daten von der Gegenstelle schon falsch gesendet werden, würde ich diese Vermutung gern anhand von Dummy-Dateien verifizieren, mir also anzeigen lassen, welche Daten über welchen Socket kommen und in welche Datei geschrieben werden.

Debugging also...

anda_skoa
05-11-2006, 12:25
Dann brauchst du ja nur beim Öffnen der Datei den Namen mit dem Wert des Filedescriptors ausgeben lassen und kannst später jederzeit vom Wert eines FDs auf die Datei schließen.

Ciao,
_

sticky bit
05-11-2006, 13:29
Hmm, so ganz verstanden hab ichs zwar glaub ich nicht wie das arbeitet, also vielleicht seh ich das Problem auch nicht, aber da brauchst du doch den Dateinamem hinter dem Handle nicht unbedingt? Also um zu beweisen, dass die Daten schon falsch rein kommen.

Du hast doch den Handle an sich der als eindeutiger Bezugspunkt gilt, völlig unabhängig von der Datei dahinter. Sprich, statt zu gucken was in den Handle der zu Datei "x" gehört geschrieben wird reichts doch auch zu gucken ob in den Handle n geschrieben wird, weils das selbe in grün ist?

Ausserdem willst du doch eigentlich eher überwachen was über den Socket reinkommt, so dass die Datei doch unerheblich ist? Ich weiss nicht wie das Protokoll arbeitet, aber es wird ja irgendwie angeben zu welcher Datei der gesendete Inhalt gehört und an welche Stelle er hin soll, da müsstest du dich doch eigentlich einklinken und gucken ob diese Adressierung variabel ist obwohl der Inhalt definitif zu ein und der selben Datei gehört?

7.e.Q
06-11-2006, 06:06
Naja, theoretisch könnte ich mir 'ne Map machen, wo ich den Handle und den dazugehörigen Dateinamen hinterlege. Ich hätt's gern optisch offensichtlicher in Form eines realen Namens, statt einer kryptischen Zahl...

anda_skoa
06-11-2006, 14:43
Wie gesagt ist nur der Filedescriptor aussagekräftig.

Man kann auch zwei FDs mit dem selben Filenamen aber unterschiedlichen Dateien haben.

Ciao,
_