Signaler

Vérifier que mon fils est en vie avant de lui donner des ordres [Résolu]

Posez votre question astrocurieux 143Messages postés mardi 24 février 2015Date d'inscription 16 mai 2017 Dernière intervention - Dernière réponse le 6 mars 2017 à 12:40 par astrocurieux
Hello,

j'ai un semblant de serveur qui fait un fork(), et qui gère dans un processus fils les tache demander par le client qui viens s'y connecter tout bêtement.

le truc c’est que j'aimerais que mon serveur soit en mesure de s'assure en tout temps que son processus fils et donc son client est toujours vivant. je gère cela avec deux terminaux pour le moment l'un serveur l'autre client, si je fait ctrl+c sur mon client, mon serveur continue de le considérer en vie.

utiliser signal peut être ? mais comment ?

merci de votre aide
Afficher la suite 
Utile
+0
plus moins
bonsoir,
si je comprends bien, tu as sur ton serveur un processus parent et des processus fils.
chaque processus fils est en communication avec un processus exécuté sur une poste client.
que se passe-t-il quand tu arrêtes le processus client? le processus fils s’arrête-t-il sur le serveur, sans que le processus parent le remarque?
en d'autres mots, quel est ton soucis? le fait que le parent ne se rende pas compte que le fils est mort, ou bien que le fils ne se rende pas compte que le client est parti?
123guitare 26Messages postés mardi 24 mai 2016Date d'inscription 5 avril 2017 Dernière intervention - 1 mars 2017 à 12:20
Oups, je me suis planté. le pid est = à 0 pour le fils et différent de 0 pour le père. ALors la ligne 18 c'est :
if (pid == 0) 
Répondre
astrocurieux 143Messages postés mardi 24 février 2015Date d'inscription 16 mai 2017 Dernière intervention - 1 mars 2017 à 12:43
voila qui deviens fort intéressant.

je savait bien qu'il y avait quelque chose du coté de signal.
je teste cela sur mon code tout de suite.

EDIT : ta corriger ton erreur trop vite ^^

et comment faire pour passer deux paramètres a finFils() ? je doit utiliser une structure pour traiter la mort de mon fils ...

je vous tiens au courant. merci
Répondre
astrocurieux 143Messages postés mardi 24 février 2015Date d'inscription 16 mai 2017 Dernière intervention - 1 mars 2017 à 14:09
je viens de tester en adaptant le tout a mon code, il semblerais que cela fonctionne, du moins lors d'un ctrl-c mon server comprend qu'il doit aller dans finFils() mais cette fonction ne recevant qu'un int je ne peut pas faire grand chose a l’intérieur ...

est il possible de lui transmettre une structure en paramètre en plus de son int ?

je ne doit plus être bien loin de la fin de ce problème ça fait plaisirs !
Répondre
123guitare 26Messages postés mardi 24 mai 2016Date d'inscription 5 avril 2017 Dernière intervention - 1 mars 2017 à 14:24
à ma connaissance on ne peut pas passer de paramètres à un handler de signal.
Tu peux par contre passer par des variables globales dans le domaine de visibilité des deux fonctions. Les variables sont initialisées par le père avant de créer le fils et lues par le fils.
Mais attention ça va être difficile surtout si tu écrases le code dans le processus fils avec un execlp(), auquel cas il te reste la possibilité d'utiliser les mémoires partagées. Mais c'est une autre histoire. Bienvenue dans le monde du multiprocessing : synchronisation, échange de données exécutions concurrentes, ...
Bon courage.
Répondre
astrocurieux 143Messages postés mardi 24 février 2015Date d'inscription 16 mai 2017 Dernière intervention - 6 mars 2017 à 12:40
hello, désolé du temps de réponse.

j'ai fait un grand nombre de teste mais pas moyen de résoudre ce foutue problème ...

voici un peu de code finalement.

int manage_client(t_Serv *S)
{
  pid_t pid;

  while (1)
    {
      Lock_ser = 0;
      if ((S->fd_fils = accept(S->fd_master, (struct sockaddr *)&S->s_in_client, (socklen_t *)&S->s_in_size)) != ERROR)
        {
          if ((pid = fork()) == 0)
	          {
              Auth(S);
              printf("Client [%s] connected\n", inet_ntoa(S->s_in_client.sin_addr));
              Loop(S);
              printf("Client [%s] disconnected\n", inet_ntoa(S->s_in_client.sin_addr));
            }
          else if (pid != 0)
            {
              S->act.sa_handler = finFils;
              sigaction(SIGCHLD, &S->act, NULL);
              if (Lock_ser == 1)
                {
                  printf("Client [%s] disconnected\n", inet_ntoa(S->s_in_client.sin_addr));
                  close (S->fd_fils);
                }
            }
        }
    }
  return OK
}

void finFils(int sig)
{
  wait(NULL);
  Lock_ser = 1;
}


pour le moment quand mon client envoie "quit" ou "exit" je sort de la fonction Loop() et je boucle inf comme prévue dans l'attente d'un éventuel nouveau client .
mais quand mon client est fermer avec ctrl-c mon programme ce fige dans la fonction finFils() sans donner de suite . aurais vous des explications ?
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !