Examen de Systèmes II -- Licence -- Septembre 2005

Exercice

Quelle(s) différence(s) faites-vous concernant la terminaison des processus correspondant à l'exécution de chacun de ces programmes:
int main() {                 int main() {                int main() {
  ...                          ...                         ...
  return EXIT_SUCCESS;         exit(EXIT_SUCCESS);        _exit(EXIT_SUCCESS);
}                            }                           }

Exercice

  1. Que produit, du point de vue de la «génétique» des processus, l'exécution du programme suivant:
    if (fork()!=0) while(1);
    else           _exit(0);
    
  2. et celui-ci:
    if (fork()==0) while(1);
    else           _exit(0);
    

Exercice

Soit le programme:
fork(); if (fork()) fork();
fork(); if (fork()) fork();
  1. Combien de processus sont-ils créés à l'exécution du programme (on supposera qu'aucun appel n'échoue) ?
  2. Dessinez l'arbre de création des processus

Exercice

Écrire (en C) une commande vivant delai commande [args...] permettant d'exécuter la commande (avec ses arguments) sous le contrôle de l'utilisateur de telle sorte que ce dernier soit obligé de frapper ^C à intervalles réguliers (inférieurs à délai secondes) afin de ne pas interrompre son exécution. On obligera ainsi l'utilisateur à rester éveillé devant sa console et à en donner la preuve! Si le caractère ^C n'est pas frappé dans le temps imparti, on veillera à ce que l'exécution de la sous-commande soit interrompue le plus proprement possible.

Exercice

Réaliser un programme permettant de simuler un embryon de système bancaire. Le système repose sur (au moins) deux processus s'échangeant des informations par l'intermédiaire d'un tube nommé.

Le premier processus (le client) écrit dans le tube à intervalles réguliers trois entiers (pris au hasard mais dans des bornes raisonnables!) cd,cc et s représentant respectivement le compte à débiter, le compte à créditer et la somme à faire transiter de l'un à l'autre des comptes et prévient la banque (lire plus bas) de l'existence d'une opération en lui envoyant le signal SIGILL.

Le second processus (la banque), à la réception du signal SIGILL, lit dans le tube trois entiers successifs et réalise les opérations sur les comptes concernés (ces comptes étant simplement représentés par les entrées d'un tableau d'entiers). De plus, ce processus devra à la réception du signal SIGUSR1 afficher l'état cohérent de tous les comptes qu'il détient et à la réception du signal SIGUSR2 remettre à zéro l'ensemble des comptes.

Écrire un programme (à exécuter en ligne de commande: banque n) permettant de lancer n processus clients et un processus banque (tous communiquant par l'intermédiaire du même tube anonyme).
On veillera à s'assurer de la cohérence des données affichées, il est facile de se convaincre que jamais la banque ne gagne ni ne perd d'argent...
On prendra soin, aussi, de terminer proprement l'exécution de ce système lorsque l'utilisateur envoie le signal SIGHUP à la banque.

Exercice

Un vendeur de voiture organise l'essai d'un nouveau modèle de la façon suivante. Le tour d'essai dure 10 minutes et n'a lieu que lorsqu'un visiteur demande à monter. Le comportement (un peu obsessionnel) de chaque visiteur est le suivant: il tente de monter dans la voiture (sinon attend que la voiture revienne de l'essai en cours), effectue son essai (10 minutes), descend de la voiture, visite le magasin pendant une durée quelconque comprise entre 1 et 50 minutes puis recommence.
  1. quels mécanismes Unix utiliserez-vous pour réaliser une simulation de ce problème ? Justifiez.
  2. écrire un algorithme simulant le problème.
  3. écrire le programme essai n permettant de simuler une journée d'essai avec n clients.
  4. sauriez-vous transformer le problème afin de permettre à deux visiteurs (exactement) d'essayer la voiture ensemble ?