UNIVERSITÉ BORDEAUX I U.F.R. Mathématiques et Informatique

2 juin 1998 J.Bétréma


Maîtrise d'Informatique
Architecture Unix

Durée: 2 heures
Tous documents interdits.


Voici le code source d'un programme nommé machin ; certaines lignes comportent une étiquette : dans les questions qui suivent, l'expression ligne i désigne la ligne d'étiquette /* i */.

#include <fcntl.h>

main (int argc, char **argv) {
  int d, code;
  
  d = open ("trace", O_WRONLY | O_CREAT | O_APPEND, 0644);  /* 1 */
  if (d == -1) {
    perror ("open");            /* 2 */
    exit (1);
  }
  if (d < 10)                   /* 3 */
    switch (fork ()) {          /* 4 */
      case -1 :
        perror ("fork");        /* 5 */
        exit (2);
      case 0 :
        argv[1][0]++;
        write (d, argv[1], 1);  /* 6 */
        execv (argv[0], argv);  /* 7 */
        perror ("execv");       /* 8 */
        exit (3);
      default :
        wait (&code);           /* 9 */
    }
  else write (d, "\n", 1);
  exit (0);
}

Ce programme est a priori obscur : il ne comporte pas de boucle, et le test de la ligne 3 est donc curieux. Voici un jeu d'essai (le fichier trace n'existe pas avant exécution de ces commandes) :

verlaine% machin beta
verlaine% cat trace
cdefghi
verlaine%

La question centrale est la question 6; elle seule demande un assez long développement. Les questions précédentes sont des questions d'échauffement. A chaque question sont liées une ou plusieurs caractéristiques du système Unix qu'il faut exposer pour obtenir le maximum de points. Le barème est indicatif.

  1. (2 points) Soit p0 le processus lancé par le shell pour exécuter le programme machin. Décrire précisément le résultat de l'exécution par p0 de l'appel-système open (ligne 1). Quelle est la valeur (très vraisemblable) de d ?

    Note : on rappelle que le fichier trace n'existe pas lors du lancement de p0.

  2. (2 points) Soit p1 le fils de p0 créé par l'appel-système fork (ligne 4). Décrire précisément le résultat de l'exécution par p1 de l'appel-système write (ligne 6). Quelle est la valeur de d ?

  3. (2 points) Voici un extrait de la page de manuel concernant les fonctions exec... :

    int execv (char *path, char *argv[]);

    [...]

    These routines provide various interfaces to the execve() system call. Refer to execve(2V) for a description of their properties; only brief descriptions are provided here.

    exec() in all its forms overlays the calling process with the named file, then transfers to the entry point of the core image of the file. There can be no return from a successful exec(); the calling core image is lost.

    The first argument is a pointer to the name of the file to be executed.

    Expliquer la différence de nature entre une fonction comme execv et l'appel-système execve . Que signifie overlay ? traduire et expliquer le mécanisme. Que signifie core image ? Expliquer pourquoi the calling core image is lost.

  4. (2 points) Décrire le résultat de l'exécution par p1 de la fonction execv (ligne 7).

  5. (2 points) p1 exécute à son tour l'appel-système open (ligne 1) : pourquoi ? Quelle est la valeur (très vraisemblable) de d ?

  6. (6 points) Détailler la suite des événements et expliquer ainsi le contenu final du fichier trace.

  7. (2 points) Voici un extrait du résultat de la commande ps lancée (depuis un autre shell) pendant l'exécution de p0 :

     PPID   PID  PGID  COMMAND
     1498  1499  1499  -bin/csh (csh)
     1499  2123  2123  machin beta
    

    Compléter cet extrait avec les lignes correspondant à p1 etc.

    Même question si l'on supprime l'appel-système wait (ligne 9).

  8. (1 point) La ligne 8 a-t-elle des chances d'être exécutée ?

  9. (3 points) On suppose que les tables internes du système sont de très petite taille (contrairement à un système Unix normal). Décrire sous cette hypothèse une situation qui provoque l'exécution de la ligne 2 ; idem pour la ligne 5 (préciser à chaque fois quelle table provoque l'échec de l'appel-système).


File translated from TEX by TTH, version 1.96.
On 18 Dec 1998, 19:43.