Wie überprüft man, ob eine Datei bereits in C geöffnet ist?

8

Ich arbeite an einem Multithread-System, bei dem eine Datei basierend auf den Dateizugriffsberechtigungen zwischen verschiedenen Threads geteilt werden kann. Wie kann ich überprüfen, ob die Datei bereits von einem anderen Thread geöffnet wurde? Vielen Dank im Voraus

    
user503403 06.09.2013, 01:05
quelle

4 Antworten

3

Sie können int flock (int fd, int-Operation); zum Markieren verwenden eine Datei als gesperrt und auch um zu prüfen, ob sie gesperrt ist.

%Vor%

flock sollte in einer Thread-App funktionieren, wenn Sie die Datei in jedem Thread einzeln öffnen: mehrere Threads, die in der Lage sind, gleichzeitig Flock zu bekommen

Es gibt weitere Informationen über Flock und mögliche Schwächen hier :

    
dcaswell 06.09.2013 01:13
quelle
2

Um herauszufinden, ob eine benannte Datei bereits in , Sie können das Verzeichnis /proc/self/fd durchsuchen, um festzustellen, ob die Datei einem Dateideskriptor zugeordnet ist. Das folgende Programm skizziert eine Lösung:

%Vor%

Aus Ihrem Kommentar scheint es, dass Sie ein vorhandenes FILE * abrufen möchten, wenn eines bereits von einem vorherigen Aufruf von fopen() für die Datei erstellt wurde. Es gibt keinen Mechanismus, der von der Standard-C-Bibliothek bereitgestellt wird, um alle aktuell geöffneten FILE * zu durchlaufen. Wenn es einen solchen Mechanismus gäbe, könnten Sie seinen Dateideskriptor mit fileno() ableiten und dann wie oben gezeigt /proc/self/fd/# mit readlink() abfragen.

Dies bedeutet, dass Sie eine Datenstruktur verwenden müssen, um Ihre offene FILE * s zu verwalten. Wahrscheinlich wäre eine Hash-Tabelle, die den Dateinamen als Schlüssel verwendet, am nützlichsten für Sie.

    
jxh 06.09.2013 01:13
quelle
1

Ich weiß nicht viel über Multithreading unter Windows, aber unter Linux gibt es viele Möglichkeiten. Hier ist eine FANTASTIC -Ressource. Sie können auch alle Dateisperrungsfunktionen nutzen, die inhärent oder explizit vom Betriebssystem angeboten werden (z. B .: fcntl ). Mehr zu Linux-Schlössern hier . Das Erstellen und manuelle Verwalten eigener Mutexe bietet Ihnen mehr Flexibilität als Sie es sonst tun würden. user814064 's Kommentar über flock() sieht wie die perfekte Lösung aus, aber es tut nie weh, Optionen zu haben!

Ein Codebeispiel hinzugefügt:

%Vor%     
collinjsimpson 06.09.2013 01:13
quelle
0

Wenn Sie es in der Shell tun, können Sie einfach lsof $filename verwenden.

    
wizawu 06.09.2013 01:15
quelle

Tags und Links