Stap 4: IPC-objecten maken
Een gedeeld geheugen-object is gemaakt met shmget, terwijl een semafoor semget gebruikt. Beiden moeten een sleutel, vlaggen en één functie-specifieke waarde. Om te controleren op de status van IPC-objecten die u maakt, kunt u een van de volgende opdrachten van Linux voor gedeeld geheugen of semaforen, respectievelijk:kat /proc/sysvipc/shmkat /proc/sysvipc/sem
Deze opdrachten zijn zeer nuttig wanneer je probeert om te bepalen wanneer een object is gemaakt of vernietigd. Ook u kunt de sleutel en de ID van het object te zien. Dit helpt de Python-script debuggen aangezien u zeker welke IPC-objecten zijn daadwerkelijk beschikbaar voor Python weet te gebruiken.
Toetsen Elke IPC-object is gemaakt met behulp van een unieke sleutel. Bij een eenvoudige test is het aanvaardbaar een hard gecodeerde sleutel wilt gebruiken, maar buiten dat is het nuttig te beschikken over een functie voor het genereren van sleutels voor u. SysV voorziet de ftok functie voor dit doel. De argumenten zijn een string (de locatie van een bestand) en een int (gebruikt om andere sleutels te genereren). ftok combineert de padnaam en de int (hoewel alleen de minst significante 8 bits worden gebruikt - en moet niet-nul zijn) voor het genereren van een unieke sleutel (de meeste van de tijd). Er is nog steeds de mogelijkheid om te bellen ftok met verschillende argumenten en krijgen dezelfde sleutel. Toegegeven, de kans is klein maar een robuuste oplossing moet omgaan met deze voorwaarde. Dat gezegd zijnde, negeert dit project deze voorwaarde omdat het zal spoedig worden bijgewerkt voor het gebruik van de functies van de POSIX IPC - die altijd unieke sleutels zal terugkeren.
Vlaggen De vlaggen gegeven aan shmget en semget bepalen hoe het wordt gemaakt. IPC_CREAT door zelf zal het object maken als het niet bestaat of de ID van het huidige object gewoon te retourneren als het al is geboekt. OR'ing IPC_EXCL met IPC_CREAT veroorzaakt de functie fout als het object al bestaat. Hiervandaan kan u onderhandelen over een manier om een nieuwe sleutel genereren en proberen en in plaats daarvan het betreffende object openen. U kunt ook of in bestandsmachtigingen - 0666 of 0660 in deze code. Dit vertegenwoordigt de machtigingen voor de eigenaar, groep en anderen voor dit object. De waarde 0666 kan alle drie te lezen/schrijven terwijl 0660 kan alleen de eigenaar en de groep lezen/schrijven.
In deze code weglaten ik IPC_EXCL vooral omdat als u de IPC-objecten vernietigen vergeet voordat de herprogrammering van de Galileo, de oude voorwerpen van IPC aanhouden. Wanneer de nieuwe schets wordt uitgevoerd met IPC_EXCL zal het zien dat de IPC-objecten al zijn gemaakt en zal fout. Dit nu verlaat u handmatig de objecten vernietigen of opnieuw opstarten van het Galileo. Door het weglaten van IPC_EXCL van dit probleem wordt voorkomen. Ook, aangezien de enige programma's maken van IPC-objecten zijn degenen die u lanceert hoeft u niet te vrezen botsing met een ander proces van IPC objecten.
Extra argumenten en initialisatie In SysV is een semafoor-object eigenlijk een array van semaforen. Om redenen van eenvoud zullen we elk object dat u wilt slechts een enkele semafoor beperken. Dit helpt ook de code een beetje leesbaarder maken. Het tweede argument van de semget is het aantal semaforen voor dit object.
Een object gedeeld geheugen moet weten de grootte voor de schepping. Daarom is het tweede argument van de shmget de grootte van het gedeelde geheugen segment moet worden gemaakt.
De shmat functie zal het gedeelde geheugen-object koppelen naar de adresruimte van het huidige proces (dat wil zeggen de schets). Dit is wat de schets lezen en schrijven uit het gedeelde geheugen segment alsof het gewoon een ander gegevensobject, gemaakt door de schets zal toestaan. De void aanwijzer geretourneerd door shmat moet worden gegoten zodat we op het later werken kunnen.
De semafoor moet het aantal geïnitialiseerd op een waarde die consistent is met de interpretatie ervan in de code. Bijvoorbeeld, moet een semafoor die aangeeft hoeveel gegevens bevinden zich in een (aanvankelijk leeg) wachtrij worden ingesteld op nul na oprichting. Dit wordt gedaan met de semctl functie waarin van de semafoor ID, de index in de array van de semafoor (altijd 0 voor deze code), een opdracht en een Unie. De Unie bevat gegevens die kunnen worden gebruikt door bepaalde opdrachten. We moeten hier alleen de SETVAL opdracht waarin van de semafoor graaf gelijk is aan de int binnen de Unie.