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 :

Problèmes de signaux


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 100
    Points : 67
    Points
    67
    Par défaut Problèmes de signaux
    Bonjour tout le monde

    Voila j'ai un petit souci en C et je me demandais si vous ne pourriez pas me mettre sur la voie ... Je dois faire deux processus : un serveur et un client .

    Le client doit envoyer son pid sous forme binaire au serveur à l'aide des signaux SIGUSR1 et SIGUSR2 et attend la reception du signal SIGTERM du serveur pour se terminer proprement ...

    Le serveur quant à lui reconstruit le pid du client et l'affiche, envoie un SIGTERM au client.

    Le pid du serveur est envoyé en ligne de commande lorsque je lance le client ainsi on connait le pid du serveur dans le client.

    J'ai beau rechercher comment envoyer le pid du client sous forme binaire au serveur sur le net mais je ne trouve pas ... Donc si vous pourriez me mettre sur la voie ce serait bien sympathique ..;

    Merci d'avance

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    .
    Inscrit en
    Décembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Fidji

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Décembre 2009
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Pas trop complique.

    Ton client fais des :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    kill(`pid du serveur`, SIGUSR1);
    kill(`pid du serveur`, SIGUSR2);
    Et ton serveur catch les signaux SIGUSR1 et SIGUSR2.
    Apres tu choisi comment les interpreter, SIGUSR1 pour 0 et SIGUSR2 pour 1.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 100
    Points : 67
    Points
    67
    Par défaut
    Merci pour la réponse Je vais tester ça

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 408
    Points : 23 803
    Points
    23 803
    Par défaut
    Citation Envoyé par asnaeb Voir le message
    Le client doit envoyer son pid sous forme binaire au serveur à l'aide des signaux SIGUSR1 et SIGUSR2 et attend la reception du signal SIGTERM du serveur pour se terminer proprement ...
    Arg ! C'est atroce ! J'espère franchement que ce n'est pas un énoncé scolaire, parce que si un signal UNIX est compté au nombre des quelques mécanismes qui permettent de communiquer entre deux processus, il ne servent absolument pas à transmettre des données directement.

    On en parlait déjà ici, ici et .

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    .
    Inscrit en
    Décembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Fidji

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Décembre 2009
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Peu etre atroce, mais a titre pedago, les signaux sont bien compris apres :p

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 408
    Points : 23 803
    Points
    23 803
    Par défaut
    Citation Envoyé par Damoun Voir le message
    Peu etre atroce, mais a titre pedago, les signaux sont bien compris apres :p
    Non, même à titre pédagogique, il ne faut jamais se servir des signaux pour « faire du Morse ». Surtout pas à titre pédagogique en fait. Lis les discussions pointées dans mon précédent commentaire.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    .
    Inscrit en
    Décembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Fidji

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Décembre 2009
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    J'ai survole, et je sais au'il y a une grosse perte au niveau de la reception (liste chainee avec une taille definie...)

    Bref je trouve que c'est un bon moyen d'apprendre au lieu de faire tout le temps des SIG_IGN.

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 408
    Points : 23 803
    Points
    23 803
    Par défaut
    Citation Envoyé par Damoun Voir le message
    Bref je trouve que c'est un bon moyen d'apprendre au lieu de faire tout le temps des SIG_IGN.
    Quoi ? Je crois que tu confonds beaucoup de choses. Relis de manière plus approfondie.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    .
    Inscrit en
    Décembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Fidji

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Décembre 2009
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Nan je ne confond pas

    pour exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    signal(SIGUSR1, SIG_IGN);
    Qui ignore le signal (au cas ou hein)

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 408
    Points : 23 803
    Points
    23 803
    Par défaut
    Citation Envoyé par Damoun Voir le message
    Nan je ne confond pas
    Si, tu confonds. :-) Où alors, tes notions ne sont pas encore assez solides.

    pour exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    signal(SIGUSR1, SIG_IGN);
    Qui ignore le signal (au cas ou hein)
    • Si tu fais cela, tu ignores le signal SIGUSR1. Donc, tu ne peux plus les recevoir. Ce n'est cependant pas l'objet de la discussion : asnaeb cherche à transmettre son PID à un autre processus, et on explique qu'utiliser les signaux pour y parvenir est une très mauvaise idée. Il ne s'agit donc pas de bloquer les signaux entrants, mais de ne pas les émettre ;
    • Il n'y a pas de « au cas où » dans le présent problème. SIGUSR1 et 2 sont déjà ignorés par défaut. Et s'ils ne l'étaient pas, c'est qu'il y aurait une très bonne raison à cela. Changer le handler du signal sans justification solide est donc une erreur de conception ;
    • Encore une fois, les signaux UNIX ne servent pas à transmettre des données. Ils sont là pour faire face à un événement imprévu du système. Plus précisément, à quelque chose qui soit en dehors du périmètre du programme.


    Dans ce dernier cas, si c'est imprévu, il n'y a que deux options possibles : soit c'est une erreur mineure qui n'empêche pas le programme de fonctionner, et dans ce cas-là, on ignore le signal puisqu'il n'y a rien à faire d'autre, soit c'est une erreur critique et là, on met fin au programme. En tout cas, par défaut.

    Les événements systèmes qui nécessitent l'attention immédiate du programme sont donc peu nombreux : parmi eux, on compte la division par zéro, un tube brisé à l'initiative du correspondant ou parce que la ligne de transmission s'est effondrée, ou encore toutes les demandes d'arrêt du programme, envoyés notamment si le système entier est sur le point d'être éteint.

    SIGUSRx, notamment, signifie sémantiquement « altération du système à l'initiative de l'utilisateur », et est donc envoyé par lui. C'est très utile, par exemple, pour relire un fichier de conf' si besoin, et ce, parce que le moment où l'utilisateur décidera de modifier ce fichier ne peut être connu à l'avance et que le logiciel qu'il utilisera pour ce faire sera indépendant de l'application qui utilise le fichier (en général, ce sera un éditeur de texte).

    Ça veut dire également qu'utiliser SIGUSRx pour faire communiquer deux programmes, quels qu'ils soient, n'est pas un bon modèle non plus : d'abord parce que si le protocole de communication à travers ces signaux est défini à la conception du programme, rien n'empêche de le faire passer à travers un tube ordinaire, à la place. Ensuite, parce que ces signaux peuvent être envoyés par n'importe qui, à commencer par l'utilisateur.

    En particulier, il existe une manière de faire assez répandue (et bien plus censée que d'envoyer des bits via SIGUSR1 ou 2) qui consiste à déclarer un segment de mémoire partagée, et à utiliser un signal pour prévenir l'autre processus que de nouvelles données sont disponibles. C'est un moindre mal, mais le signal ne devrait même pas être utilisé dans ce cas, à mon goût, car le recours aux signaux ne doit être qu'occasionnel, parce que n'importe qui peut en envoyer un, ce qui peut perturber le fonctionnement du programme, parce que ça ne permet d'envoyer qu'un seul type d'information, là où un bête tube ou socket permet la transmission d'un message structuré (avec identifiant de l'émetteur, etc.), et enfin parce que pour pouvoir utiliser les signaux, il faut que le processus récepteur transmette son PID à l'autre. Pour cela, il faut une voie de communication, que l'on peut alors utiliser directement pour transmettre les informations.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    .
    Inscrit en
    Décembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Fidji

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Décembre 2009
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Non je ne confond pas, je parle de l'utilisation des signaux en general.

    Ce n'est pas le sujet, son exo lui demande de communiquer avec des signaux, donc il n'y a pas a discuter dessus.

    La solution a ete donnee, on est d'accord que ce n'est pas la facon dont communique un server/client en realite.

    De plus ce n'est pas a terme, pour une production, cela reste dans le cadre d'apprentissage (des signaux).

    Je suis d'accord sur le faite qu'un pipes est bien plus approprie.

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 408
    Points : 23 803
    Points
    23 803
    Par défaut
    Citation Envoyé par Damoun Voir le message
    Ce n'est pas le sujet, son exo lui demande de communiquer avec des signaux, donc il n'y a pas a discuter dessus.
    Si, il y a clairement à discuter dessus, puisque cette entrée va rester référencée dans le forum un moment, et que n'est pas la première fois que le sujet revient. C'est, en outre, exactement l'objet de mon post numéro 4 :

    Citation Envoyé par Obsidian Voir le message
    Arg ! C'est atroce ! J'espère franchement que ce n'est pas un énoncé scolaire, parce que si un signal UNIX est compté au nombre des quelques mécanismes qui permettent de communiquer entre deux processus, il ne servent absolument pas à transmettre des données directement.

    La solution a ete donnee, on est d'accord que ce n'est pas la facon dont communique un server/client en realite.
    Dans ce cas, ce n'est pas un exemple à donner.

    De plus ce n'est pas a terme, pour une production, cela reste dans le cadre d'apprentissage (des signaux).
    Non seulement cela n'apporte strictement rien d'un point de vue pédagogique, mais c'est la meilleure façon d'induire un novice en erreur. C'est l'exemple à fuir. Si, en plus, c'est en classe qu'on lui demande d'agir ainsi, c'est une raison de plus pour insister − ici − sur le fait que ce genre de hack ne doit jamais être utilisé.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    .
    Inscrit en
    Décembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Fidji

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Décembre 2009
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Non seulement cela n'apporte strictement rien d'un point de vue pédagogique, mais c'est la meilleure façon d'induire un novice en erreur. C'est l'exemple à fuir. Si, en plus, c'est en classe qu'on lui demande d'agir ainsi, c'est une raison de plus pour insister − ici − sur le fait que ce genre de hack ne doit jamais être utilisé.
    Ce n'est pas mon avis, sa apporte forcement, puisque apres cette exo, il comprendras comment marche les signaux (les differentes fonction a utiliser, et aussi un peu sur les process).

    Bref pour moi le sujet est resolu, asnaeb a demander de l'aide, je lui est repondu, comment faire (avec obligation d'utilise les signaux).

  14. #14
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 408
    Points : 23 803
    Points
    23 803
    Par défaut
    Citation Envoyé par Damoun Voir le message
    Ce n'est pas mon avis, sa apporte forcement, puisque apres cette exo, il comprendras comment marche les signaux (les differentes fonction a utiliser, et aussi un peu sur les process).
    C'est ce qui nous distingue : ça n'apporte rien sur le fonctionnement réel des signaux, ni même sur la manière de les utiliser correctement. Par contre, cela donne d'entrée de mauvaises habitudes.

    Bref pour moi le sujet est resolu, asnaeb a demander de l'aide, je lui est repondu, comment faire (avec obligation d'utilise les signaux).
    À dire vrai, même pour toi seul, tu ne devrais pas t'en satisfaire. Il vaut mieux un programme incomplet ou un problème à moitié résolu mais qui soit assis sur des bases solides, plutôt qu'un problème résolu à tâtons et considéré comme valide à la première exécution vérifiée, sans que l'on sache pourquoi. Nous apprécions ton aide, mais l'objectif de ce forum n'est pas de « faire du chiffre ».

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 160
    Points
    160
    Par défaut
    Petite question d'ordre un peu plus personnel.

    Les signaux temps-réel ne sont-ils pas plus orientés vers la transmission d'informations ?

    - http://davmac.org/davpage/linux/rtsignals.html
    - http://www.mnis.fr/ocera_support/rtos/x1215.html

  16. #16
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 408
    Points : 23 803
    Points
    23 803
    Par défaut
    Bonjour,

    Citation Envoyé par BSans Voir le message
    Les signaux temps-réel ne sont-ils pas plus orientés vers la transmission d'informations ?
    Non, c'est même pire, à mon avis. Les signaux temps réel sont faits pour garantir certaines priorités et un temps de transmission suffisamment rapide pour gérer des événements rapides, comme la gestion des timers haute résolution, comme précisé sur la page en question.

    Ça veut dire qu'ils sont une charge encore plus contraignante pour le système, et ils ne sont toujours pas dédiés à la transmission de données, même si les signaux RT peuvent être accompagnés d'une petite quantité de données pour les spécialiser.

    C'est vraiment une drôle d'idée de vouloir utiliser à tout prix les signaux UNIX pour faire du message passing. Je pense que la confusion provient du fait que, d'une part, on les classe dans les IPC au sens large et, d'autre part, que le terme « signal » est utilisé de manière assez vague en informatique pour désigner un certain nombres de concepts similaires mais différents. Les signaux de GTK, par exemple, n'ont rien à voir avec les signaux système UNIX.

  17. #17
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 100
    Points : 67
    Points
    67
    Par défaut
    Bonsoir tout le monde.

    Un grand merci à vous deux déjà Je vais aller lire un peu tout les liens qui ont été postés. Eh oui c'était bien un énoncé qu'on m'a donné à l'école

    Encore juste une petite question, qui n'a plus rien à voir avec les signaux cette fois-ci , je me demandais si en qnx la fonction kbhit() existait? Car je voudrais boucler tant qu'un utilisateur n'a pas appuyé sur une touche ... Merci d'avance

  18. #18
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    plusieurs solutions s'offrent à toi en fonction de ce que tu souhaite faire et de l'importance de tes descripteurs de fichiers par rapport à tes traitements.

    Tu peux jouer sur la propriété de ton descripteur de fichier pour le rendre non bloquant (O_NONBLOCK ou O_NDELAY) et regarder de temps en temps si des données sont présentes.
    http://www.linux-kheops.com/doc/man/...n2/open.2.html


    Tu peux aussi jouer avec FD_SET et select ou poll.
    http://linux.die.net/man/3/fd_set
    http://linux.die.net/man/2/select_tut

  19. #19
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 100
    Points : 67
    Points
    67
    Par défaut
    Je ne comprend pas vraiment comment je pourrais arriver à arrêter une boucle en appuyant sur une touche avec un descripteur de fichier ou avec FD_SET, select ou poll Si tu peux m'éclairer ?

  20. #20
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Désolé j'avais mal cerné ton besoin, je pensais que tu voulais faire des traitements en boucle en attendant que l'utilisateur se reveille et fasse quelque chose de son clavier.


    si c'est juste attendre qu'il appuie sur une touche tu peux utiliser getchar ou read
    http://linux.die.net/man/3/getchar

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème de signaux Gtk::CellRendererCombo
    Par cueffic dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 14/02/2013, 22h43
  2. [QtCore] Problème de signaux et de slots
    Par benbannock dans le forum PyQt
    Réponses: 1
    Dernier message: 31/07/2010, 12h42
  3. Problème de signaux et de slots
    Par prince_bouja dans le forum Qt
    Réponses: 8
    Dernier message: 15/07/2010, 17h33
  4. problème avec signaux
    Par laracroft87 dans le forum Linux
    Réponses: 2
    Dernier message: 06/04/2010, 10h11
  5. Problème pour concaténer des signaux
    Par Math66 dans le forum Signal
    Réponses: 3
    Dernier message: 31/05/2007, 16h12

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