Exercices¶
En utilisant signal(2), écrivez une fonction C
sig_ignored
qui prend comme argument un numéro de signal et retournetrue
si le signal passé en argument est ignoré par le processus etfalse
sinon.A votre avis, pourquoi le système d’exploitation refuse-t-il l’exécution de la ligne
signal(SIGKILL,SIG_IGN)
?Sachant qu’en tapant Ctrl-C durant l’exécution d’un processus le shell envoie un signal
SIGINT
à ce processus, comment feriez-vous pour qu’un de vos programmes puisse survivre à Ctrl-C ?Le programme
/Programmes/src/alarm.c
que nous avons utilisé pour illustrer l’appel système alarm(2) contient une condition de course qui peut dans certains cas empêcher l’interruption de l’appel système read(2). Un étudiant propose de résoudre ce problème en utilisant une variable modifiée par la fonction de traitement deSIGALRM
. Que pensez-vous du programme/Programmes/src/alarm3.c
?La page de manuel signal(7) définit les signaux suivants :
SIGSYS
SIGPIPE
Expliquez dans quels cas ces deux signaux peuvent être générés et délivrés à un processus.
Unix définit un signal
SIGCHLD
qui est envoyé lorsqu’un fils se termine. Quel est l’intérêt d’un tel signal pour le processus père?Un processus a exécuté une fonction de traitement du signal
SIGUSR1
et une autre fonction pour traiter le signalSIGUSR2
. La fonction qui traiteSIGUSR1
est une fonction assez complexe qui prend des centaines d’instructions. Que se passe-t-il si pendant que le processus est en train de traiter le signalSIGUSR1
, un autre processus lui envoie :SIGUSR1
SIGUSR2
Considérons la fonction de gestion des signaux suivante :
static void sig_handler(int signum) { char *msg="Reçu signal \n"; write(STDERR_FILENO,msg,strlen(msg)); }
Cette fonction utilise l’appel système write(2) qui peut modifier la variable
errno
en cas d’erreur. Modifiez-la de façon à ce que toute modification àerrno
n’affecte pas l’utilisation deerrno
dans le programme en cours d’exécution.Dans les programmes
/Programmes/src/process-sem-before.c
et/Programmes/src/process-sem-after.c
, on a choisi de créer le sémaphore dans un processus avec sem_open(3) et de le supprimer avec sem_unlink(3) dans un autre processus. Est-ce possible de créer et supprimer le sémaphore dans le même processus ?Un processus
P
ouvre le fichierfichier
avec l’appel système open(2). Celui-ci est associé au descripteurfd
. Ensuite, le processus utilise fork(2) pour créer un processus fils.- représenter les open-file objects utilisés
- le père et le fils peuvent-ils lire sur
fd
? - le processus fils utilise l’appel système chmod(2) pour rendre le fichier inaccessible en écriture et lecture. Après cette opération, le père et le fils peuvent-ils lire sur
fd
? - le père ferme le descripteur
fd
. Après cette opération, le père et le fils peuvent-ils lire surfd
? - le fils exécute unlink(2) sur le fichier. Après cette opération, le père et le fils peuvent-ils lire sur
fd
?
Même question que ci-dessus, mais en remplaçant le fichier par un sémaphore nommé et open(2) par sem_open(3) ?
Le programme
/Programmes/src/miniprojet.c
utilise des sémaphores nommés pour synchroniser la production/consommation entre deux processus. Le processus père crée le fichiermy_file.txt
y écrit une valeur. Le processus fils est chargé de lire la donnée présente dans le fichier et l’affiche à la console. Ce programme tourne à l’infini et donc il faut l’arrèter avec la commandeCtrl-C
. Malheureusement dans ce cas les sémaphores nommés ne sont pas supprimés correctement. Après avoir terminé le programme avec Ctrl-C vous verrez qu’il reste des sémaphores dans/dev/shm/
.Comment modifier ce programme pour gèrer la terminaison correcte des processus lors de la pression sur
Ctrl-C
. Pour ce faire, vous devez modifier le programme de façon à ce qu’il libère toutes les ressources allouées avant de se terminer. Ceci peut se faire en traitant le signal envoyé au processus par le shell lorsque l’utilisateur presseCtrl-C
.Faites les deux exercices INGInious sur les signaux et le sleep.