Tux

Le système UNIX

TD 5 - Les processus

C. Drocourt
I.U.T. Amiens
drocourt@iut-amiens.fr

– Un processus est l’exécution d’un programme à un moment donné. Un processus va donc naître, vivre et mourir.
– Tout utilisateur peut connaître à tout instant tous les processus gérés par le système en consultant la table des processus par l’intermédiaire de la commande ps.
– Un utilisateur peut envoyer à ses propres processus un certains nombres de signaux, destinés en général à les tuer, grâce à la commande kill.

Exercice 1 : Avant-plan et arrière-plan

Expérimenter les commandes suivantes
$sleep 10
$sleep 10 &
Comparer les deux commandes et remarquer que le & lance la commande sleep 10 en arrière-plan : le terminal d'attachement n'est plus monopolisé et rend immédiatement la main.

Exercice 2 : les signaux

Les différents signaux définis sur le système
Les différents signaux disponibles sont répertoriés dans le fichier include /usr/include/sys/signal.h. La commande kill –l permet également d’en obtenir la liste.
Noter les valeurs et l’utilisation des principaux signaux disponibles.

Les signaux envoyés depuis le clavier
La commande stty –a donne les raccourcis clavier des signaux que l’on peut envoyer à des processus tournant en avant-plan (signaux SIGINT, SIGQUIT, SIGHUP)
Le signal SIGINT peut être envoyé à un processus en avant-plan (foreground) par la frappe du caractère <intr>. Donner la valeur de ce caractère.
Le signal SIGQUIT peut être envoyé à un processus en avant-plan par la frappe du caractère <quit>. Donner la valeur de ce caractère. Remarquer qu'il n'est pas pratique.
Le signal SIGHUP est envoyé par exemple à tous les processus en arrière-plan (background) lorsque l’utilisateur se déconnecte en tapant le caractère <eof>. Donner la valeur de ce caractère.

Exercice 3 : Tuer un processus

Tuer un processus en avant plan
La plupart des processus lancés en avant-plan peuvent être tués depuis leur terminal d’attachement à l’aide d’un des signaux SIGINT et SIGQUIT.
On peut également tuer un processus en avant-plan depuis un autre terminal en se connectant sous son propre nom et en envoyant à ce processus un signal grâce à la commande kill. Par exemple, kill –2 <pid> a le même effet que la frappe de <intr> sur le terminal d’attachement du processus.
Lancer la commande sleep 100 en avant-plan et la tuer à l’aide des deux méthodes décrites ci-dessus.

Tuer son propre shell
Le signal SIGHUP et SIGKILL sont seuls capables de tuer un shell de connexion.

Tuer un processus en arrière plan
Lancer la commande sleep 100 en arrière-plan et essayer de la tuer à partir du clavier à l’aide des SIGINT et SIGQUIT. Possible ?
Essayer ensuite de tuer cette commande avec la commande kill à partir du terminal d’attachement.

Exercice 4 : L’enchaînement de processus

Enchaînement
Il est possible d’enchaîner des processus de façon totalement indépendante et en séquence. Le déroulement d’un processus n’influe pas sur celui du suivant. Le processus suivant est lancé à la fin de l’exécution du précédent. Pour cela, on sépare chaque commande par un point-virgule.
Essayer, par exemple :
$date ; cat tagada ; echo fin de commande composée.

Enchaînement en arrière-plan
Il est nécessaire de parenthèser.
Essayer :
$(sleep 300 ; date)&

Exercice 5 : Le contrôle de jobs

Les commandes
Le contrôle de jobs utilise un caractère spécial supplémentaire <susp> dont la frappe cause l’arrêt (et non pas la mort) du processus en avant-plan.
Retrouver la valeur de ce caractère.

Le contrôle de jobs est réalisé seulement avec trois commandes :
·    fg %i pour faire passer le processus de job i d’arrière-plan en avant-plan.
·    bg %i pour faire passer le processus de job i d’avant-plan en arrière-plan.
·    jobs pour connaître les jobs actifs (option l pour le format long).

Lancer la commande sleep 100 en avant-plan, la stopper, puis la passer en arrière-plan. Utiliser la commande ps –l pour regarder ce qui se passe en examinant particulièrement l’état du processus (colonne S).
Enfin, tuer cette commande en utilisant la commande kill suivie du numéro de job
(ex: kill %1, si 1 est le numéro de job de sleep).