Examen de Systèmes -- Licence 3 -- Janvier 2006

Questions C

Les réponses aux questions qui suivent se doivent d'être brèves et concises: i.e. quelques mots suffisent!
  1. quelle différence faites-vous entre les expressions O_WRONLY|O_CREAT, O_WRONLY|O_CREAT|O_CREAT, O_WRONLY+O_CREAT et O_WRONLY+O_CREAT+O_CREAT ?
  2. que pensez-vous de l'instruction if (c=0) {...} else {...} (en particulier de l'expression de test) ?
  3. soit l'expression a=f()==0, combien vaut a après, et quelle est la valeur de l'expression ?
  4. soit la définition int *p, *q, en supposant que p est égal à 0x120560 et que q est égal à 0x120580, sachant que q-p vaut 8, que vaut l'expression p+02 ?

Questions Unix

Les réponses aux questions qui suivent se doivent d'être brèves et concises: i.e. quelques mots suffisent!
  1. indiquer à quoi sert le «droit d'exécution» pour les répertoires.
  2. quel(s) droit(s) correspond(ent) à l'autorisation de supprimer un fichier ?
  3. expliquer comment les systèmes de la famille Unix font pour «détecter» la «fin de fichier» lors d'une opération de lecture.
  4. qu'est ce qu'un «shell » ?

Exercice

Soit l'extrait de code suivant:
while (...) {
  ...
  lseek(d,SEEK_END,(off_t)0);
  write(d,&s,sizeof(s));
  ...
}
On supposera que le descripteur d est ouvert correctement et que s désigne une variable de type quelconque.
  1. pouvez-vous dire ce que réalise ce code lorsqu'on l'exécute seul ?
  2. pouvez-vous dire quel(s) problème(s) ce code pose t-il lorsqu'il est exécuté en concurrence ?
Soit l'extrait de code suivant:
while (...) {
  ...
  lseek(d,SEEK_END,(off_t)0);
  write(d,s,strlen(s)+1);
  ...
}
On supposera que le descripteur d est ouvert correctement, que s désigne un pointeur sur char et que ce pointeur est régulièrement modifié (mais désigne toujours une chaîne de caractère à la C) dans la boucle.
3.
pouvez-vous dire ce que réalise ce code lorsqu'on l'exécute seul ?
4.
pouvez-vous dire quel(s) problème(s) ce code pose t-il lorsqu'il est exécuté en concurrence ?
5.
quelle(s) instruction(s) peut-on rajouter avant la boucle while afin de réaliser effectivement ce que l'on cherche visiblement à faire ?
6.
à quelle condition cette modification fonctionnera t-elle ?

Exercice

d1 = open("f",O_RDWR);
d2 = open("f",O_WRONLY);
d3 = dup(d1);
for (i=0; i<5; i++) {
  lseek(d1,(off_t)0,SEEK_CUR);
  lseek(d2,(off_t)3,SEEK_CUR);
  lseek(d3,(off_t)6,SEEK_CUR);
  write(d1,"abc",3);
  write(d2,"ABC",3);
  write(d3,"def",3);
}
close(d1); close(d2); close(d3);
  1. Que contiendra le fichier f après l'exécution du code précédent ? On supposera que les conditions de bon fonctionnement des différentes fonctions appelées sont toutes réunies.
  2. Décrivez l'état des entrées des différentes tables du système ainsi que leurs modifications lors de l'exécution du code.

Exercice

Écrivez un programme qui lorsqu'il est exécuté à l'aide d'une ligne de commande de la forme lance $c_1$ $c_2\ldots$ $c_n$ permet d'exécuter en séquence les commandes $c_i$.

Problème

  1. Écrire une commande de nom lpd chargée de simuler le démon d'impression d'un système. Cette commande lira dans tube nommé (de nom /tmp/printer0) la référence d'un fichier (sous la forme d'une simple chaîne de caractère) à imprimer, recopiera alors le contenu du fichier correspondant dans un périphérique (de nom /dev/lp0) puis recommencera. On fera ce qu'il faut pour qu'en cas d'existence d'un exemplaire de ce démon, toute tentative de lancement de l'exécution d'un autre provoque la terminaison immédiate du second.

  2. Quels droits/propriétaires doit-on positionner sur les fichiers /tmp/printer0 et /dev/lp0 de sorte que personne ne puisse écrire directement sur l'imprimante, personne d'autre que la commande lpd ne puisse extraire les requêtes et que ce démon puisse lire effectivement les fichiers correspondant aux requêtes ?

  3. Écrire une commande de nom lpr chargée de simuler la commande de requête d'impression d'un système. Cette commande prendra en paramètre la référence d'un fichier et écrira la référence absolue correspondante dans le tube correspondant du démon lpd.

  4. On souhaite désormais modifier le démon de sorte qu'il puisse gérer des impressions sur deux imprimantes, c'est-à-dire imprimer les fichiers correspondant aux requêtes de /dev/printer0 sur /dev/lp0, et ceux de /dev/printer1 sur /dev/lp1. Quels problèmes cela pose t-il ? Quelle(s) solution(s) entrevoyez-vous ?

  5. Écrivez le code correspondant à vos réponses à la question 4.


Jean-Baptiste Yunès 2006-02-02