signal()

signal() - C - Programmation

Marsh Posté le 07-04-2006 à 12:58:31    

Bonjour,
Est ce que quelqu'un sait ce que fait la fonction système "signal"? et comment ça marche?
j'ai lu le man mais c'est très vague
Merci bcp

Reply

Marsh Posté le 07-04-2006 à 12:58:31   

Reply

Marsh Posté le 07-04-2006 à 13:15:43    

http://www.linux-kheops.com/doc/ma [...] nal.2.html
 
Je trouve ça clair, moi...


Message édité par skeye le 07-04-2006 à 13:15:55

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 07-04-2006 à 13:19:24    

oui je l'ai déjà lu mais c'était pas clair pour moi...

Reply

Marsh Posté le 07-04-2006 à 13:19:59    

qu'est-ce que tu ne comprends pas? :??:


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 07-04-2006 à 13:27:34    

je ne comprends pas les arguments qu'elle prend et je ne comprends pas son utilité

Reply

Marsh Posté le 07-04-2006 à 13:56:25    

Le système d'opération peut envoyer des signaux à ton programme.
 
Ces signaux proviennent de l'utilisateur, d'autres programmes, ou de ton programme lui-même.
 
L'appel système ``signal`` permet de définir ce qu'il faut faire quand ton programme reçoit un signal donné.
 
Ainsi, signal() prends en argument une fonction à executer pour un certain type de signal.
 
Comme le type ``fonction`` n'existe pas en C, on utilise plutot un pointeur sur fonction. Ce qui est déroutant, c'est la syntaxe du pointeur sur fonction, mais ça le rends énormément plus performant que de passer une fonction en argumant (comme en javascript par ex.).
 
Pour envoyer un signal à un programme, tu utilise la fonction système kill(), qui prends en argument le type de signal et l'identifiant du processus (PID).
 
Lorsque le programme reçoit un signal d'un autre il execute la fonction que tu as définit lors de l'appel à signal(). Si il n'y a pas de fonction particulière définie, soit le signal est ignoré, soit le programme est arrêté.
 
L'utilité d'un système de signaux inter-processus est multiple, mais permet avant tout de faire passer une information entre différents processus.
 
Des signaux couramment utilisés sont:
- SIGINT: on demande au programme de quitter, dans ce cas une fonction spéciale permet de sauvegarder sur disque les fichiers ouverts, supprimer les fichiers temporaire, indiquer qux connections réseaux qu'elle doivent se terminer, etc..
- SIGALARM: permet à un programme d'envoyer à un autre, ou à lui-même, un signal à intervalle régulier, la fonction associée pouvant être une vérification de certaines conditions, de messages entrants pour une application réseau, mise à jour d'un fichier de sortie, etc...
- SIGHUP: souvent ce signal est associé à un redémarrage, la fonction associée pouvant par exemple relire un fichier de configuration, redémarrer des connexions réseau, etc...
- SIGPIPE/SIGTTOU/...: indique qu'une opération d'entrée/sortie est finie ou est arrivée, souvent la fonction associée termine une connexion réseau, ferme un fichier, ou lit des informations nouvelles disponibles dans un fichier
- SIGSEGV/SIGBUS/...: utilisés poour le débogguage, cces signaux sont envoyés lorsque ton programme utilise une zone mémoire interdite, execute un code interdit, etc.. La fonction associée fait en général un ``dump`` (copie tel quelle) du processus dans un fichier, pour débogguage avec des programmes de débogguage spéciaux
-SIGUSER: permet de définir des signaux utilisateurs, tu est libre de faire ce que tu veux avec
- SIGCONT/SIGSTOP/.. : certains signaux ne sont pas associables à des fonctions, ils permettent à l'utilisateur de terminer, mettre en pause, continuer l'execution d'un programme sans que ce dernier puisse agir, utilisé lorsque l'utilisateur désire interrompre un programme buggé, ou mettre en pause un programme long à executer.
 
Pour lister les signaux supportés par ton système:
shell: kill -l
 
Pour des informations sur la signification des signaux supportés:
shell: man 7 signal

Reply

Marsh Posté le 07-04-2006 à 13:58:28    

le premier argument est le numéro du signal que tu comptes traiter
le deuxième argument est une fonction du type : void f( int s ) qui prend comme argument le numéro du signal et qui ne renvoie aucune valeur.
 
ex :

Code :
  1. /* définition du "signal handler" */
  2. void traite_signal( int s )
  3. {
  4.   printf( "je viens de recevoir le signal %d\n", s );
  5. }
  6. /* mise en place du traitement du signal SIGSEGV*/
  7. if( signal( SIGSEGV, traite_signal ) == SIG_ERR )
  8. {
  9.   perror( "signal" );
  10. }


---------------
TriScale innov
Reply

Marsh Posté le 07-04-2006 à 14:10:25    

merci bcp bcp c'est becp plus clair comme ça...

Reply

Marsh Posté le 08-04-2006 à 15:30:21    

franceso a écrit :

ex :

Code :
  1. /* définition du "signal handler" */
  2. void traite_signal( int s )
  3. {
  4.   printf( "je viens de recevoir le signal %d\n", s );
  5. }
  6. }



 
Une fois le signal reçu, certains Unix désarment l'appel à la fonction de déroutement (la norme n'est pas encore très claire la dessus). Donc, il ne faut pas oublier de réappeler la fonction "signal" une fois le signal dérouté

Code :
  1. /* définition du "signal handler" */
  2. void traite_signal( int s )
  3. {
  4.     // Je me réarme pour le prochain signal
  5.     signal(s, traite_signal);
  6.   printf( "je viens de recevoir le signal %d\n", s );
  7. }

Message cité 1 fois
Message édité par Sve@r le 08-04-2006 à 15:30:55

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 08-04-2006 à 21:17:33    

Sve@r a écrit :

Une fois le signal reçu, certains Unix désarment l'appel à la fonction de déroutement (la norme n'est pas encore très claire la dessus). Donc, il ne faut pas oublier de réappeler la fonction "signal" une fois le signal dérouté


 
Ah, je ne savais pas :jap:
C'est le genre de truc sur lequel tu peux t'arracher les cheveux pendant des heures !!!


---------------
TriScale innov
Reply

Marsh Posté le 08-04-2006 à 21:17:33   

Reply

Marsh Posté le 09-04-2006 à 11:00:53    

franceso a écrit :

Ah, je ne savais pas :jap:
C'est le genre de truc sur lequel tu peux t'arracher les cheveux pendant des heures !!!


 
Ben sur Linux ce n'est pas le cas donc ton premier code est ok. mais imagine que tu le portes sur sun, comme t'as dit tu peux t'arracher la tête entière  :D  


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 14-04-2006 à 10:15:31    

petite question la dessus, si je veux passer un parametre a traite_signal, je fais comment, puisque rien n'est precisé dans l'appel :(
 
merci


---------------
ras
Reply

Marsh Posté le 14-04-2006 à 10:21:22    

kaillou38 a écrit :

petite question la dessus, si je veux passer un parametre a traite_signal, je fais comment, puisque rien n'est precisé dans l'appel :(


Tu utilises une globale de type sig_atomic_t. C'est crade, mais c'est fait pour.


Message édité par Emmanuel Delahaye le 14-04-2006 à 10:21:41

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-04-2006 à 11:07:00    

merci bien :jap:


---------------
ras
Reply

Marsh Posté le 17-04-2006 à 13:13:30    

kaillou38 a écrit :

petite question la dessus, si je veux passer un parametre a traite_signal, je fais comment, puisque rien n'est precisé dans l'appel :(
 
merci


Sinon, tu utilise l'autre système de gestion des signaux POSIX qui est cependant plus compliquée.
 
voir "man sigaction"

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed