Examen de Systèmes I -- Licence -- Janvier 2004

Exercice

Soit le «bout» de programme suivant:
umask(S_IXUSR|S_IWGRP|S_IROTH);
open("f",O_WRONLY|O_CREAT,S_IRWXU|S_IRGRP|S_IROTH|S_IWOTH);
  1. quels seront les droits d'accès associés au fichier f en cas de création effective ?

Exercice

Soit le fragment de programme suivant:
int d, i;
d = open("f",O_RDONLY);
read(d,&i,sizeof(i));
printf("J'ai lu %x (%d)\n",i,i); // affichage hexadécimal de la valeur
Soit le fichier f contenant les octets suivants: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.

L'exécution du fragment précédent (sur des machines différentes mais le même fichier) a fourni les résultats suivants:

machine résultat
$M_1$ 3020100 (50462976)
$M_2$ 10203 (66051)
  1. [1.] pouvez-vous expliquer pourquoi ?
  2. [2.] quelles auraient été les valeurs pour une seconde lecture de même nature (second appel à read avec les même paramètres) ?
Soit le fragment de programme suivant:
unsigned char c;
d = open(...);
for (i=0; i<sizeof(int); i++) {
  read(d,&c,1);
  printf("%x (%d)\n",c,c);
}
  1. [3.] quels seraient les affichages produits par ce programme sur la machine $M_1$ et le même fichier f?
  2. [4.] et sur $M_2$?

Exercice

Soit la suite de commandes suivante (on supposera que rien d'autre ne se passe dans le système qui ne soit ici «visible»):
<[/tmp]> cp f h
<[/tmp]> cp f h
<[/tmp]> cp f g
cp: `f' and `g' are the same file
<[/tmp]>
  1. après la première copie, que pouvez-vous dire du contenu des deux fichiers f et h?
  2. que signifie alors le message d'erreur obtenu à la troisième commande?
  3. écrire le code permettant de détecter une telle situation.

Problème

On vous demande d'implémenter une application permettant de diffuser des messages. Trois types d'applications interviennent: les envoyeurs, les récepteurs et les serveurs.

Les serveurs constituent un anneau: le serveur $s_i$ lit les messages en provenance du serveur $s_{i-1}$, les interprète puis les transmet (si nécessaire) au serveur $s_{i+1}$.

1.
quel(s) objet(s) de communication utiliserez-vous pour implémenter l'anneau?
2.
écrivez le code de la commande serveur correspondant, et donnez la/les commande(s) shell Unix permettant de créer l'anneau. On supposera l'existence d'une fonction travaille(...) qui sera appelée afin de réaliser le calcul du serveur.
On désire permettre d'ajouter ou supprimer un serveur dynamiquement dans un anneau déjà existant.
3.
décrivez succintement les mécanismes nécessaires à la réalisation de cette fonctionnalité.
4.
écrivez le code de la fonction travaille(...) correspondante.
Un récepteur s'enregistre auprès du serveur de son choix afin de pouvoir recevoir de celui-ci les messages diffusés sur l'anneau.
5.
décrivez succintement les mécanismes nécessaires à la réalisation de cette fonctionnalité.
6.
complétez, en conséquence, le code de la fonction travaille(...).
Un envoyeur adresse auprès du serveur de son choix un message afin qu'il soit diffusé à l'ensemble des récepteurs présents sur l'anneau.
7.
quel(s) problème(s) cela soulève-t'il?
8.
décrivez succintement les mécanismes nécessaires à la réalisation de cette fonctionnalité.
9.
complétez, en conséquence, le code de la fonction travaille(...).
10.
Si, en plus, on désire créer un client supplémentaire permettant d'obtenir la terminaison du service, comment doit-on s'y prendre?