Examen de Systèmes II
Licence 2002-2003 Septembre

Exercice

Soit l'instruction:
for (i=0; i<n; i++) fork();
  1. dessinez l'arbre des processus créés lorsque n=1, n=2 et n=3
  2. combien de processus sont-ils créés dans le cas général ? Justifiez.

Exercice

Écrire une fonction C de prototype fonction(char *c[2],char *f[3]); réalisant par appels à des fonctions POSIX (system() est interdit) «l'équivalent» de la commande shell: c[0] <f[0] 2>f[1] | c[1] >f[2]

Exercice

Réimplémentez la fonction raise(int signal);

Exercice

  1. Écrire un programme permettant d'ajouter un caractère (tiré au hasard) toutes les secondes à la fin d'une chaîne de caractères;
  2. Ajouter une fonction, appelée à la réception du signal SIGUSR1, permettant d'afficher la chaîne;
  3. Ajouter une fonction, appelée à la reception du signal SIGUSR2, permettant de supprimer un caractère sur deux de la chaîne.

Problème

Il s'agit d'implémenter à l'aide des fonctionnalités POSIX vues en cours un système de gestion d'alarmes multiples permettant l'appel différé et asynchrone de fonctions arbitraires.

Il est demandé d'implémenter la fonction de prototype
int addalarm(int n,void (*f)());
permettant au processus appelant d'enregistrer une alarme supplémentaire (à celles déjà enregistrées par des appels à cette même fonction). L'enregistrement d'une alarme correspond au déclenchement d'un minuteur d'une durée de n secondes. Lorsque le délai est écoulé, le processus est alors interrompu et la fonction pointée par f passé en paramètre à l'enregistrement est appelée. L'appel renvoie l'identité de l'alarme.

En outre une fonction de prototype void removealarm(int id); devra permettre de désenregistrer une alarme dont l'identité id a été précédemment obtenue par un appel à addalarm().

  1. décrivez le principe de fonctionnement du mécanisme envisagé, ainsi que les structures de données utilisées et les fonctions utilitaires dont vous pouvez avoir besoin pour les manipuler,
  2. écrivez le code des différentes fonctions décrites.
Note: On rappelle que la fonction POSIX int alarm(int n); permet d'enregistrer un minuteur d'une durée de n secondes, que le minuteur précédent est annulé mais que le délai restant avant son déclenchement est alors renvoyé par la fonction. Le déclenchement du minuteur provoque l'envoi au processus d'un exemplaire du signal SIGALRM.

Jean-Baptiste Yunès 2003-09-08