MP2L
Cours GNU/Linux
Chapitre 6 : Gestion des
processus
1. Notion de processus
Un programme est la traduction d'un algorithme écrit à l'aide d'un langage de programmation.
Il est compilé ensuite lié pour produire, sur disque, un binaire exécutable. (de nom générique
a.out). Il s'agit d'une entité (séquence de code et s'appliquant sur des données) qui est statique.
Un processus est une entité qui donne une idée sur la façon avec laquelle évolue l'exécution
du programme par le processeur. C'est une entité dynamique qui évolue en fonction du
temps. On pourrait le définir comme l'ensemble constitué du programme exécutable (avec ses
données) et d'un contexte d'exécution (informations indispensables au noyau du système
d'exploitation, telles que la valeur du compteur ordinal, la pile, etc.)
L'ensemble de ces informations constitue le bloc de contrôle du processus (Process Control
Block)
Le système GNU/Linux emploie un processus particulier, l'ordonnanceur (scheduler), pour
pouvoir allouer le processeur aux différents processus présents en mémoire. L'ordonnanceur
du processeur sous GNU/Linux est basé sur l'attribution d'une priorité dynamique et le recours
au tourniquet (round robin) pour arbitrer les conflits entre les processus ayant une même
priorité. De cette façon, tous les processus seront servis.
Le système GNU/Linux distingue essentiellement deux types de processus:
Les processus système:
De tels processus ne sont pas lancés à partir de terminaux et sont la propriété du super-
utilisateur : Les processus démons (daemons). Ces processus assurent un certain nombre
de services pour les utilisateurs (locaux ou distants) du système. Ces processus ont, par
défaut, la racine absolue du système de fichier comme répertoire de travail. On distingue
les processus:
init : il sert à initialiser le système. Il doit s'assurer que sur chaque terminal re-
lié au système s'exécute un processus permettant à un utilisateur de se connecter au
système (processus getty). Il gère aussi le problème de processus orphelins (cas
des processus zombis). Le processus init a comme identificateur la valeur 1 et c'est
le processus parent de tous les processus shells créés par les utilisateurs lors de
leurs connexions au système.
Yahia SLIMANI/Habib SMEI
- Page 1 -
MP2L
Cours GNU/Linux
cron : c'est un processus dont le rôle est de lancer à des dates précises des com-
mandes particulières. Les utilisateurs peuvent exploiter ce processus pour pro-
grammer des tâches en différé (batch).
inetd (xinetd sous Linux) : il s'agit d'un super-démon. Son rôle est de contrô-
ler les principaux services réseau (telnet, ftp, rlogin, etc.). Il permet de créer un
processus satisfaisant la requête correspondante.
Les processus utilisateur:
Ces processus exécutent une tâche dédiée et ont une durée de vie assez limitée.
De tels processus sont créés dès la connexion d'un utilisateur au système. Typiquement ces
processus exécuteront un interprète de commandes (shell) qui analysera et créera un processus
qui exécutera la commande tapée à partir de l'invite de commandes. D'autres moyens sont,
cependant, possibles tels que le recours à d'autres processus (les éditeurs par exemple) ou à
partir d'applications qui effectueront des appels système de type fork.
Il faut noter que la plupart des processus utilisateur sont sous le contrôle d'un terminal (lancés
à partir d'un terminal de contrôle).
Par ailleurs, le système GNU/Linux distingue deux modes pour l'exécution des processus:
Le mode utilisateur:
C'est le mode qui ne permet à un processus que d'accéder qu'à son propre espace d'adressage
qui lui a été alloué par le système et n'exécute que les instructions du programme sous-jacent
(le programme correspondant au processus).
Le mode noyau:
Dans ce mode, un processus exécute des instructions n'appartenant pas à un programme sous-
jacent mais au noyau du système. Il est possible, également, d'accéder à des données ne
faisant pas partie de son propre espace d'adressage (les tables utilisées par GNU/Linux). Le
passage en mode noyau se réalise par le processus lui-même par un appel système SVC
(SuperVisor Call) ou par interruption qui activera le traitant d'interruption (Interrupt Handler).
Notons, aussi, que sous GNU/Linux, les processus sont conformes aux principes de la
génétique. En effet, sauf pour le processus ancêtre commun, tout processus créé possède un
parent duquel il hérite un certain nombre de caractéristiques. Tout processus créé est le
résultat de l'appel système fork. Les principales caractéristiques des processus sont les
suivantes:
Identificateur du processus: PID (Process IDentifier): un entier naturel
Identificateur du processus parent: PPID (Parent Process IDentifier): un entier naturel
Propriétaire: UID (User IDentifier) : un entier naturel
Groupe propriétaire GID (Group IDentifier) : un entier naturel
Yahia SLIMANI/Habib SMEI
- Page 2 -
MP2L
Cours GNU/Linux
Terminal de contrôle ou d'attachement TTY,
Priorité,
Répertoire de travail ,
etc.
2. La commande ps
La commande ps (process status) permet d'obtenir, si elle est exécutée par un utilisateur
quelconque, la liste des processus avec éventuellement leurs caractéristiques. Avec les options
passées à la commande, l'utilisateur pourrait obtenir davantage de détails sur les processus. Si
la commande est tapée sans paramètres, elle affichera les informations suivantes:
Exemple
Le numéro du processus (PID)
Le numéro du terminal (TTY)
Le temps d'exécution cumulé (TIME) sous format hh:mm:ss
La commande correspondant au programme sous-jacent (COMMAND)
Sous le système Linux, un utilisateur qui vient de se connecter tape la commande ps:
$ ps
PID
1780
1763
TTY
tty1
tty1
TIME
00:00:00
COMMAND (ou CMD)
ps
00:00:00
-bash
Remarquons ici que la valeur de TIME est 00:00:00 puisque le temps d'exécution des
processus ps et bash sont plus petits qu'une seconde.
L'option –l permet d'avoir davantage de détails sur chaque processus:
Le numéro d'identification de l'utilisateur (UID)
L'identificateur du processus (PID)
L'identificateur du processus parent (PPID)
Le terminal de contrôle (TTY) attaché au processus, la valeur ? signifie que le proces-
sus n'est pas attaché à un terminal.
L'état du processus (S): peut être R (Running) i.e processus en cours exécution ou S
(Sleeping) i.e processus endormi (attente d'évènement)
Priorité du processus (C / NI / PRI)
Adresse (ADDR) et taille (SZ) du processus
Cause de l'attente (WCHAN) si le processus est mis en sommeil
Soit l'exemple suivant exécuté par le super-utilisateur sur le terminal tty2 :
$ ps –l
Yahia SLIMANI/Habib SMEI
Publicité
- Page 3 -
MP2L
Cours GNU/Linux
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 1115 1 0 72 0 - 580 wait4 tty2 0:0:00 login
0 S 0 1216 1115 0 77 0 - 638 wait4 tty2 0:0:00 bash
0 R 0 1262 1216 0 79 0 - 769 - tty2 0:0:00 ps –l
On remarque sur cet l'exemple précédent, que le processus parent du processus qui exécute la
commande login a comme PID la valeur 1 qui correspond au processus init. Le processus
exécutant la commande bash a comme parent le processus ayant comme PID la valeur 1115
(login) et il est en même temps parent du processus ps dont le PID est 1262.
3. Terminaison de processus
Chaque processus qui termine son exécution n'aura plus besoin, en principe, de ressources. Il
faudrait donc éliminer tout processus ayant terminé son exécution afin de libérer les
différentes tables du système référençant ces processus.
Un état, de processus, très particulier sous GNU/Linux est l'état zombie. Il correspond à la
terminaison d'un processus par son père. Ce dernier pourrait consulter les informations dont il
aura besoin pour savoir comment son fils s'est terminé.
Chaque processus qui se termine aura un code de retour (exit status). Ce code de retour sera
utilisé par le processus parent pour récupérer les informations nécessaires à sa progression.
Une valeur nulle, indique une terminaison normale du processus. Une valeur non nulle
indique une terminaison anormale.
Tout processus en cours d'exécution pourrait recevoir de la part d'autres processus des
signaux. On pourrait, à titre d'exemple, interrompre, à l'aide de la touche ctlr c, l'exécution du
processus ls qui affiche le contenu d'un répertoire. Dans ce cas, le terminal envoie un signal
particulier interprété par le shell au processus exécutant la commande ls. Un tel signal est
représenté génériquement par SIGINT. Le système GNU/Linux définit plusieurs signaux qui
pourraient être envoyés aux processus au cours de leur exécution.
Si un processus est en exécution et il reçoit un signal de type SIGINT (interrupt) ou SIGQUIT
(Quit) il sera mis immédiatement à l'état zombie. Si le signal reçu est SIGQUIT, une image du
processus (à sa terminaison) sera copiée sur disque et pour nom core et un message core
dumped sera affiché.
Certains types de processus ignorent l'interprétation de quelques types de signaux (notamment
SIGINT, SIGQUIT). Un exemple typique de tels processus celui associé à un interprète de
commandes.
Yahia SLIMANI/Habib SMEI
- Page 4 -
MP2L
Cours GNU/Linux
GNU/Linux offre un moyen pour envoyer manuellement des signaux à un ou plusieurs
processus. Il met à a disposition des utilisateurs la commande kill. Sa syntaxe est la suivante:
kill signal PID
4. La redirection des entrées-sorties
Le système GNU/Linux définit trois fichiers logiques conventionnels qui seront utilisés par
tous les processus. Le fichier entrée standard (standard input), le fichier sortie standard
(standard output) et le fichier erreur standard (standard error).
Lorsqu'un utilisateur se connecte au système, ce dernier fait l'association entre ces deux
fichiers logiques (fichiers standards) et le terminal de l'utilisateur. Ainsi, le fichier entrée
standard sera affecté au clavier du terminal et le fichier sortie standard est affecté à son écran.
Le système représente, par des entiers, chaque fichier standard dans la table de descripteurs
de fichiers utilisée par chaque processus. Le fichier entrée standard a comme numéro d'index
dans cette table la valeur 0 (premier élément de la table). Le fichier sortie standard a la valeur
1 (deuxième élément de la table). Le fichier erreur standard est le troisième élément de la
table et a, par conséquent, comme descripteur la valeur 2. Le fichier erreur standard est
associé, comme la sortie standard, à l'écran du terminal.
Entrée standard
Sortie standard
Erreur standard
Ce schéma pourrait être modifié de sorte que l'entrée, la sortie et l'erreur standard perdent
leurs valeurs habituelles (leurs associations par défaut). Il devient donc possible, pour un
processus donné, d'accepter ses données d'entrée non plus de l'entrée standard qui, pour les
processus shell et leurs descendants, est associée au clavier du terminal mais à partir d'un
autre emplacement tel qu'un fichier disque classique. Le même raisonnement peut s'appliquer
à la sortie standard qui pourrait être remplacée par un autre fichier (disque ou autre).
Redirection de l'entrée standard
Pour rediriger l'entrée standard d'un processus, il suffit de taper, sur la ligne de commande, le
nom de la commande associée au processus suivie du caractère spécial '<' et une référence à
un fichier comme illustré par la syntaxe suivante:
$ commande < référence_fichier
Le processus associé à commande ne lit plus ses données à partir de l'entrée standard mais à
partir du fichier désigné par référence_fichier. À noter que l'opération de redirection de
l'entrée standard n'est possible que si le fichier référence_fichier est accessible par
l'utilisateur.
Yahia SLIMANI/Habib SMEI
- Page 5 -
MP2L
Exemple
$ wc < liste
3 8 26
Cours GNU/Linux
L'exemple montre la redirection de l'entrée standard. La commande wc (word count) ne lit
plus ses données à partir de l'entrée standard mais à partir du fichier liste
Redirection de la sortie standard
Le principe de la redirection de la sortie standard est analogue à celui de l'entrée standard. Le
résultat du processus relatif la commande exécutée depuis le shell interactif ne sera plus
affiché sur la sortie standard (typiquement l'écran du terminal) mais envoyé vers un autre
fichier. La redirection de la sortie standard prend la forme suivante:
$ commande > référence_fichier
Comme dans le cas de la redirection de l'entrée standard, il faut que l'utilisateur aie le droit
d'écriture sur le fichier référence_fichier. Ici deux possibilités sont à évoquer: soit que le
fichier référence_fichier n'existe pas et dans ce cas il sera créé. Si le fichier référence_fichier
existe alors, et selon le shell utilisé, il peut être, ou non, écrasé par le processus relatif à
commande.
Par ailleurs, le système offre une deuxième forme de redirection de la standard: la redirection
en mode ajout (append) en fin de fichier. Un tel type de redirection aura la forme:
$ commande >> référence_fichier
Avec cette forme, si le fichier référence_fichier n'existe pas il sera créé. S'il existe, le
processus relatif à commande ouvrera le fichier référence_fichier en mode append et y écrira
ses résultats à sa fin.
Exemples
$ date > DATE_DU_JOUR
$ cat < DATE_DU_JOUR
Lun fév 18 15:36:48 CET 2002
$ pwd >> DATE_DU_JOUR
$ cat < DATE_DU_JOUR
Lun fév 18 15:36:48 CET 2002
/home/foulen
Redirection de l'erreur standard
On suppose que sur le répertoire privé de l'utilisateur foulen i.e. /home/foulen, il existe un
fichier liste et un répertoire Desktop. Essayons de prendre l'exemple suivant et de l'analyser:
$ ls –ld liste Desktop LISTE > Liste_Fichiers
ls: LISTE : Aucun fichier ou répertoire de ce type
Yahia SLIMANI/Habib SMEI
- Page 6 -
MP2L
$ cat Liste_Fichiers
Cours GNU/Linux
drw xr-x r-x
3
-rwx- - - - - - 1
foulen
foulen
foulen
foulen
4096 fév 1 23:36 Desktop/
107
fév 5 23:08
Publicité
liste
Le fichier LISTE n'étant pas existant dans le répertoire de travail, le système va générer un
message d'erreur concernant uniquement le fichier LISTE, par contre pour les deux autres
fichiers, la commande ls –ld a été redirigée vers le fichier Liste_Fichiers.
Avec des interprètes de commandes comme le Bourne Shell ou le Korn Shell, il est possible
de rediriger l'erreur standard séparément.
$ ls –ld liste Desktop LISTE 2>Erreurs >Liste_Fichiers
$ cat Liste_Fichiers
drw xr-x r-x
3
-rwx- - - - - - 1
$ cat <Erreurs
foulen
foulen
foulen
foulen
4096 fév 1 23:36 Desktop/
107
fév 5 23:08
liste
ls: LISTE : Aucun fichier ou répertoire de ce type
Dans l'exemple précédent, nous avons montré comment on pourrait rediriger la sortie erreur
standard vers un autre fichier en utilisant la syntaxe 2 > Nom_Fichier
5. Enchaînement de processus (gestion des jobs)
Le shell utilisé le plus fréquemment sur les systèmes GNU/Linux, bash, propose un système
de contrôle des jobs. Un job correspond à une tâche demandée par l'utilisateur. Cette tâche
peut être composée de plusieurs processus. Ce qui les regroupe est un tube. Un job est donc
un regroupement de plusieurs commandes devant s'exécuter les unes à la suite des autres en
communiquant leurs résultats.
Un exemple tout simple de job pourrait être le suivant :
$ ls | less
ls permet de lister les fichiers. Mais quand ils sont trop nombreux, la consultation est difficile.
less permet alors de paginer ce qui lui est passé sur son entrée standard et de naviguer
facilement à l'aide des touches fléchées.
Il faut bien voir que lorsque ceci aura été tapé, 2 processus seront créés. Un pour exécuter ls et
l'autre pour less. Mais bash fournit une abstraction permettant de manipuler ceci comme un
tout, appelée donc job.
Mais un job pourrait tout aussi bien être constitué d'une seule commande sans utilisation de
tube. L'utilisation de ls uniquement constituerait aussi le lancement d'un job.
Yahia SLIMANI/Habib SMEI
- Page 7 -
MP2L
Cours GNU/Linux
La commande intégrée à bash permettant de les lister s'appelle jobs. La lancer dans un shell
ne produira aucun résultat normalement.
Le système GNU/Linux permet aussi aux utilisateurs de lancer l'exécution de plusieurs processus
(jobs) en même temps. L'exécution peut se faire de manière indépendante en séquence ou en parallèle.
Dans le premier mode d'exécution, les processus sont exécutés en séquence et indépendamment les
uns des autres.
Exemple
La commande suivante produira, dans l'ordre, les résultats:
$ ls –ld ; cat liste; echo Fin du traitement
drw xr-x r-x
-rwx- - - - - -
3
1
foulen
foulen
foulen
foulen
4096
fév 1 23:36
Desktop/
107
fév 5 23:08
liste
Liste des ouvrages:
La Programmation sous UNIX
The C programming language
Manuel en ligne d'UNIX (man)
Fin du traitement
Pour rediriger la sortie standard d'une commande composée, il suffit de parenthésér l'ensemble comme
illustré par l'exemple suivant:
$ (ls –ld ; cat liste; echo Fin du traitement) > Resultat
$ cat < Resultat
drw xr-x r-x
-rwx- - - - - -
3
1
Liste des ouvrages:
foulen
foulen
foulen
foulen
4096
fév 1 23:36
Desktop/
107
fév 5 23:08
liste
La Programmation sous UNIX
The C programming language
Manuel en ligne d'UNIX (man)
Fin du traitement
Notons qu'avec ce mécanisme d'enchaînement, une commande n'est lancée que si celle qui la précède
s'est terminée. Ceci veut dire qu'il n'y a pas de communication entre les différents processus relatifs à
l'ensemble de commandes constituant la commande composée. Ceci n'empêche, qu'il est possible, via
le mécanisme de redirection, de créer une sorte de communication entre les commandes. Voyons
l'exemple suivant:
$ ls > FICHIERS ; wc –l < FICHIERS; rm FICHIERS
Cette méthode n'est pas commode; car elle nécessite à chaque fois, l'utilisation d'un ou de plusieurs
fichiers temporaires et puis leur suppression.
Comme alternative, GNU/Linux offre un mécanisme de communication qui permet aux processus de
s'exécuter simultanément (i.e en parallèle) et d'échanger ainsi des informations (dépendance entre les
processus): c'est le principe de la communication par tube. Un tube (pipe) est une entité temporaire
Yahia SLIMANI/Habib SMEI
- Page 8 -
MP2L
Cours GNU/Linux
qui servira à mettre en communication deux processus: l'un se comporte comme processus écrivain
dans le tube et l'autre comme processus lecteur.
Ainsi la sortie standard du processus écrivain est redirigée vers l'entrée du tube et l'entrée standard du
processus lecteur est redirigée vers la sortie du tube. De cette façon, les résultats produits par le
processus écrivain seront considérés comme données au processus lecteur. On pourrait mettre
plusieurs tubes en cascade; en effet, un processus pourrait se comporter comme lecteur et écrivain à la
fois. La syntaxe d'utilisation d'un tel mécanisme est la suivante:
commande1 ¦ commande2 ¦ … ¦ commanden
Exemple
$ ls –l ¦ wc -l
Cette commande crée deux processus concurrents (concurrence sur les ressources du système,
notamment le processeur). Un tube sera créé pour que le processus associé à la commande ls –l écrive
ses résultats dans l'entrée du tube. Le deuxième processus (associé à la commande wc –l) extraira ces
données (non plus de l'entrée standard ou d'un fichier classique) à partir de la sortie du tube. Quand le
processus écrivain (ls –l) se termine et que le processus lecteur (wc –l) a terminé sa lecture, le tube
sera vide et une fin de fichier sera détectée par le processus lecteur qui provoquera sa terminaison
normale.
Le système doit veiller à la bonne synchronisation des processus. En effet, il doit:
Publicité
bloquer le processus lecteur si le tube est vide (attente qu'il se remplisse)
bloquer le processus écrivain si le tube est plein (cas d'un processus lecteur plus lent qu l'écrivain)
L'exemple suivant met en évidence l'existence des trois processus correspondant aux commandes: ps,
tee et wc :
$ ps ¦ tee RESULTATS ¦ wc –l
PID
641
653
654
655
5
TTY
tty1
tty1
tty1
tty1
$ cat < RESULTATS
PID
641
653
654
655
TTY
tty1
tty1
tty1
tty1
TIME
00:00:00
00:00:00
00:00:00
00:00:00
TIME
00:00:00
00:00:00
00:00:00
00:00:00
COMMAND (ou CMD)
-bash
ps
tee
wc
COMMAND (ou CMD)
-bash
ps
tee
wc
La commande tee, très particulière, peut être insérée pour stocker le résultat de la commande
qui la précède dans des tubes en cascade.
Yahia SLIMANI/Habib SMEI
- Page 9 -
MP2L
Cours GNU/Linux
Il est possible de lancer un job en arrière-plan. Cela permet alors de pouvoir continuer à
utiliser le shell pour d'autres tâches pendant qu'il s'exécute. Emacs est un éditeur de texte très
utilisé (notamment pour faire ce site). Si dans une console au sein d'un environnement
graphique on le lance en tapant son nom, une fenêtre Emacs va s'ouvrir par défaut. Mais la
console ne sera plus utilisable car le shell attendra la fin de l'exécution de l'éditeur avant de
laisser à nouveau la possibilité de lancer des commandes. Pour pouvoir donc lancer ce logiciel
par exemple, il faut rajouter le symbole & (lire esperluette ou ET commercial) à la fin de la
définition de la tâche. Pour cet exemple :
$ emacs &
[1] 6373
La première valeur est le numéro du job. Celui-ci est unique dans le shell courant. Si plusieurs
sont utilisés simultanément (comme par exemple avec plusieurs fenêtres de console), chacun
aura ses propres jobs et ne pourra agir sur ceux des autres.
La seconde valeur affichée est le PID du dernier processus lancé pour ce job. Il correspondra à
la dernière commande dans le tube. Étant donné qu'il n'y en a qu'une ici, ce sera donc le PID
pour le processus exécutant Emacs. Avec l'exemple précédent, ce serait celui correspondant à
less qui serait affiché.
On peut alors utiliser la commande jobs vue précédemment :
$ jobs
[1]+ Running emacs &
On retrouve ici le numéro du job et la commande utilisée pour le lancer (dans la dernière
colonne). La texte "Running" signifie qu'il est en train de s'exécuter. Le signe + indique qu'il
s'agit du job le plus récemment manipulé (ce qui sera utile pour les commandes qui seront
vues ensuite).
Si le programme avait été lancé en oubliant d'ajouter le $ il est tout de même possible de
pouvoir continuer d'utiliser le shell. Pour cela, il faut utiliser la combinaison de touches Ctrl-
Z (maintenir la touche Ctrl et appuyer sur la lettre Z). On aura alors ceci :
$ jobs
[1]+ Stopped emacs
Contrairement à l'exemple précédent, l'état du job est indiqué comme "Stopped". Le job est
alors en sommeil et ne réalise aucune action. La fenêtre d'Emacs est inactive et on ne peut
utiliser ce programme. Il existe toutefois une commande qui permet de demander à ce qu'un
job arrêté reprenne son exécution en arrière-plan. Il s'agit de bg qui prend en paramètre le
Yahia SLIMANI/Habib SMEI
- Page 10 -
MP2L
Cours GNU/Linux
numéro de job. Par défaut, bg agit sur le job portant le + dans la liste affichée. Voici ce que
l'on obtient alors :
$ bg
[1]+ emacs &
$ jobs
[1]+ Running emacs &
Tout se passe alors comme si le & avait été indiqué lors du lancement du programme. On peut
remarquer qu'il est d'ailleurs ajouté à l'affichage.
A l'opposé de bg, il existe fg qui permet de mettre en avant-plan un job. Celui-ci s'exécutera
alors dans le shell empêchant de saisir d'autres commandes. Le paramètre passé à fg est le
même que pour bg (le numéro de job et par défaut celui avec un +). fg peut être utilisé pour
un job tournant en arrière-plan ou arrêté.
L'avant-dernier job manipulé est lui aussi indiqué d'une manière particulière. Voici un
exemple fictif d'affichage :
$ jobs
[1] Running mozilla &
[2]- Stopped su
[3]+ Stopped emacs -nw &
[4] Running dtfile &
En tapant seulement fg (sans paramètre donc), c'est Emacs qui sera mis en avant-plan (l'option
-nw permet de l'utiliser en mode texte directement dans la console). Pour rendre le
programme su actif et utilisable, on peut taper indifféremment une des deux commandes
suivantes :
$ fg 2
$ fg -
L'utilisation du - permet donc d'accéder à l'avant-dernier job et d'ainsi facilement passer d'un
job à un autre sans connaître leurs numéros.
Etant donné que kill est une commande intégrée à bash, il permet aussi d'intéragir avec les
jobs. Pour cela, il faudra à la place du PID indiquer le numéro du job précédé du caractère %.
Comme par exemple :
$ kill -SIGSTOP %1
Qui stoppera le job numéro 3. En fait l'utilisation de Ctrl-Z vue précédemment est équivalente
à l'envoi d'un signal SIGSTOP.
Yahia SLIMANI/Habib SMEI
- Page 11 -