Stap 5: De functies van de Open/Close
Open In de methode open, vier sleutels worden gemaakt met verschillende bestanden en de opgegeven ID (moet niet-nul) wanneer dit exemplaar van de IPCBuffer is gemaakt. Dit staat slechts 255 IPCBuffer objecten die kunnen worden gebruikt in een keer.
De buffer die wordt gebruikt om te houden van de gegevens tussen de Python en schets van processen wordt bepaald door de breedte en lengte. Breedte is het aantal bytes die deel van één enkele toegelaten eenheid gegevens uitmaken. Bijvoorbeeld, codeert AES gegevens in op 16-byte blokken, zodat de breedte zou 16. Het zinvol niet in dit geval om een proces te lezen meer of minder dan 16 bytes op een moment, aangezien de gegevens onvolledig zou zijn. We zullen later zien waarom we niet toestaan dat een proces te lezen of schrijven van meer dan één breedte de waarde van de gegevens tegelijk.
De lengte van de buffer is hoeveel eenheden van gegevens daarin kan worden opgeslagen. Dus als de buffer 5 AES blokken bevatten kan, de lengte 5 worden zou en zou de totale omvang in bytes (16 bytes) * 5 = 80 bytes. Om een proces te weten waar het moet lezen of schrijven vervolgens in de buffer, moeten we een kop en staart index. Gegevens worden geschreven naar de buffer aan het hoofd en gelezen van de staart. Deze vier stukken van gegevens moeten worden geplaatst aan het begin van het gedeelde geheugen segment. Anders is de Python-script zou niet weten hoe groot de buffer is of waar het moet lezen of schrijven van gegevens. De bovenstaande afbeelding ziet u hoe een gedeeld geheugen segment zou worden opgezet voor een breedte van 2 en lengte van 4.
De semafoor vertegenwoordigen de vrije ruimte in de buffer wordt geïnitialiseerd als 'lengte' en de semafoor voor hoeveel geldige gegevens in de buffer is ingesteld op 0. Een derde semafoor, sem_lock, is ingesteld op 1 zodat we slechts een enkel proces te lezen of schrijven van het gedeelde geheugen segment tegelijk. Zonder dit slot zou de code niet veilig zijn met meerdere lezers en schrijvers.
Nauwe De methode close vernietigt gewoon de huidige IPC-objecten. shmdt: Hiermee wordt het gedeelde geheugen segment losgekoppeld en shmctl (die heeft vergelijkbare argumenten aan semctl) markeert het segment moet worden verwijderd. Wanneer geen meer processen zijn aangesloten het willl worden verwijderd. Op dit punt wordt de sleutel weergegeven als 0 in /proc/sysvipc/shm van de kat. Na het aanroepen van semctl te verwijderen van de semaforen die ze zullen onmiddellijk worden verwijderd en kat zal /proc/sysvipc/sem niet meer laten zien