Principes fondamentaux des systèmes d’exploitation 2016/2017

DII3 - 2ème semestre - 07 Juin 2017 - Durée : 1 heure

Documents non-autorisés : - Les emails - les messageries

Consignes

Les réponses aux questions sur les travaux pratiques doivent être écrites dans un fichier texte nommé “réponses.txt”.

Chaque exercice donne lieu à un fichier C unique nommé avec le numéro de l’exercice: “exercice1.c”

Les fichiers devront être zipés et envoyés sur l’adresse XXXXXXXXXXXXXXXXXX dans un message ayant l’objet suivant :

[TP SE][ETUDIANT_1][ETUDIANT_2]

Questions sur les travaux pratiques

  1. Quelles sont les principales différences entre un processus lourd (fork()) et un processus léger (thread_create()) ?
  2. Quel est l’effet du code suivant ?
    signal(SIGINT, SIG_DFL);

Exercice 1

Ecrivez un programme qui initialise un pipe et créé un processus fils.

Le processus père écrit les messages suivants dans le pipe, attend la fin du processus fils puis se termine.

  • "Hello from parent!"
  • "Hello from parent again!"
  • "exit"

Le processus fils redirige son entrée standard vers la partie de lecture du pipe, affiche les trois messages présents dans l’entrée standard puis se termine.

Astuce 1: La fonction getchar() permet la lecture de l’entrée standard

Exercice 2

Modifiez le programme précédent (en faire une copie) pour que le processus fils initie deux threads:

  • Un thread “producteur” qui lit l’entrée standard et y inscrit le résultat dans une variable partagée (char message[100])
  • Un thread “consommateur” qui attend la présence d’un message dans la variable partagée puis l’affiche sur la sortie standard.

Le processus fils attend la fin des deux threads pour se terminer.

Afin de faire attendre le thread “consommateur”, un sémaphore message_was_written est utilisé. Afin de faire attendre le thread “producteur”, un sémaphore message_was_read est utilisé.

Le “consommateur” attend qu’un message soit disponible via le sémaphore message_was_written, l’affiche puis notifie le producteur de la lecture du message via le sémaphore message_was_read.

Le “producteur” attend qu’un message soit lu via le sémaphore message_was_read, écrit le message dans la variable partagée puis notifie le “consommateur” via le sémaphore “message_was_written”.

Astuce 1: Attention aux valeurs d’initialisation des sémaphores !

Astuce 2: ne pas oublier de compiler avec l’option -pthread

Exercice 3

Adaptez le programme précédent (en faire une copie) afin que le processus père puisse envoyer autant de messages qu’il désire vers le fils. Le dernier message devra être "exit".