Ne fourchue enfant les processus utilisent le même sémaphore?
Disons que je crée un sémaphore. Si j'ai la fourche un tas de processus enfants, seront-ils tous encore utiliser le même sémaphore?
Aussi, supposons que je créer une structure avec des sémaphores à l'intérieur et fourchue. Faire tous les processus enfants utilisent toujours le même sémaphore? Si non, serait de stocker cette structure+dans la mémoire partagée, sémaphores permettent à l'enfant à utiliser le même sémaphores?
Je suis vraiment confus au sujet de la façon dont ma fourche processus enfants peuvent utiliser le même sémaphores.
OriginalL'auteur jmnwong | 2011-07-27
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez un SysV IPC sémaphore (
semctl
), alors oui. Si vous êtes à l'aide de sémaphores POSIX (sem_init
), alors oui, mais seulement si vous passez une véritable valeur pour l'argument pshared sur la création et le placer dans la mémoire partagée.Qu'entendez-vous être "sémaphores à l'intérieur"? Les références à SysV IPC sémaphores sera partagé, parce que les sémaphores n'appartiennent pas à n'importe quel processus. Si vous êtes à l'aide de sémaphores POSIX, ou la construction de quelque chose de pthreads mutex et condvars, vous aurez besoin d'utiliser la mémoire partagée, et la pshared attribut (pthreads a un pshared attribut pour condvars et mutex)
Note anonyme mmaps créé avec la
MAP_SHARED
drapeau comte de (anonyme) de la mémoire partagée à ces fins, il n'est donc pas nécessaire de créer effectivement un nom de segment de mémoire partagée. Ordinaire de segment de mémoire ne seront pas partagées après une fourche.J'ai créé mon sémaphore avec sem_init(&p.mysem, 1, 1). Où p est un struct et mysem est un sem_t à l'intérieur de la structure. Est-ce à l'air correct?
la structure doit être placé dans la mémoire partagée (mappé en mémoire à l'aide de mmap est
MAP_SHARED
drapeau), et les sémaphores doit être créé avecsem_init
passant de 1 pour l'pshared drapeau. Si ces conditions sont remplies, le processus enfant partagera le sémaphore correctement.Alors, comment puis-je utiliser mmap avec de la mémoire partagée?
c'est un peu au-delà de la portée de cette question. Il y a beaucoup de ressources sur l'utilisation de mmap pour la mémoire partagée si vous recherchez un peu, et si vous avez encore des problèmes n'hésitez pas à ouvrir une autre question sur le sujet
OriginalL'auteur bdonlan
Il dépend de la façon dont vous avez créé le sémaphore, de le faire avec un IPC de sémaphore voir sémaphore.c: Illustration de la simple sémaphore en passant pour un exemple.
Pour que le travail de votre sémaphore doit être stocké dans un espace partagé entre le parent et l'enfant tel processus de la mémoire partagée, et pas seulement créé sur la pile ou sur le tas, car il sera copié lorsque le processus de fourches.
Le sémaphore peuvent être partagées entre les threads ou processus. Inter-processus de partage est mis en œuvre sur le niveau du système d'exploitation. Deux ou plusieurs processus différents peuvent partager le même sémaphore, même si ces processus n'ont pas été créés par bifurquer un seul processus parent.
Voir cet exemple pour partager une sans nom UNIX sémaphore entre un processus parent et son enfant (pour compiler avec gcc, vous aurez besoin de la
-pthread
drapeau):La sortie sera:
Vous voudrez peut-être lire Les sémaphores sous Linux ainsi, mais il faut être conscient que l'exemple d'UNIX, les sémaphores d'un fork donné ne fonctionne pas parce que l'auteur a oublié d'utiliser la
MAP_ANONYMOUS
drapeau dansmmap
.Si je voulais utiliser de façon anonyme les sémaphores, serait-ce différer grandement de sémaphores IPC?
En effet, vous pouvez utiliser la mémoire partagée pour partager de l'information entre les processus, il suffit de ne pas mettre un sémaphore dans cette mémoire. Allez simplement à travers le premier exemple que j'ai fourni - il ne
fork ()
et les enfants et les parents à travailler avec le même sémaphore sans mémoire partagée. Jeter la mémoire partagée avec les informations que vous souhaitez partager sur haut de cet exemple et vous serez OK.L'utilisation de sans nom sémaphores à travers une fourchette exemple, vous créez un lien dans "les sémaphores sous Linux" est buggé. Vous devez ajouter de l'anonyme d'un drapeau ou d'utiliser les sémaphores nommés.
Cool, avez-vous l'esprit de l'édition de la réponse et d'en faire un wiki de la communauté? De travail exemples de code sont les bienvenus 🙂
OriginalL'auteur
Essayer cette
enfant et les parents incrément de la variable partagée sinon
OriginalL'auteur user997487