signal() - C - Programmation
Marsh Posté le 07-04-2006 à 13:15:43
http://www.linux-kheops.com/doc/ma [...] nal.2.html
Je trouve ça clair, moi...
Marsh Posté le 07-04-2006 à 13:19:59
qu'est-ce que tu ne comprends pas?
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é
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
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 :
|
Marsh Posté le 08-04-2006 à 15:30:21
franceso a écrit : ex :
|
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 :
|
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
C'est le genre de truc sur lequel tu peux t'arracher les cheveux pendant des heures !!!
Marsh Posté le 09-04-2006 à 11:00:53
franceso a écrit : Ah, je ne savais pas |
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
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
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.
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 |
Sinon, tu utilise l'autre système de gestion des signaux POSIX qui est cependant plus compliquée.
voir "man sigaction"
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