Ok… donc les excerices en cours sont : 9.1 9.5 et 9.10 is traitent sur les signaux, forcement en utilisant l'API POSIX

quelques rappels simples... :

  • les signaux c'est asynchrone.
  • pour ceux qui se sont un peu interessé au hardware, cela reagit un peu comme une IRQ.
  • Imaginez que vous avec simplement des sonnettes : Chaque fois qu'un individu tire sur une sonnette BIM !
    1. l'execution du code courant est arrtée (ca casse d'ailleur les sleep)
    2. “arrete” l'xecution du code courant, ca execute une routine (adaptée a cette sonnette)
    3. puis ca reviens ou c'etait dans votre code
  • Un signal peut en cacher un autre
  • Les signaux peuvent arriver a n'importe quel moment !
  • Par consequant, le code dans les gestionnaire de signaux doit etre le plus succint possible
  • le cas presque particulier de SIGALRM
    • tout les signaux ont une signification: ils tirent leur sonnette en fonction de cas precis,
    • SIGALRM, ce n'est pas tout a fait pareil… lui sont declencheur c'est le temps… et donc pour l'armer c'est alarm(en secondes)
    • a un detail pret cependant : on l'arme pour les X _prochaines_ seconde, et c'est tout, donc, il faut le rearmer par la suite,si on en a encore besoin
  • Lorsque l'on fork un process, les configuration des signaux sont, eux aussi copié a l'identique.

(18:48:41) Antoine_Delaporte: il faut lancer le handler dans le pere (18:48:51) X: C'est ce qui me semblait (18:49:05) Antoine_Delaporte: car sinon il peut y avoir des pertes de signaux (18:49:23) Antoine_Delaporte: hmm ma phrase n'est pas clair… (18:51:28) Antoine_Delaporte: en gros si jamais le fils n'a pas fini de s'initialiser et qu'a ce moment la le pere lui envoie le signal… donc le fils le loupe

Exercices

Exercice 9.1

À l’aide des primitives V7POSIX, écrivez un programme qui incrémente et affiche un compteur à chaque fois qu’il reçoit le signal SIGINT . Au bout de 5 fois, il doit s’arrêter. L’incrémentation et l’affichage du compteur ne doivent pas être réalisés dans la fonction main.

Exercice 9.5

Écrivez un programme composé de deux processus.

  1. Le processus père génère un processus fils qui doit exécuter une fonction traite toutes les secondes, qui ne fait qu’afficher un message.
  2. Au bout d’une minute, le processus père affiche un message et prévient le fils qu’il doit s’arrêter en lui envoyant le signal SIGUSR1.

Lorsque le processus fils reçoit l’ordre du père

  1. il affiche un message et s’arrête effectivement, provoquant alors la terminaison du père.

Vous utiliserez les primitives V7POSIX, avec le signal SIGALRM pour tout ce qui est temporisation.

Exercice 9.10

On désire simuler un mécanisme matériel comparable à un coupleur série à l’aide des signaux POSIX.

  • Un 0 (zéro) est matérialisé par le signal SIGUSR1 , un 1 (un) est matérialisé par le signal SIGUSR2.
  • Un octet est transmispar une succession de 8 bits (0 ou 1).
  • À chaque fois qu’il reçoit un bit, le récepteur doit envoyer en retour un acquittement (signal SIGUSR1 ) pour prévenir l’émetteur qu’il peut passer au bit suivant.

Écrivez les fonctions suivantes :

  • void envoyer (pid_t recepteur, int octet)

Cette fonction envoie les 8 bits constituant un octet au processus désigné.

  • void preparer_reception (void)

Cette fonction prépare le récepteur à recevoir un octet.

  • int recevoir (pid_t emetteur)

Cette fonction attend que suffisamment de bits soient reçus pour constituer un octet, et renvoie alors la valeur reçue.

Rédigez un programme de test dans lequel le processus père envoie une valeur (passée en argument du programme) et le fils affiche la valeur reçue.

docs/programation_system/signaux.txt · Dernière modification: 2020/03/19 19:01 (édition externe)
Recent changes RSS feed Debian Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki