2010-11-21 12 views
1

Wie würde ich in C++ prüfen, ob eine Datei, die wir öffnen, über Symlinks weitergeleitet wird? Hier ist meine Datei Opener Handler:Symlinks und Dateiumleitung

f=fopen(addr.c_str(), "rb"); 

Vielen Dank im Voraus

+0

Sie haben es mit C++ versehen, warum benutzen Sie stattdessen 'fstream' nicht? – Ruel

Antwort

2

Wenn Sie stat() verwenden, folgt es automatisch dem Symlink. Wenn Sie fstat() verwenden, ist der Symlink bereits gefolgt, da die Datei geöffnet wurde, um den Dateideskriptor zu erhalten.

lstat() ist in diesem speziellen Fall gegenüber stat() und fstat() vorzuziehen, da es dem Symlink nicht folgt. Rufen Sie nach dem Aufrufen von lstat() den Befehl open() auf. Es gibt jedoch ein Racebedingungsproblem, das diesem Verfahren innewohnt; ein anderer Prozess/thread/task könnte zwischen dem Aufruf von lstat() und open() auftreten und die Datei in einen symlink umwandeln.

Glücklicherweise gibt es eine Lösung für diese Race-Bedingung. Wenn Sie die Datei mit open() öffnen, können Sie möglicherweise das Flag O_NOFOLLOW verwenden. Dies sagt open(), dem Symlink nicht zu folgen, wenn es einen gibt. Sie müssen jedoch weiterhin wissen, ob die Datei, die Sie geöffnet haben, ein Symlink war (aber nicht gefolgt wurde) oder nicht. Verwenden Sie dazu den von open() mit fstat() zurückgegebenen Dateideskriptor.

Hoffe, das hilft.