2010-12-16 13 views
0

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

1

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.

0

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.

2

Das Synchronisationsobjekt, das über Prozesse hinweg funktioniert, ist ein Mutex.

1

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.

+0

+1 für mehrere Systeme wie das ist genau ich brauche und sollte gehen für ... –

0

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.