Ich habe ein Problem. Mein Programm erstellt eine gewisse Anzahl von Prozessen im System (Windows). Sie alle müssen einige Daten in eine Datei auf einer Festplatte schreiben. also, ich muss sie synchronisieren ... aber nicht wissen ... genau: mein Programm ruft SetWindowsHook und injiziert eine DLL in vielen Prozessen. und sie alle müssen einige Daten in eine Datei schreibenIn viele Dateien schreiben
Antwort
Windows haben eine Sperre foreach-Datei, wenn also ein Prozess in einer Datei schreiben Windows wird nicht einen anderen schreiben lassen. Mutex ist, was Sie wollen, schützen Sie den Code, wo Sie in die Datei schreiben mit einem.
Die Antwort auf Ihr Problem ist Thread-Synchronisation zu implementieren.
Wenn Sie C# verwenden, können Sie eine Sperre {} Anweisung über Ihren Dateicode schreiben.
Für andere Sprachen müssen Sie eine Monitor- oder Mutex-Klasse zum Synchronisieren verwenden.
Das Synchronisationsobjekt, das über Prozesse hinweg funktioniert, ist ein Mutex.
Verwendung Stream.Synchronized()
Siehe http://msdn.microsoft.com/en-us/library/system.io.stream.synchronized.aspx. Diese Methode funktioniert nur für C#
Einzelsystem Wie David erwähnt, können Sie einen Mutex verwenden, um diese Aufgabe zu erfüllen. In Windows wird dies mithilfe von namens Mutexe und (falls gewünscht) benannten Semaphoren getan.
Die Funktion CreateMutex kann verwendet werden, um den Mutex (durch den ersten Prozess) zu erstellen und ihn durch die anderen Prozesse zu öffnen. Geben Sie in allen Prozessen denselben Wert lpName
an. Verwenden Sie WaitForSingleObject, um den Mutex zu erwerben. Und verwenden Sie ReleaseMutex, um den Besitz aufzugeben.
Ein Beispiel zum Erstellen eines benannten Mutex can be found here.
Wenn eine benannte Semaphore verwenden, können Sie das Gleiche erreichen, indem der Semaphore eine anfängliche Anzahl von 1. Verwenden Sie geben CreateSemaphore es zu schaffen und zu öffnen, WaitForSingleObject
Eigentum zu gewinnen (wie bei einem Mutex) und ReleaseSemaphore aufgeben Eigenleistung.
Mehrere Systeme Der obige Ansatz geht davon aus, dass die Prozesse alle auf demselben System ausgeführt werden. Wenn die Prozesse auf verschiedenen Systemen ausgeführt werden, müssen Sie möglicherweise die auf DVD erwähnte Idee verwenden. Sie können Teile einer Datei sperren und diese als Synchronisierungsmethode verwenden. Zum Beispiel könnten Sie per Konvention 1 Byte bei einem Offset (es kann sogar hinter dem Ende der Datei sein) als eine Art Semaphor sperren. Die Verwendung dieses Mechanismus kann jedoch bedeuten, dass Sie abhängig von den von Ihnen verwendeten Funktionen eine Art effizientes Warten implementieren müssen. Wenn Sie CreateFile und LockFileEx10 verwenden, können Sie die Funktion eine geblockte Wartezeit ausführen lassen, indem Sie LOCKFILE_FAIL_IMMEDIATELY
im Anruf nicht angeben.
Ich musste vor kurzem fast genau das tun (für die Protokollierung in einer einzigen Datei von einer DLL in mehrere Prozesse injiziert).
Verwenden Sie _fsopen()
, um die Datei in jedem Prozess zu öffnen, und verwenden Sie dann einen mutex für die Synchronisierung, um sicherzustellen, dass immer nur ein Prozess in die Datei schreibt.
- 1. Viele-zu-viele-Beziehung lesen und schreiben
- 2. JSONCPP Schreiben in Dateien
- 3. Schreiben in Dateien
- 4. spring 3 viele Dateien hochladen
- 5. Viele Dateien in einem Verzeichnis?
- 6. beste Weg, um viele Dateien in Platten
- 7. Viele Zeilen in eine Datei effizient schreiben
- 8. Java zu viele offene Dateien
- 9. ES6: import viele Dateien
- 10. Kater zu viele Dateien
- 11. Zu viele offene Dateien
- 12. XSLT concat viele Dateien
- 13. Schreiben in Dateien mit MPI
- 14. Dateien nicht in Android schreiben
- 15. Gleichzeitiges Schreiben in mehrere Dateien
- 16. FileStream Vs. System.IO.File.WriteAllText beim Schreiben in Dateien
- 17. Wie viele Dateien in S3 mit Spark
- 18. Schreiben in mehrere Dateien mit Scrapy
- 19. Schreiben von C# Quellcode in Dateien
- 20. Zu viele offene Dateien urllib
- 21. Zipping sehr viele Dateien in r
- 22. Viele Dateien in ImageField-Formular hochladen - Django
- 23. Zu viele offene Dateien in Python
- 24. benötigen viele Dateien in einem Verzeichnis kombinieren
- 25. Viele Commitlog-Dateien mit Cassandra
- 26. Elasticsearch zu viele offene Dateien
- 27. Schreiben in Excel-Dateien in C#
- 28. Emacs Dired viele Dateien umbenennen
- 29. Zu viele offene Dateien AWS
- 30. Python XlsxWriter - Schreiben auf viele Blätter
+1 für mehrere Systeme wie das ist genau ich brauche und sollte gehen für ... –