Comment serrer dans les paramètres supplémentaires à une fonction reaper lorsqu'un parent est signalé à tuer un enfant (c)?

StackOverflow https://stackoverflow.com/questions/4399801

Question

J'écris un serveur TCP qui fonctionne très bien comme un chatroom et suis tombé sur cette question.

Lorsqu'un utilisateur se connecte, un processus enfant est créé pour servir l'utilisateur.
Lorsqu'un utilisateur se connecte, je stocke son nom d'utilisateur dans un fichier texte, online.txt
Mais lorsqu'un utilisateur se déconnecte, je dois supprimer l'utilisateur de online.txt (problème), le parent signals alors un reaper() et tue l'enfant.

Mes questions sont les suivantes:

Q1: Comment puis-je serrer dans des informations supplémentaires pour le moissonneur (comme le nom d'utilisateur que l'utilisateur utilisé pour se connecter) afin qu'il puisse également supprimer l'utilisateur de online.txt? Ou est-il une autre meilleure méthode pour le faire?

Q2: où sig en reaper() obtient sa valeur de? Puis-je ajouter des paramètres supplémentaires au faucheur?

Q3: Puis-je utiliser le pid de l'enfant comme une sorte de clé primaire pour login.txt? Si oui, comment puis-je récupérer le pid pendant reaper() de l'enfant, qui est appelé par le parent?

Les regards reaper comme ceci:

void    reaper(int sig)//where does sig come from?
{
int status;

while (waitpid(-1, &status, WNOHANG) >= 0)
    ;
}

Le signal utilisé par les regards des parents comme ceci:

(void) signal(SIGCHLD, reaper);//how can I add more parameters?

Merci d'avance, je l'espère poser 3 questions à la fois pas trop gourmand.
Toute idée sur l'une des questions sera grandement appréciée.

Était-ce utile?

La solution

Pour autant que je peux recueillir de votre question, les registres de processus parent moissonneur () en tant que gestionnaire pour SIGCHLD. Lorsqu'il détecte une connexion, il écrit le nom d'utilisateur de fichier et génère un enfant.

Sur la fonction moissonneur se déconnecter () est appelée parce que le processus de l'enfant a détecté la déconnexion et ainsi quitté, non?

Si oui, pourquoi pas seulement le serveur maintenir un mappage de structure de données PID pour nom d'utilisateur. Ensuite, prendre la valeur de retour de waitpid et identifier le nom d'utilisateur doit être supprimé à partir du fichier.

Donc, pour résumer:

1) Non Oui.

2) A partir du signal reçu par le gestionnaire. Non.

3) Oui. De la valeur de retour de waitpid ().

Autres conseils

Question 1: Est-ce la configuration d'un gestionnaire de signaux pour votre processus d'enfant pour exécuter une action particulière soit appropriée? Cependant peut-être une meilleure solution serait de ne pas utiliser un fichier, plutôt une en construction de mémoire pour stocker ce que les utilisateurs sont connectés. De cette façon, le moissonneur pourrait simplement supprimer l'entrée de mémoire, ou même le gestionnaire de signal proposé.

Question 2: Je ne suis pas familier avec votre système d'exploitation ou de l'architecture, mais je suppose que SIGCHLD serait passé dans moissonneur (int sig) pour la valeur du paramètre.

Question 3: Obtenir le pid est os spécifique. Pour les types POSIX il est généralement getpid (), de unistd .. Cependant, je me demande si vous voulez vraiment faire cela avec un fichier.

Votre solution peut devenir vulnérable à des conditions de course lorsque vous démarrez la signalisation dans tous les sens ... qui se prête à un risque de sécurité.

aux autres utilisateurs, s'il vous plaît ne hésitez pas à me corriger. Dans la recherche d'une sagesse doit accepter instruction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top