Quel est le point d'avoir un key_t si ce qui sera la clé pour accéder à la mémoire partagée est la valeur de retour de shmget ()?
Lors de l'utilisation de la mémoire partagée, pourquoi devrions-nous nous préoccuper de la création d'une clé
key_t ftok(const char *path, int id);
dans le code suivant?
key_t key;
int shmid;
key = ftok("/home/beej/somefile3", 'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);
De ce que je viens de comprendre, ce qui est nécessaire pour accéder à une donnée en mémoire partagée est la shmid
pas la clé. Ou je me trompe? Si ce que nous avons besoin est la shmid
qu'est-ce que le point n'est pas simplement la création d'une clé aléatoire à chaque fois?
Modifier
@Beej Guide d'Unix à l'IPC on peut lire:
À propos de cet
key
non-sens? Comment faire
nous en créer un? Eh bien, puisque le type
key_t
est en fait juste unlong
vous pouvez
utiliser n'importe quel nombre que vous voulez. Mais que faire si
vous coder en dur le numéro
autre programme, le code en dur
même numéro, mais veut une autre file d'attente?
La solution est d'utiliser laftok()
la fonction qui génère une clé de
deux arguments.
Cette lecture, il me donne l'impression que ce que l'on doit attacher à une mémoire partagée bloc est la clé. Mais ce n'est pas vrai, est-il?
source d'informationauteur devoured elysium
Vous devez vous connecter pour publier un commentaire.
Oui, vous devez utiliser le shmid pour accéder à la mémoire partagée (à l'aide de
shmat()
) après que vous avez ouvert à l'aide deshmget()
. Mais le bloc de mémoire partagée que vous aurez accès est basé sur la touche que vous êtes à l'aide de différents processus qui souhaitent communiquer par le biais de la shm devez utiliser la même clé. Si vous venez d'utiliser un nombre aléatoire comme une clé, vous pourriez recevoir un choc avec un autre programme sans rapport.J'allais vous suggérons de prendre un coup d'oeil à Beej Guide de l'IPC mais je vois que vous avez déjà trouvé 🙂
L'ensemble de l'IPC System V système est plein de mauvaises conceptions de ce genre. (Par de mauvais dessins, je veux dire un petit espace de noms pour les ressources partagées où vous devez compter sur des trucs stupides comme
ftok
pour obtenir une clé et prie pour que cela n'arrive pas à entrer en conflit avec d'autres touches à utiliser.)Si possible, j'aimerais faire semblant que ça n'existe pas et l'utilisation de la mémoire partagée POSIX au lieu de cela chaque fois que possible (et même des threads POSIX primitives de synchronisation à la place de System V sémaphores). Le seul exemple que je peux penser de l'endroit où vous avez besoin de mémoire partagée System V est pour le X à mémoire partagée de l'image de l'extension et peut-être d'autres X extensions.
Edit: afin de mieux répondre À l'OP de la question sur le but de
ftok
:key_t
est généralement de 32 bits et oui, vous pouvez juste choisir un nombre de 32 bits vous-même, mais le problème est que les humains ne sont pas aussi susceptibles de ramasser tous les numéros, et que le risque de collision est trop élevé.ftok
vous permet de choisir un fichier (destiné à être un unique, à votre demande) et un entier de hachage et de l'inode du fichier numéro de votre choix entier, ce qui devrait avoir beaucoup plus la répartition des décisions clés sur la touche espace. Bien sûr, vous pourriez tout aussi bien choisir une clé avecrand
aussi longtemps que vous avez une façon de passer le résultat à d'autres processus qui ont besoin de fixer la mémoire partagée.shmid
valeurs ne sont valables que dans le contexte d'un processus unique, alors que la mêmekey_t
valeur dans différents processus leur permettra d'ouvrir le même segment de mémoire partagée.C'est pourquoi vous avez besoin d'un
key_t
- comme un processus croisé façon de nommer un segment de mémoire partagée. Comme pourftok()
comme les autres réponses ont noté, qui est utilisée pour réduire la probabilité que deux sans rapport avec groupes de processus à l'aide de la mêmekey_t
valeur.