Vous êtes sur la page 1sur 11

ENSI - II2/Environnement Unix

A.U. 2006/2007

Programmation du noyau Unix


Les processus et les signaux
Chapitre VII

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

Les signaux : /usr/include/signal.h


Nom Signal

Numro

Description

SIGFPE

une erreur arithmtique est survenue (floating exception).

SIGKILL

signal de terminaison. Le processus qui reoit ce signal doit se


terminer immdiatement.

SIGSTP

18

frappe du caractre de suspension sur le clavier.

SIGCONT

19

signal de continuation d'un processus stopp: lorsque vous tapez


bg aprs avoir fait un CTRL +Z

SIGBUS

10

Erreur sur bus

SIGALAR
M

14

Evnement dclench par l'horloge pour signaler l'expiration


d'un dlai

SIGIOT

Emis en cas de problme matriel

SIGILL

Emis en cas d'instruction illgale

SIGQUIT

Abandon, lorsque le caractre <QUIT> est frapp.

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

Programmes en cours dexcution


Sexcute soit en mode utilisateur soit en mode noyau ou prvilgi
Excution en arrire plan ou en avant plan : &, jobs, fg, bg ..
Priorit : de -19 20
nice -n 20 find / -type f -name "install*" -print
renice 10 733

Cration dun processus : Duplication dun processus ou cration


dun fils sexcutant en concurrence avec son pre. Tous processus
est cre par appel :
pid_t fork();
H. IDOUDI

Chap. 7

Les processus

Retourne le pid du processus en cours :


pid_t getpid() ;
Retourne le ppid du processus en cours :
pid_t getppid();

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)

Moyen de communication entre processus


p1| p2 => p1 passe ses donnes rsultats lentre de p2
La primitive C : cration dun tube p
int pipe (int p[2]);
p[1] correspond au descripteur pour crire dans le tube
p[0] permettra de lire dans le tube.
La valeur de retour est 0 en cas de succs, -1 sinon
Les piles FIFO (First In First Out) ou tubes nomms :
Ils agissent comme les pipes ordinaires, la diffrence tant
quils ont une entre dans un rpertoire et peuvent tre
utiliss par des processus indpendants.
H. IDOUDI

10

Chap. 7

Les tubes : exemple

#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