Академический Документы
Профессиональный Документы
Культура Документы
A.U. 2006/2007
Chap. 7
Les signaux
Un signal est un vnement, interne ou externe, qui interrompt
le droulement normal d'un processus.
Peut tre:
Un caractre venant du terminal
^|, ^C, ^S, ^Q etc. reprsents respectivement par des
constantes symbolique SGQUIT, SIGINT, SIGSTOP,
SIGCONT
Visibles et modifiables par la commande stty applique
quit, intr, cont, stop, etc. (exemple: stty intr ^I). Les
signaux du terminal ne concernant que les processus en
avant plan.
D une erreur programme (signaux internes) comme la
division par 0 (SIGFPE).
mis par un autre programme avec la primitive kill(). C'est
par exemple ce qu'envoie le shell de lancement quand on
tape la commande "kill sig pid" au processus dsign.
H. IDOUDI
Chap. 7
Numro
Description
SIGFPE
SIGKILL
SIGSTP
18
SIGCONT
19
SIGBUS
10
SIGALAR
M
14
SIGIOT
SIGILL
SIGQUIT
H. IDOUDI
Chap. 7
Lenvoi de signaux
En Shell : kill
En langage C:
#include <signal.h>
Envoie de signaux un processus :
int kill (pid_t pid, int sig);
(sig : valeur entre 0 et NSIG)
Excution dune commande lors de la rcupration dun
signal
int signal(num_du_signal,fonction)
Envoie du signal SIGALARM la fin dun intervalle de
secondes unsigned int unsigned int alarm (unsigned
int secondes)
H. IDOUDI
Chap. 7
Exercice
Ecrire un programme
alarm qui demande
l'utilisateur de taper
un nombre. Afin de
ne pas attendre
indfiniment, vous
utiliserez le signal
SIGALRM pour que le
programme ne soit
pas bloqu plus de 5
secondes.
H. IDOUDI
#include <signal.h>
#include <stdio.h>
#include <unistd.h> /* pour la fonction alarm */
int nombre;
void traite_alarme() {
nombre=100;
printf("Le nombre entr vaut:%d\n",nombre);
printf("Veuillez entrer un autre nombre:");
scanf ("%d",&nombre);
printf("Le NOUVEAU nombre entr vaut:
%d\n",nombre);
}
main()
{
alarm(5);
signal(SIGALRM,traite_alarme);
printf("Veuillez entrer un nombre:");
scanf ("%d",&nombre);
printf("Le nombre entr vaut:%d\n",nombre);
}
Chap. 7
Exercices(2)
crire un programme
qui affiche la succession
des lettres de l'alphabet
de telle sorte qu'une
nouvelle lettre
apparaisse toutes les
secondes.
H. IDOUDI
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
int i='a';
int j;
void traite_alarme() {
printf("caractre suivant: %c \n",i);
i++;
signal(SIGALRM,traite_alarme);
if (i<='z') alarm(1);
else exit(0);
}
main()
{
signal(SIGALRM,traite_alarme);
alarm(1);
while (1);
}
Chap. 7
Les processus
Chap. 7
Les processus
Synchronisation :
pid_t wait(int *pointeur_status);
int waitpid(pid_t pid)
Si le processus ne possde aucun fils, la primitive renvoie la
valeur -1,
Si le processus appelant possde des fils mais aucun fils zombi,
le processus est alors bloqu jusqu' ce que l'un de ses fils
devienne zombi.
H. IDOUDI
Chap. 7
Exemple
#include <stdlib.h>
#include <stdio.h>
main() {
pid_t pid;
switch(pid=fork()){
case -1: perror(Pas de Cration de processus");
exit(2);
case 0:
/* on est dans le processus fils */
printf("FILS je suis le processus %d de pre %d",getpid(),
getppid());
printf("FILS fin du processus fils");
exit(0);
default:
/* on est dans le processus pre */
printf("PERE valeur de fork = %d ",pid);
printf("PERE je suis le processus %d de pre %d",getpid(),
getppid());
printf("PERE fin du processus pre");
}
}
H. IDOUDI
Chap. 7
Les tubes(pipe)
10
Chap. 7
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int p[2];
char ch[10]; /* buffer qui servira envoyer ou recevoir des donnes
main() {
if (pipe(p) == -1) {
perror("Creation du tube");
exit(2);}
printf("Ecrivons dans le tube");
write(p[1],"1234",4); /* 4 : longueur de ce qui est crit dans le pipe
*/
read(p[0],&ch,4); /* lire lau maximum 4 caractres dans le pipe */
printf("A l'autre extremite, chaine recue : %s",ch);
}
H. IDOUDI
11