2016-05-08 8 views
3

Ich arbeite an einem Kontingent-Manager in C/C++ implementiert unter OS X, die die maximale Größe eines bestimmten Ordners begrenzen. In meinem Projekt gibt es generische Thread-Worker, die entweder neue Daten in den Ordner schreiben oder Daten vom Ordner auf den Server verschieben.Warte auf das Entfernen von Dateien nach dem Schließen

Auf diese Weise kann eine Löschaufgabe manchmal eine Datei löschen, die gerade von einem anderen Thread auf die Festplatte geschrieben wird.

kann ich irgendwie verhindern, dass die Datei während des Schreibvorgangs entfernt wird. Ich kann eigene Mechanismen implementieren (mit Flags, Locks, etc ...), aber ich glaube, es sollte Dateisystem-Eigenschaft sein.

Ich habe den folgenden Code versucht, um zu überprüfen, ob das Entfernen fehlschlägt der Datei noch geöffnet ist, aber es tatsächlich erfolgreich ist.

#include <stdio.h> 
int main() { 
    FILE *fp; 
    fp=fopen("./x", "w"); 
    fprintf(fp, "Testing...\n"); 
    if(remove("./x") != 0) 
     perror("Error deleting file"); 
    else 
     puts("File successfully deleted"); 
    return 0; 
} 

Wie kann ich Datei vor dem Löschen enforce geschlossen?

+0

Dies könnte Sie interessieren [http://stackoverflow.com/questions/230062/whats-the-best-way-to-check-if-a-file-exists-in-c-cross-platform] . – sjsam

+0

Vielleicht können Sie sich [diese SO-Post] (http://stackoverflow.com/questions/5769785/removing-a-file-in-c) und die [man page] (http://linux.die) ansehen .net/man/3/entfernen). – user3078414

Antwort

1

Verwenden Sie den Befehl lsof, um zu überprüfen, welche Dateien geöffnet sind. (lsof - Liste geöffnete Dateien)

Zum Beispiel können Sie lsof mit -F p aufrufen und es wird Ausgabe der pid der Prozesse mit dem Präfix 'p':

$ lsof -F p /some/file 
p1234 
p4567 

Siehe: lsof man page

+0

Hallo, das ist eine gute Methode. Ich brauche es jedoch programmgesteuert. vielleicht wissen Sie von C/C++ api, um zu überprüfen, ob eine Datei geöffnet ist? – Zohar81

+0

Lesen Sie den Abschnitt ** Ausgabe für andere Programme ** auf der [man-Seite] (https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man8/lsof.8.html). . Es besagt, dass Sie einen Header 'lsof_fields.h' benötigen. –

0

Sie können verhindern, dass chattr (Siehe: https://en.wikipedia.org/wiki/Chattr) gelöscht wird. Lesen Sie die Eigenschaft "unveränderbar".

+0

Hallo, vielen Dank für Ihren Vorschlag. Ich frage mich jedoch, ob es eine Möglichkeit gibt, das Attribut 'unveränderlich' mit C/C++ - API direkt beim Öffnen der Datei zu setzen. Darüber hinaus scheint es, dass immautable korrekt auch auf dem Setter durchgesetzt wird, und ich möchte weiterhin in die Datei schreiben und nur das Löschen verhindern. – Zohar81