Med IPC för trådlös kryptering med Intel Galileo (4 / 10 steg)
Steg 4: Skapa IPC objekt
Ett delat minne-objekt skapas med shmget medan en semafor använder semget. De båda behöver en nyckel, flaggor och ett funktionsspecifikt värde. Om du vill kontrollera status för IPC objekt som du skapar, kan du ange ett av följande kommandon från Linux för delat minne eller semaforer, respektive:cat /proc/sysvipc/shmcat /proc/sysvipc/sem
Dessa kommandon är mycket användbar när du försöker avgöra när ett objekt har skapats eller förstörs. Du kan också se nyckel och ID för objektet. Detta hjälper felsökning Python skript eftersom ni vet säkert vilka IPC objekt finns faktiskt för Python att använda.
Nycklar Alla IPC objekt skapas med en unik nyckel. För ett enkelt test är det acceptabelt att använda en hårdkodad nyckel men utöver det är det bra att ha en funktion generera nycklar för dig. SysV innehåller funktionen ftok för detta ändamål. Argumenten är en sträng (som representerar platsen för en fil) och en int (används för att generera olika nycklar). ftok kombinerar sökvägen och int (även om bara de minst signifikanta 8 bitarna används - och måste vara noll) för att generera en unik nyckel (för det mesta). Det finns fortfarande möjlighet att ringa ftok med olika argument och få samma nyckel. Visst, chansen är liten men en robust lösning måste hantera detta villkor. Som sagt, ignorerar detta projekt detta villkor eftersom det kommer snart att uppdateras för att använda POSIX IPC funktioner - som returnerar alltid unika nycklar.
Flaggor Flaggorna shmget och semget styr hur den skapas. IPC_CREAT i sig kommer att skapa objektet om det inte finns eller helt enkelt returnera ID för det aktuella objektet om det redan har gjorts. OR'ing IPC_EXCL med IPC_CREAT kommer att orsaka att funktionen fel om objektet finns redan. Härifrån kan du förhandla fram ett sätt att skapa en ny nyckel och prova och öppna objektet i stället. Du kan också eller i filrättigheter - 0666 eller 0660 i denna kod. Detta representerar behörigheterna för ägare, grupp och andra för det här objektet. Värdet 0666 kan alla tre att läsa/skriva medan 0660 tillåter endast ägare och grupp att läsa/skriva.
I den här koden utelämna jag IPC_EXCL mestadels eftersom om du glömmer att förstöra IPC objekten innan omprogrammering Galileo, de gamla IPC objekt kvar. När den nya skissen kör med IPC_EXCL ser det att IPC objekten redan har skapats och kommer fel. Detta nu lämnar du för att manuellt förstöra objekt eller starta om Galileo. Genom att lämna IPC_EXCL ut problemet undviks. Också, eftersom de enda program skapa IPC objekt är sådana du lanserar du inte behöver oroa kolliderar med en annan process IPC objekt.
Ytterligare argument och initiering I SysV är en semafor-objekt faktiskt en matris med semaforer. För enkelhetens skull kommer vi att begränsa varje objekt till bara en enda semafor. Detta hjälper också göra koden mer läsbar. Det andra argumentet för semget är antalet semaforer för det här objektet.
En delade minnesobjektet behöver veta dess storlek innan skapelsen. Därför är det andra argumentet för shmget storleken på de delat minnessegmentet skapas.
Funktionen shmat fäster det delade minnesobjektet vid adressutrymmet till den aktuella processen (dvs. skissen). Detta är vad gör att skissen att läsa och skriva från det delat minnessegmentet som om det vore bara en annan dataobjekt skapad av skissen. Void pekaren returneras av shmat måste vara gjuten så att vi kan fungera på det senare.
Semaforen måste dess räkna initieras till ett värde som överensstämmer med dess tolkning i koden. Till exempel ska en semafor som motsvarar hur mycket data är (inledningsvis tom) kö anges till noll efter skapelsen. Detta görs med funktionen semctl som tar den semaphore ID, index i matrisen semafor (alltid 0 för denna kod), ett kommando och en union. Unionen innehåller data som kan användas av vissa kommandon. Här behöver vi bara kommandot SETVAL som sätter den semaphore räknas lika med int inom unionen.