IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Gestion de signaux, pères et fils [Non suivi]


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Gestion de signaux, pères et fils
    Bonjour, je suis actuellement en train de galérer sur un TP, pourriez vous me proposer vos solutions s'il vous plait...
    Il s'agit d'envoie de signaux entre père et fils ...
    Voici l'intitulé du TP

    Exercice 1.
    Ecrire un programme C qui compte les signaux qu'il recoit et affiche ces compteurs

    Exercice 2.
    Un processus s'ennuyant à longueur de journée décide de créer un fils afin d'entamer une partie de tennis de table avec lui. Désireux de mettre toutes les chances de son coté, il crée un second fils chargé de l'encourager d'un Vas y papa (affiché à l'écran) toutes les deux secondes.

    Il ordonne à son fils joueur de commencer ( Au fils est donc toujours associé la sonorité Ping et par conséquent Pong est associé au père)

    Une fois la balle frappé (affichage de ping) le fils se met en attente du renvoi de la balle par son père. Celui ci en attente de la balle est réveillé, frappe à son tour dans la balle (affichage de pong) et se remet en attente. et ainsi de suite jusqu'a ce que le père mette dehors la 10eme balle qu'il recoit.
    Très en colère de perdre cet échange, il décide de supprimer ces duex vauriens de fils et se suicide lui meme de désespoir...
    IL ets bien entendu supposé que les mécanismes des signaux devront etre utilisés pour coordonner les échanges entre les 2 pongistes.
    Ecrire le progrmame permettant de simuler cette partie de ping pong bruyante et houleuse.

    Merci a vous si vous pouviez m'aider.

  2. #2
    Membre actif Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Points : 295
    Points
    295
    Par défaut
    c'est quoi qui te bloque ?
    montre nous ce que tu as deja fait (code) et on pourra t'aider.
    si tu n'as encore rien fait je te suggere de commencer par regarder ton cours.
    il parait que la plume est plus forte que l'épée, heureusement j'ai une hache

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Pour le moment j'ai la base du programme ... définition de varibles, les #include, la création des fils ... (dès que je l'aurai un peu complèté je l'afficherai)
    Moi mon problème c'est l'envoi de signaux entre processus et le renvoi automatique de signaux après la reception ...
    J'enverrai mon bout de code cet apres midi dès que je l'aurai bien complété ... la j'ai un autre cours ...
    Merci

  4. #4
    Membre actif Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Points : 295
    Points
    295
    il parait que la plume est plus forte que l'épée, heureusement j'ai une hache

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 116
    Points : 100
    Points
    100
    Par défaut
    la fonction kill permet d'envoyer un signal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int kill(pid_t pid, int sig);
    le pid est l'identifiant du processus et sig le signal a envoyer (ex : SIGKILL pour killer un programme)

    la fonction signal quand a elle permet de recevoir un signal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void (*signal(int sig, void (*func)(int)))(int);
    des qu'il recoit le signal que tu lui a précisé il appelle la fonction que tu lui a donné en argument.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    je dois dire un excellent énoncé

    à garder...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Bon tout d'abord désolé de ne pas vous avoir répondu avant mais j'étais occupé ... donc concernant la première partie de l'exercice j'ai réussit a la faire et voila le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include<stdio.h>
    #include<sys/types.h>
    #include<unistd.h>
    #include<signal.h>
     
    int compteur = 0;
    void handler1(int sig)
    	{
    	compteur++;
    	}
    void handler2(int sig)
    	{
    	printf("Nombre signal SIGUSR1 recus = %d\n",compteur);
    	}
    void main()
    	{
    	int a;
    	a=(int)getpid();
    	printf("Taper kill -10 %d depuis un autre Terminal pour envoyer des SIGUSR1, et kill -12 %d pour que le programme affiche le nombre de SIGUSR1 qu'il a recu\n",a,a);
    	signal (SIGUSR1,handler1);
    	signal (SIGUSR2,handler2);
    	for(;;);
    	{}
    }



    Maintenant j'essaye d'envoyer un signal entre un père et son fils, voila le bout de code que j'ai concu ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include<stdio.h>
    #include<sys/types.h>
    #include<unistd.h>
    #include<signal.h> 
     
    void handler1(int sig)
    	{
    	printf("sigusr1 recu\n");
    	}
     
    main(){
     
    	int ppid,a=1,i;
    	pid_t pid_du_fils;
     
    	ppid=(int)getpid();
    	pid_du_fils=fork();
     
    	for(i=0;i<5;i++){
    		if (pid_du_fils==0){
    			kill(ppid,SIGUSR1);
    			}}
    	if (pid_du_fils!=0){
    		signal (SIGUSR1,handler1);
    		}
    }
    Le seul problème c'est que quand je l'éxécute il me marque "Signal #1 défini par l'usager" et arrete le processus sans m'afficher le printf ...
    Pourriez vous m'indiquer le problème s'il vous plait

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Tu devrais appeler la fonction signal() avant le fork().
    Sinon, essaie en rajoutant au moins un sleep(1) entre la création du fils et le lancement du signal, histoire que le fils ait le temps d'installer son handler avant de se faire tuer...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc
    ....le fils ait le tant d'installer son handler avant de se faire tuer...
    FBI portés disparus : programme de protection des témoins...

    Bavure
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Bon alors j'ai reussit a synchronyser le pere et le fils dans ces petits programmes, je me suis attaqué au 2) mais je n'arrive pas du tout a les synchronyser, pourriez vous m'aider a le corriger s'il vous plait...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    #include<stdio.h>
    #include<sys/types.h>
    #include<unistd.h>
    #include<signal.h>
     
    int envoiepere(int pid)
    	{
    	kill(pid,SIGUSR1);
    	printf("Pong\n");
    	}
     
    int envoiefils(int pid)
    	{
    	kill(pid,SIGUSR2);
    	printf("Ping\n");
    	}
     
    main(){
     
    	int ppid,a=1,b=1,i;
    	pid_t pid_du_fils_a,pid_du_fils_b;
    	ppid=(int)getpid();
    	printf("Tiens et si je pondais un mome pour jouer au Ping Pong\n");
    	signal (SIGUSR2,envoiepere(pid_du_fils_a));
    	pid_du_fils_a=fork();
     
    	for(i=1;i<2;i++){
    		if (pid_du_fils_a!=0){
    			printf("Vas-y commence mon fils\n");
    			a=0;
    			}
    		}
     
    	if (pid_du_fils_a!=0){
    		sleep(1);
    		pid_du_fils_b=fork();
    		if (pid_du_fils_b==0){
    			for (;;){
    				printf("Vas-y Papa\n");
    				sleep(2);
    			}
    		}
     
    		if (pid_du_fils_b!=0){
    			for(i=0;i<10;i++){
    				sleep(2);
    				signal (SIGUSR2,envoiepere(pid_du_fils_a));
    			}
     
    			printf("Creuvez misérable\n");
    			kill((int)pid_du_fils_a,9);
    			kill((int)pid_du_fils_b,9);
    		}
    	}
    	else if (pid_du_fils_a==0){
    		sleep(0);
    		envoiefils(ppid);
    		sleep(0);
    		for(;;){
    			sleep(1);
    			signal (SIGUSR1,envoiefils(ppid));
    		}
    	}
    }
    Voila c'est un peu plus lisible

  11. #11
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    illisible !
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  12. #12
    Membre actif Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Points : 295
    Points
    295
    Par défaut
    j'ai pas regarde en detail mais pour synchoniser le pere et le fils qui se renvoient la balle il te faut utiliser 2 semaphores en mutex et pas un sleep
    il parait que la plume est plus forte que l'épée, heureusement j'ai une hache

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    et pourquoi des sleep(0) ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Gestion des exceptions entre job Père et fils
    Par jbe77 dans le forum Exécution et industrialisation
    Réponses: 1
    Dernier message: 13/10/2009, 12h08
  2. Gestion des signaux
    Par Kicker dans le forum Administration système
    Réponses: 4
    Dernier message: 23/05/2007, 16h40
  3. Treeview et tables avec 2 champs Père et fils
    Par BEN NASR dans le forum Delphi
    Réponses: 4
    Dernier message: 14/05/2007, 17h48
  4. Réponses: 8
    Dernier message: 09/11/2006, 15h01
  5. Père et fils sous-formulaire
    Par manujuggler dans le forum Access
    Réponses: 7
    Dernier message: 05/01/2006, 17h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo