Page principale   Liste par ordre alphabétique   Liste des composants   Liste des fichiers   Composants   Déclarations  

signaux.c

Aller à la documentation de ce fichier.
00001 /**
00002  * \file signaux.c
00003  * Fonctions permettant de manipuler la liste de signaux a intercepter pour 
00004  * chaque processus.
00005  */
00006 
00007 #include "signaux.h"
00008 
00009 
00010 /**
00011  * Ajoute ou modifie un signal a intercepte au processus
00012  * \param pid : le num du processus a ajouter
00013  * \param sig : le signal a ajouter ou modifier
00014  * \return rien
00015  */
00016 void add_sig (int pid, signal_t *sig) {
00017   signal_t *p_sig; 
00018   signal_t *p_tmp; 
00019 
00020   // Regarde si le signal n'est pas deja intercepte
00021   p_sig = rechercher_sig(pid, sig->signal);
00022   if (p_sig != NULL) {
00023     p_sig->cp = sig->cp;
00024     free (sig);
00025   }
00026   else {
00027     // Le signal n'est pas deja intercepte
00028     if (table_capture[pid] == NULL) {
00029       // C'est le premier signal a intercepte
00030       table_capture[pid] = p_sig;
00031     }
00032     else { 
00033       p_tmp = table_capture[pid];
00034       while (p_tmp->next) {
00035         p_tmp = p_tmp->next;
00036       }
00037       p_tmp->next = sig;
00038     }
00039   }
00040 }
00041 
00042 /**
00043  * Recherche si le processus intercepte le signal
00044  * \param pid : le num du processus dont on scan la liste des signaux
00045  * \param sig : le signal rechercher
00046  * \return 
00047  * - NULL si le signal n'a pas ete trouve
00048  * - un pointeur sur lui sinon
00049  */
00050 signal_t* rechercher_sig (int pid, int sig) {
00051   signal_t *p_tmp; 
00052 
00053   // Cas de la liste vide
00054   if (table_capture[pid] == NULL) {
00055     return NULL;
00056   }
00057   p_tmp = table_capture[pid];
00058   while (p_tmp) {
00059     if (p_tmp->signal == sig) {
00060       return p_tmp;
00061     }
00062     p_tmp = p_tmp->next;
00063   }
00064   return NULL;
00065 }
00066 
00067 /**
00068  * Supprime un signal a intercepter de la liste des signaux du processus
00069  * \param pid : le num du processus dont on veut supprimer un signal
00070  * \param sig : le signal a supprimer
00071  * \return 
00072  * - -1 en cas de liste des signaux vide
00073  * - -2 Le signal n'a pas ete trouve
00074  * -  0 sinon
00075  */
00076 int supp_sig (int pid, int sig) {
00077   signal_t *p_tmp; 
00078   signal_t *p_clr; 
00079 
00080   // Cas de la liste vide
00081   if (table_capture[pid] == NULL) {
00082     fprintf(stderr,"Impossible de supprimer un signal a une liste vide\n");
00083     return -1;
00084   }
00085   else {
00086     if (table_capture[pid]->signal == sig) {
00087       p_clr = table_capture[pid];
00088       table_capture[pid] =  table_capture[pid]->next;
00089       free (p_clr);
00090       return 0;
00091     }
00092     p_tmp = table_capture[pid];
00093     while (p_tmp->next) {
00094       if (p_tmp->next->signal == sig) {
00095         p_clr = p_tmp->next;
00096         p_tmp->next = p_tmp->next->next;
00097         free(p_clr);
00098         return 0;
00099       }
00100       p_tmp = p_tmp->next;
00101     }
00102     return -2; // Le signal n'a pas ete trouve
00103   }
00104 
00105 }
00106 
00107 /**
00108  * Supprime tous les signaux a intercepter de la liste des signaux du processus
00109  * \param pid : le num du processus dont on veut supprimer un signal
00110  * \return  rien
00111  */
00112 void supp_all_sig (int pid) {
00113   signal_t *p_tmp; 
00114   signal_t *p_clr; 
00115 
00116   p_tmp = table_capture[pid];
00117   p_clr = p_tmp;
00118   while (p_tmp) {
00119     p_tmp = p_tmp->next;
00120     free(p_clr);
00121     p_clr = p_tmp;
00122   }
00123 }
00124 
00125 /**
00126  * Le code des signaux du language ksinu n'ai pas le meme que les constantes
00127  * definient dans lib_ksinu.h. Cette fonction permet de traduire un code ksinu en 
00128  * constante bibliotheque.
00129  * \param k_sig : le code ksinu a traduire
00130  * \return  
00131  * - -1 en cas de signal inexistant
00132  * - la constante bibliotheque correspondante sinon
00133  */
00134 int sig_ksinu2lib (int k_sig) {
00135   int sig;
00136 
00137   switch (k_sig) {
00138   case 2:
00139     sig = S_KILL;
00140     break;
00141   case 3:
00142     sig = S_MEM;
00143     break;
00144   case 4:
00145     sig = S_SUSP;
00146     break;
00147   case 5:
00148     sig = S_REP;
00149     break;
00150   case 6:
00151     sig = S_USR1;
00152     break;
00153   case 7:
00154     sig = S_USR2;
00155     break;
00156   case 8:
00157     sig = S_INSTI;
00158     break;
00159   default:
00160     return -1;
00161   }
00162   return sig;
00163 }
00164 
00165 /**
00166  * Le code des signaux du language ksinu n'ai pas le meme que les constantes
00167  * definient dans lib_ksinu.h. Cette fonction permet de traduire une constante 
00168  * bibliotheque en un code ksinu.
00169  * \param l_sig : la constante bibliotheque a traduire
00170  * \return  
00171  * - -1 en cas de signal inexistant
00172  * - le code ksinu correspondant sinon
00173  */
00174 int sig_lib2ksinu (int l_sig) {
00175   int sig;
00176 
00177   switch (l_sig) {
00178   case S_KILL:
00179     sig = 2;
00180     break;
00181   case S_MEM:
00182     sig = 3;
00183     break;
00184   case S_SUSP:
00185     sig = 4;
00186     break;
00187   case S_REP:
00188     sig = 5;
00189     break;
00190   case S_USR1:
00191     sig = 6;
00192     break;
00193   case S_USR2:
00194     sig = 7;
00195     break;
00196   case S_INSTI:
00197     sig = 8;
00198     break;
00199   default:
00200     return -1;
00201   }
00202   return sig;
00203 }

Généré le Sun Sep 29 22:47:22 2002 pour KSInu par doxygen1.2.16