Bonjour,
Voici mon problème (qui n'est pas vraiment un problème mais plutôt un choix de conception).
J'ai deux processus tournant sur une même machine. Ces deux processus n'ont pas de lien de parenté a priori (l'un n'est pas issue d'un fork de l'autre).
Je dois ouvrir un segment de mémoire partagée entre ces deux processus.
La technique habituelle est la suivante :
Dans le premier processus:
1) créer une clef k avec la fonction ftok() en lui donnant en paramètre un nom de fichier et un identifiant de projet.
2) à partir de la clef k, créer un segment de mémoire partagé identifié par l'entier id (shmget)
3) à partir de l'id, récupérer le pointeur sur cette mémoire (shmat)
Dans le second processus:
1) créer la clef k avec la fonction ftok en utilisant les mêmes arguments que dans le premier processus, on récupère ainsi la même clef.
2) à partir de k, récupérer l'id du segment de donnée (shmget)
3) à partir de l'id, récupérer le pointeur
Même si c'est la manière classique et habituelle de procéder, ce genre de génération de clef ne me plait pas, de plus je rencontre des problèmes de permissions d'accès au segment de mémoire lorsque je ne lances pas les processus en root.
J'ai donc fait la chose suivante :
Dans le premier processus:
1) utilise IPC_PRIVATE comme clef lors de la création du segment. Je récupère un id.
2) créer le segment de mémoire à partir de cet id, comme précédemment.
3) envoyer l'id au second processus (les deux processus sont des jobs MPI tournant sur la même machine, je peux le faire très simplement en utilisant MPI_Send et MPI_Recv).
Dans le second processus:
1) attendre (MPI_Recv) que le premier processus envoie l'id
2) récupérer (shmget) un pointeur sur le segment à partir de cet id.
Avec cette solution, pas de problème de permission, ni de génération de clefs utilisant un nom de fichier et un identifiant de projet.
Cela fonctionne.
Ma question : ... est-ce propre ? Est-ce que ça fonctionnera toujours ou est-ce que c'est un coup de bol du à certains paramètres cachés ?
Merci !
Partager