Interruption sous linux en C

Résolu
Bonjour,
comme vous pouvez le savoir déjà, sous Linux, les signaux corréspondeent à des interruptions logicielles. donc pourrais-vous stp nous aider à trouver ce qui suit :
- le signal (nom & numéro) qui traite l'exception d'une division par zéro ?
- élaborer un prg en C qui déroute l'interruption : erreur de calcul en virgule flottante (Div par zéro)
- élaborer et exécuter un script qui affiche la liste des signaux disponibles et qui lance notre prg executable.

aussi pourrez vous nous donner quelques définitions claires et nettes sur les processus et interruptions ! ( le minimum à savoir)

Ps : Merci d'avance, saches que si on réussira notre Tp, ça sera bien grâce à vous !!
Je vous remercie d'avance !
Configuration: Windows XP
Internet Explorer 7.0

14 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Le programme écrit proprement ressemble plutôt à ça :
    #include <signal.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void derouter_interuption(int signum){
        printf("il y a eu une exception (signum = %d) !!!!! oups oups ^^ \n",signum);
        exit(EXIT_FAILURE);
    }
    
    int main(){
        struct sigaction nouvelle_action;
        int a=1, b=0,c;
    
        nouvelle_action.sa_handler = derouter_interuption;
        sigemptyset(&nouvelle_action.sa_mask);
        sigaction(SIGFPE, &nouvelle_action, NULL);
        c = a/b;
    
        return EXIT_SUCCESS;
    }

    Grosso modo tu prépares un handler qui va rattraper une exception (ici une division par 0). Ensuite en calculant c tu déclenche cette division par 0. Le handler rattrape l'exception, puis quitte le programme en retournant le code d'exécution EXIT_FAILURE.
    (mando@cenedra) (~) $ gcc -W -Wall plop.c
    (mando@cenedra) (~) $ ./a.out
    il y a eu une exception (signum = 8) !!!!! oups oups ^^
    

    Si tu as eu l'occasion de faire du java ou du c++ les blocs try{ }catch(...){ } c'est un peu la même idée.

    Bonne chance
    1. Merci mamiemando je vais jetter un oeil sur ce site, qui me semble d'ailleurs être en anglais, et moi j'suis blue english...
      1. Modérateur
        Lis le man ça devrait suffire
        http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/sigaction.2.html
        man sigaction

        Bonne chance
        1. Merci de m'aider mamiemando c'est sympa !

          Un camarade a moi a fait cela, et j'aimerai qu'on m'explique le programme si c'est possible.
          #include <signal.h>
          #include <stdio.h>
          #include <stdlib.h>

          void derouter_interuption(int signum)
          {
          printf("il y a u une exeption!!!!! oups oups ^^ \n");
          exit(EXIT_FAILURE);
          }

          int main(void)
          {
          struct sigaction nouvelle_action;

          nouvelle_action.sa_handler = derouter_interuption;
          sigemptyset(&nouvelle_action.sa_mask);

          sigaction(SIGFPE, &nouvelle_action, NULL);

          int a=1, b=0;
          int c = a/b;

          return EXIT_SUCCESS;
          }

          Je vous remercie d'avance
          1. Je te remercie pour ta réponse mamiemando c'est gentil, bonne continuation pour toi ;)
            1. SaLUT...
              Une derniere requête si possible...Je souhaite changer l'apparence du programme tout en ayant le même resultat lors de l'execution...Je vous remercie d'avance...
              1. Modifier le programme, à titre d'exemple: Changer les variables prédéfinies, modifier l'emplacement des fonctions...En résumé j'aimerai changer le programme de manière à ce que l'ancien ne ressemble plus au nouveau, tout en gardant bien sur le même résultat a l'exécution...Merci !
                1. mais le changement est mimim xD, merci comme même ...
                  Une simple question : Quel est le type de sa_handler ? merci d'avance...
                  1. Modérateur
                    man sigaction !!!!!
                    http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/sigaction.2.html