2012-11-14 5 views
0

Je suis actuellement en train de coder un serveur web pour mieux connaître les processus et la communication interprocessus. Quand un fichier est demandé, je le verrouille pour m'assurer qu'il n'y a pas de changements au fichier pendant la lecture/écriture. Cela fonctionne bien. Mon problème est de savoir comment puis-je effacer le verrou de la mémoire après l'exécution du processus démon. Je sais que les sémaphores restent après que le processus qui les a créés a cessé d'être exécuté. Je sais que le rejet du sémaphore doit être fait dans le parent mais les sémaphores sont créés dans l'enfant, ce qui signifie qu'il n'y a pas de références dans le parent. Donc, fondamentalement, cela revient à ceci: existe-t-il un moyen de référencer les sémaphores créés pendant les processus fils afin que je puisse rejeter le sémaphore dans le gestionnaire de sortie lorsque le démon est arrêté? Je n'ai pas de code à partager parce que je ne sais vraiment pas comment cela peut être fait. Je code en C sur un système Linux. Merci pour toute aide!Libération de sémaphores dans un processus démon

Répondre

0
SemId = semget(IPC_PRIVATE, n, 0600); 

Vous utilisez certainement ceci pour créer les sémaphores. Ici, le n est le nombre de sémaphores.

SemId peut être dans la mémoire partagée.

Cela vous permettrait d'effacer les sémaphores dans le parent.

Si vous souhaitez éviter la création de la variable globale et d'obtenir les sémaphores du parent ou de l'utilisation de la variable dans la mémoire partagée, avant de quitter un enfant, vous pouvez certainement utiliser:

semctl(SemId, 0, IPC_RMID, 0); 

Le la mémoire partagée doit être faite dans le parent et peut être fait en utilisant:

ID = shmget(IPC_PRIVATE, sizeof(int) * X, 0600); 

La taille de la mémoire partagée est définitivement votre choix.

SemId = (int *) shmat(ID, NULL, 0); 

Ce attribuerait l'espace pour le SemId. Après avoir quitté l'enfant parent peut (ou tout autre enfant) accéder à cette variable et supprimer les sémaphores en utilisant le semctl ci-dessus.

Vous devez déclarer int *SemID en tant que variable globale. Donc, si la création de sémaphores, la fonction semget est utilisée, vous pouvez simplement renvoyer sa valeur au SemId comme indiqué ci-dessus.

Si vous décidez d'utiliser l'option de mémoire partagée, vous devez vous rappeler de supprimer l'espace attribué de cette mémoire en utilisant:

shmdt((void *) SemId); 
    shmctl(ID, IPC_RMID, NULL); 
+0

merci bien. Je crée un sémaphore pour chaque fichier auquel j'accède donc, je pourrais avoir autant de sémaphores que de fichiers dans le répertoire donné (tous créés à des moments différents) effacer le semid suffirait à effacer tous les sémaphores des enfants s'ils sont créés séparément? – tpar44

+0

S'il y a plusieurs sémaphores, cela signifie que vous avez plusieurs 'SemId' différents. Ce qui signifie que vous devrez appeler 'semctl' pour chaque fichier. La solution la plus simple serait de connaître le nombre de fichiers et d'obtenir le nombre de sémaphores égal au nombre de fichiers dans le parent. Si vous testez, utilisez 'ipcs -s num' et ' ipcrm -s' pour effacer tout s'ils sont laissés. –

+0

En fait, quand j'y pense, il suffit de réécrire le 'SemId' en créant de nouveaux sémaphores, donc je suppose que parfois vous ne pourrez pas les supprimer. Etes-vous sûr de ne pas pouvoir utiliser un seul sémaphore? –

Questions connexes