Exercices

  1. En utilisant signal(2), écrivez une fonction C sig_ignored qui prend comme argument un numéro de signal et retourne true si le signal passé en argument est ignoré par le processus et false sinon.

  2. A votre avis, pourquoi le système d’exploitation refuse-t-il l’exécution de la ligne signal(SIGKILL,SIG_IGN) ?

  3. 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 ?

  4. 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 de SIGALRM. Que pensez-vous du programme /Programmes/src/alarm3.c ?

  5. 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.

  6. 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?

  7. Un processus a exécuté une fonction de traitement du signal SIGUSR1 et une autre fonction pour traiter le signal SIGUSR2. La fonction qui traite SIGUSR1 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 signal SIGUSR1, un autre processus lui envoie :

    • SIGUSR1
    • SIGUSR2
  8. 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 de errno dans le programme en cours d’exécution.

  9. 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 ?

  10. Un processus P ouvre le fichier fichier avec l’appel système open(2). Celui-ci est associé au descripteur fd. 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 sur fd ?
    • 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 ?
  11. Même question que ci-dessus, mais en remplaçant le fichier par un sémaphore nommé et open(2) par sem_open(3) ?

  12. 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 fichier my_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 commande Ctrl-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 presse Ctrl-C.

  13. Faites les deux exercices INGInious sur les signaux et le sleep.

Verifiez vos réponses