9
votes

Les processus enfants fourchus utilisent-ils le même sémaphore?

Disons que je crée un sémaphore. Si je fourche un tas de processus d'enfant, ils utilisent-ils tous toujours ce même sémaphore?

En outre, supposons que je crée une structure avec des sémaphores à l'intérieur et fourchue. Tous les processus de l'enfant utilisent-ils toujours ce même sémaphore? Sinon, stockerait que Sild + Semaphores dans la mémoire partagée permettrait aux processus d'enfant d'utiliser les mêmes sémaphores?

Je suis vraiment confus sur la façon dont mes processus enfants fourrants peuvent utiliser les mêmes sémaphores.


0 commentaires

3 Réponses :


8
votes

Disons que je crée un sémaphore. Si je fourche un tas de processus enfants, vont-ils tous toujours utiliser ce même sémaphore?

Cela dépend de la façon dont vous avez créé le sémaphore, de le faire avec une sémaphore IPC voir SEMAPHORE.C: Illustration de Simple Semaphore Passant pour un exemple.

En outre, supposons que je crée une structure avec des sémaphores à l'intérieur et fourchue. Faire Tous les processus enfants utilisent toujours ce même sémaphore? Sinon, serait stocker cette structure + sémaphores dans la mémoire partagée permet à l'enfant Processus à utiliser les mêmes sémaphores?

Pour que votre sémaphore doit être stocké dans une zone partagée entre le parent et le processus enfant comme la mémoire partagée, et non seulement créé sur la pile ou sur le tas, car il sera copié lorsque le Processus Forks.

Je suis vraiment confus sur la façon dont mes processus enfants fourrés peuvent utiliser le mêmes sémaphores.

Le sémaphore peut être partagé sur des threads ou des processus. Le partage transfrontalier est mis en œuvre sur le niveau du système d'exploitation. Deux processus différents ou plus peuvent partager le même sémaphore, même si ces processus n'ont pas été créés en faisant la création d'un processus monoparental.

Voir cet exemple pour partager un sémaphore UNIX UNIX entre un processus parent et son enfant (pour compiler Avec GCC, vous aurez besoin du drapeau -pthread ): xxx

La sortie sera la suivante: xxx

Vous voudrez peut-être lire Semaphores Sous Linux également, mais sachez que l'exemple des sémaphores Unix à travers la fourche donnée ne fonctionne pas car l'auteur a oublié d'utiliser le drapeau drapeau dans MMAP .


11 commentaires

Donc, si je veux que les enfants fourchus partagent un sémaphore, ils doivent être des sémaphores IPC. Puis-je stocker ces sémaphores dans une structure et transmettre à différentes fonctions? Je suis confus à propos de votre deuxième point car je souhaite utiliser la mémoire partagée pour transmettre des informations entre les processus d'enfants et les protéger avec ces sémaphores.


Si je voulais utiliser spécifiquement des sémaphores sans nom, cela diffère-t-il grandement des sémaphores IPC?


@Canistry: Vous pouvez en effet utiliser la mémoire partagée pour partager des informations entre les processus, ne mettez tout simplement pas un sémaphore dans cette mémoire. Il suffit d'aller au creux le premier exemple que j'ai fourni - il fait Fourche () et un travail des enfants et des parents avec le même sémaphore sans mémoire partagée. Jetez la mémoire partagée avec les informations que vous souhaitez partager sur le dessus de cet exemple et vous irez bien.


@Canistry: Utilisez SEM_INIT pour initialiser les sémaphores Sans nom, cela devrait faire le travail. Voir la page de l'homme pour une belle description - noyau .org / doc / man-pages / en ligne / pages / man3 / sem_init.3.html


@Vlad, sémaphores peuvent être partagés dans la mémoire partagée si vous transmettez les arguments frontaux appropriés; Voir ma réponse pour les références


Merci pour votre aide jusqu'à maintenant. Je viens de réaliser que je devais utiliser Posix Semaphores. Je sais que je continue à poser la même question stupide, mais même avec Posix Semaphores, les processus enfants forcés verront toujours le même ensemble de sémaphores corrects? À l'heure actuelle, j'ai plusieurs processus enfants qui ont été fourchus, puis appellent une autre fonction. Dans ces fonctions, j'utilise les sémaphores pour protéger la mémoire partagée qui partage des informations entre les fonctions appartenant à des processus distincts. Je veux juste être sûr qu'ils utilisent les mêmes sémaphores et qu'ils n'utilisent pas tous leurs propres versions.


@Canistristry, jetez un coup d'œil à ma réponse, je couvre spécifiquement les sémaphores Posix


L'utilisation de sémaphores sans nom sur un exemple de fourche que vous liez dans "Semaphores de Linux" est buggé. Vous devez soit ajouter le drapeau anonyme, soit utiliser des sémaphores nommés.


@ Étienne: Cool, Ça vous dérange de modifier la réponse et de la faire un wiki communautaire? Les exemples de code de travail sont les bienvenus :)


@Vladlazarenko: J'ai posté un exemple de code de travail comme réponse, car je ne peux pas transformer votre wiki post-communauté, et je ne voulais pas que mon édition soit rejetée. (Je pense que vous êtes le seul à pouvoir transformer vos postes communautaires Wiki). N'hésitez pas à intégrer mon message dans le vôtre si vous souhaitez la transformer en wiki communautaire, je supprimerai ma réponse alors.


Voulez-vous laisser les deux réponses séparer ou les fusionner dans un wiki communautaire?



11
votes

Disons que je crée un sémaphore. Si je fourche un tas de processus d'enfant, ils utilisent-ils tous toujours ce même sémaphore?

Si vous utilisez un SYSV IPC SEMAPHORE ( EMCTL ), oui. Si vous utilisez POSIX SEMAPHORES ( SEM_INIT ), alors oui, mais Seulement si vous passez une valeur réelle pour l'argument frontal sur la création et placez-la dans la mémoire partagée.

En outre, supposons que je crée une structure avec des sémaphores à l'intérieur et fourchue. Tous les processus de l'enfant utilisent-ils toujours ce même sémaphore? Sinon, stockerait que Sild + Semaphores dans la mémoire partagée permettrait aux processus d'enfant d'utiliser les mêmes sémaphores?

Que voulez-vous dire être des "sémaphores à l'intérieur"? Les références à SYSV IPC Semaphores seront partagées, car les sémaphores n'appartiennent à aucun processus. Si vous utilisez des sémaphores Posix ou construisez quelque chose à partir de Pthreads Mutilex et Condvars, vous devrez utiliser une mémoire partagée, et l'attribut Pshared (Pthreads a un attribut pslaréde pour Condvars et Mutilexs aussi bien)

Notez que les MMAP anonymes créés avec la mémoire partagée (anonyme) par rapport à la mémoire partagée (anonyme) correspondent à la mémoire partagée (anonyme) à ces fins, il n'est donc pas nécessaire de créer un segment de mémoire partagé nommé. la mémoire de tas ordinaire ne sera pas partagée après une fourchette .


6 commentaires

Pour clarifier, j'ai créé une structure et à l'intérieur de la structure, j'ai mis mes sémaphores Posix. Ensuite, j'ai mis cette structure dans la mémoire partagée. Ce faisant, puis-je supposer que tous mes processus enfants accèdent correctement aux mêmes sémaphores?


J'ai créé mon sémaphore avec SEM_INIT (& P.MYSEM, 1, 1). Où p est une structure et mysem est un SEM_T à l'intérieur de la structure. Cela a-t-il l'air correct?


@Canistristry, la structure doit être placée dans la mémoire partagée (mémoire mappée à l'aide du drapeau MAP_Shared MAP_SHARD SEMAPHORES) et les SEMAPHORES doivent être créés avec SEM_INIT Passant 1 pour le drapeau frontal. Si ces conditions sont satisfaites, les processus enfants partageront correctement le sémaphore.


Alors, comment puis-je utiliser MMAP avec une mémoire partagée?


@Canistry, c'est un peu au-delà de la portée de cette question. Il existe de nombreuses ressources sur l'utilisation de MMAP pour la mémoire partagée si vous recherchez un peu un peu, et si vous avez toujours des problèmes, n'hésitez pas à ouvrir une autre question sur le sujet.


Pour faire un MMAP anonyme, on a également besoin du drapeau map_anonyme. Sinon, la mémoire n'est pas partagée à travers la fourchette mais copiée et le processus parent et enfant fonctionnera sur deux sémaphores différents.



-1
votes

Essayez ceci

​​enfant et parent incrémenterait la variable partagée alternativement xxx


1 commentaires

-1: Vous avez copié ce code de LinuxDevCenter.com/pub/a/Linux/2007/05/24/... sans mentionner que ce n'était pas le vôtre. De plus, ce code ne fonctionne pas! Voir blog.superpat.com/2010/ 07/14 / ... pour l'explication.