Étape 4: Création d’objets IPC
Un objet de mémoire partagée est créé avec shmget tandis qu’un sémaphore utilise semget. Ils ont tous deux besoin d’une clé, drapeaux et une valeur de fonction spécifique. Pour vérifier l’état des objets IPC, que vous créez, vous pouvez saisir une des commandes suivantes de Linux pour mémoire partagée ou sémaphores, respectivement :chat /proc/sysvipc/shmchat /proc/sysvipc/sem
Ces commandes sont très utiles lorsque vous essayez de déterminer si un objet a été créé ou détruit. Il vous permet également de voir la clé et l’ID de l’objet. Cela permet de déboguer le script Python car vous saurez à coup sûr quels objets IPC sont réellement disponibles pour Python à utiliser.
Clés Chaque objet IPC est créé à l’aide d’une clé unique. Pour un simple test, il est acceptable d’utiliser une clé codée en dur, mais au-delà, il est utile de disposer d’une fonction de générer des clés pour vous. SysV fournit la fonction ftok à cet effet. Ses arguments sont une chaîne (qui représente l’emplacement d’un fichier) et int (utilisé pour générer des clés différentes). ftok combine le chemin d’accès et de l’int (bien que seuls les 8 bits les moins significatifs sont utilisés - et doit être différent de zéro) pour générer une clé unique (la plupart du temps). Il y a toujours la possibilité d’appeler ftok avec différents arguments et obtenir la même clé. Certes, la chance est faible, mais une solution robuste doit traiter cette condition. Cela étant dit, ce projet ignore cet État parce qu’il sera bientôt actualisé pour utiliser les fonctions POSIX IPC - qui retournent toujours les clés uniques.
Drapeaux Les drapeaux tenu shmget et semget contrôlent comment il est créé. IPC_CREAT par elle-même crée l’objet s’il n’existe ou tout simplement retourner l’ID de l’objet en cours s’il a déjà été effectué. Options IPC_EXCL avec IPC_CREAT provoquera la fonction d’erreur si l’objet existe déjà. D’ici vous pourriez négocier un moyen de générer une nouvelle clé et essayer et ouvrir cet objet à la place. Vous pouvez également ou dans les autorisations de fichier - 0666 ou 0660 dans ce code. Cela représente les autorisations pour le propriétaire, groupe et d’autres pour cet objet. La valeur 0666 permet tous les trois à lecture/écriture tandis que 0660 n’autorise le propriétaire et le groupe de lecture/écriture.
Dans ce code, j’ai omettre IPC_EXCL surtout parce que si vous avez oublié de détruire les objets de la CIB avant la reprogrammation de la Galilée, les vieux objets IPC persistent. Lorsque la nouvelle esquisse s’exécute avec IPC_EXCL, il verra que les objets de l’IPC ont déjà été créés et erreur. Cela vous laisse pour détruire les objets ou redémarrer le Galileo manuellement. Grâce à IPC_EXCL en laissant de côté ce problème est évité. En outre, étant donné que les seuls programmes de création d’objets IPC sont ceux que vous lancez vous n’aurez à vous soucier d’entrer en collision avec les objets IPC d’un autre processus.
Arguments supplémentaires et initialisation Dans SysV, un objet semaphore est en fait un tableau des sémaphores. Pour plus de simplicité, nous limiterons juste un sémaphore unique de chaque objet. Cela permet également de rendre le code un peu plus lisible. Le deuxième argument de semget est le nombre de sémaphores pour cet objet.
Un objet de mémoire partagée a besoin de savoir sa taille avant la création. Le deuxième argument de shmget est donc la taille de segment de mémoire partagée doit être créé.
La fonction shmat attachera l’objet mémoire partagée à l’espace d’adressage du processus en cours (c'est-à-dire l’esquisse). C’est ce qui permettra l’esquisse lire et écrire le segment de mémoire partagée, comme si c’était juste un autre objet de données créé par l’esquisse. Le pointeur void retourné par shmat doit être coulé, afin que nous puissions fonctionner là-dessus plus tard.
Le sémaphore doit avoir son compteur initialisé à une valeur compatible avec son interprétation dans le code. Par exemple, un sémaphore qui représente la quantité de données est dans une file d’attente (initialement vide) doit être défini à zéro après création. Cela se fait avec la fonction semctl qui prend l’ID du sémaphore, l’index dans le tableau de sémaphore (toujours 0 pour ce code), une commande et un syndicat. L’union contient des données qui peuvent être utilisées par certaines commandes. Ici, nous devons simplement la commande SETVAL qui définit le compteur du sémaphore de l’int au sein de l’union.