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 :

Je n'arrive pas a stopper une boucle infinie avec signal


Sujet :

C

  1. #1
    Membre à l'essai Avatar de K-store
    Homme Profil pro
    étudiant en informatique
    Inscrit en
    Août 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : étudiant en informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Je n'arrive pas a stopper une boucle infinie avec signal
    Bonjour a tous,
    Pour un projet, je dois coder une bataille navale ds le terminal, en envoyant des signaux entre deux programme en utilisant leur PID.
    Je dois donc envoyer des coordonnées uniquement avec les signaux SIGUSR1 et SIGUSR2, et uniquement en utilisant uniquement les fonctions : open, close, read, write, lseek, malloc, free, getpid, kill, signal,sigaction, sigemptyset, setcontext, getcontext, usleep, nanosleep, pause.
    Je précise par ailleurs que j'ai déjà lu tt les man des fonctions.
    Mon idée pour transmettre des information a un autre programme : envoyer par exemple 45 signaux a un prog et 45 correspondrais a la position (4 = D et 5 = 5) soit D5.
    Cependant, je n'arrive pas a stopper la fonction signal qui tourne ds une boucle infini.

    Le prog qui reçoit :
    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
     
    #include <stdlib.h>
    #include <unistd.h>
    #include <include/my.h>
    #include <sys/types.h>
    #include <signal.h>
     
    int value = 0;
     
    void test()
    {
        value += 1;
        my_putstr("value =");
        my_put_nbr(value);
        my_putchar('\n');
    }
     
    int main(int argc, char **argv)
    {
        my_putstr("my_pid : ");
        my_put_nbr(getpid());
        my_putchar('\n');
        my_putstr("waiting for enemy connection...");
        while(1) {
            signal(SIGUSR1, test);
        }
        my_putstr("test");
    }
    Le prog qui émet un signal : (prends en seul paramètre, le PID du prog qui reçois)
    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
     
    #include <stdlib.h>
    #include <unistd.h>
    #include <include/my.h>
    #include <sys/types.h>
    #include <signal.h>
    #include <fcntl.h>
    #include <stdio.h>
     
    int main(int argc, char **argv)
    {
      int x = 0;
     
        while(x != 45) {
            kill(my_getnbr(argv[1]), SIGUSR1);
            sleep(0.1);
            x++;
        }
        my_putstr("test");
    }

  2. #2
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    Bonjour,

    Ton approche me semble vraiment très bourrinne. Pour transmettre la valeur 45 tu envoie 45 signaux... Mouais...Une chance que tu ne doive pas envoyer la valeur 100000000000 ou -1...

    Pour être plus intelligent, tu devrais envoyer un signal simplement pour dire à l'autre programme "j'ai joué".

    Après pour transmettre la case jouée, tu as plusieurs approches:

    - Transmettre des données directement avec le signal. Pour ça tu peux utiliser la fonction sigqueue(). Je ne sais pas si tu as le droit de l'utiliser mais c'est propre et c'est exactement ce que tu veux faire. Exemple d'utilisation.
    - Écrire la case jouée dans un fichier (ex D5), le fermer puis envoyer ton SIGUSRx . A la réception le handler pourra simplement lire le fichier. C'est sous-optimal mais ça répond à ta consigne. Note, tu aurais aussi pu gérer cela avec une pipe et un select (ou de plein d'autres manières)

    Bonne journée.

    Edit: je viens de voir que tu avais déjà ouvert un thread sur le même sujet hier, tu aurais pu le réutiliser pour poser ta question...

  3. #3
    Membre à l'essai Avatar de K-store
    Homme Profil pro
    étudiant en informatique
    Inscrit en
    Août 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : étudiant en informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Bonsoir, merci beaucoup pour votre réponse.
    Bonne soirée a vous

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonji
    Citation Envoyé par K-store Voir le message
    envoyer par exemple 45 signaux a un prog et 45 correspondrais a la position (4 = D et 5 = 5) soit D5
    Et t'as pas pensé à envoyer par exemple 4 SIGUSR1 et 5 SIGUSR2 ? Ou bien SIG2 SIG1 SIG2 SIG2 SIG1 SIG2 (101101 représentant 45 en binaire) ?
    Citation Envoyé par emixam16 Voir le message
    Pour transmettre la valeur 45 tu envoie 45 signaux... Mouais...Une chance que tu ne doive pas envoyer la valeur 100000000000 ou -1...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    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 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonji

    Et t'as pas pensé à envoyer par exemple 4 SIGUSR1 et 5 SIGUSR2 ? Ou bien SIG2 SIG1 SIG2 SIG2 SIG1 SIG2 (101101 représentant 45 en binaire) ?
    Le problème de ta première idée, c'est qu'il faut un séparateur pour indiquer la fin du chiffre. Normalment, ce séparateur serait SIG2.

    Aussi, dans l'hypothèse où l'on persisterait sur l'idée d'un programme basé sur une boucle d'attente de signaux, il faudrait penser à utiliser pause() dans la boucle d'attente, histoire d'éviter que ce soit une attente active.
    Et je conseillerais de réarmer le signal dans la fonction gestionnaire, cela éviterait une race condition.
    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.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le problème de ta première idée, c'est qu'il faut un séparateur pour indiquer la fin du chiffre.
    Oui j'y avais pensé aussi. On retrouve d'ailleurs ce problème du "comment finir" dans certaines trames réseau. J'imaginais une espèce de séquence mais évidemment ce n'est pas garanti.
    Sinon il y a le morse qui code chaque chiffre sur 5 signaux
    1= . - - - -
    2= . . - - -
    3= . . . - -
    4= . . . . -
    5= . . . . .
    6= - . . . .
    7= - - . . .
    8= - - - . .
    9= - - - - .
    0= - - - - -
    Donc là on sait direct combien on doit en recevoir et le souci ne se pose plus
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exécuter et arrêter une boucle infinie avec un bouton
    Par mok_tun dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 04/10/2017, 09h29
  2. [PHP 5.3] Problème n'arrive pas à vérifié si une URL est valide ou non
    Par kopax dans le forum Langage
    Réponses: 9
    Dernier message: 09/09/2011, 13h16
  3. arrêter une boucle infinie avec DoEvents
    Par 3aychoucha dans le forum C++/CLI
    Réponses: 5
    Dernier message: 31/03/2011, 21h48
  4. N'arrive pas a stopper une boucle
    Par Mac Twist dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 16/07/2007, 12h25
  5. [Système][Runtime]J'arrive pas à lancer une appli externe !?!
    Par polnioumane dans le forum Général Java
    Réponses: 6
    Dernier message: 16/11/2005, 18h55

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