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

Questions C

Les réponses aux questions qui suivent se doivent d'être brèves et concises: i.e. quelques mots suffisent!
  1. on suppose avoir déclaré les variables suivantes: int i, *p, **q, t[3];. Quelles expressions/instructions (parmi les suivantes) posent problème (et quel(s) problème(s): compilation, exécution) ?
    1. p=(int *)80; *p=12;
    2. i=80; p=&i;
    3. p=&i; q=&p; (*q)[0]=12;
    4. q=&t; p=t+3; i=p-*q; p[0]=12;
  2. quel(s) problème(s) le code suivant pose t-il ?
    int *f(int i) {
        int t[] = { 0, 1, 2, 3, 4, 5 };
        return t+i; 
    }
    
    Et si l'on ajoute static devant la déclaration du tableau t ?
  3. en supposant qu'un programme C est contenu dans le fichier de nom main.c, quelle(s) commande(s) Unix utiliseriez-vous pour générer un exécutable correspondant de nom monexec ?

Questions Unix

Les réponses aux questions qui suivent se doivent d'être brèves et concises: i.e. quelques mots suffisent!
  1. indiquez à quoi sert le «droit d'écriture» pour les répertoires.
  2. quels droits d'accès devez-vous positionner sur un répertoire vous appartenant pour autoriser n'importe qui à y «faire un ls» pour voir ce qu'il y a dedans, mais à interdire quiconque d'accéder à un seul des fichiers ?

Exercice

Soit l'extrait de code suivant:
d = open("fic",O_RDONLY);
d2 = open("fic",O_WRONLY|O_APPEND);
while ((read(d,&c,1)>0)
    if (write(d2,&c,1)!=1) exit(EXIT_FAILURE);
  1. on suppose l'existence d'un fichier de nom fic contenant toto. Que contient le fichier fic après l'exécution du programme ?
  2. que cela change t-il si les accès au fichier sont effectués à l'aide de «la couche C» (c'est-à-dire fopen, fread, fwrite) ?
  3. si fic n'est plus un fichier, mais un tube nommé que cela changerait-il ?
  4. si fic est un tube nommé et que l'ouverture de d utilise en plus O_NONBLOCK, que se passerait-il ?

Exercice

Écrire en langage C une commande permettant de recopier une partie de l'arborescence d'un système de fichier Unix en un autre point de l'arbre. Cette commande serait équivalente à la commande cp -r.

Problème

On se propose d'écrire un petit système transactionnel permettant de réaliser des opérations sur des comptes bancaires.

Les utilisateurs de ce système sont identifiés par leur uid.

Le solde du compte bancaire d'un utilisateur d'identité i est le ie entier du fichier de nom comptes.

  1. Écrire une commande (ne prenant aucun argument) permettant de consulter le solde du compte de l'utilisateur. Cette commande sera appelée solde.
  2. Écrire une commande permettant de réaliser une opération de débit ou de crédit sur le compte de l'utilisateur. Deux options sont possibles : -d pour effectuer un retrait et -c pour un dépôt. Le prototype de la commande est le suivant :
    operation -d|-c <valeur-numérique-positive>.
  3. Comment empêcher un utilisateur d'écrire un programme permettant de lire/modifier le solde d'un compte ne lui appartenant pas ?
  4. Que pensez-vous de l'utilisation concurrente de ces commandes ? Comment y remédier ? Écrire le code permettant de résoudre le(s) problème(s).