Questions à choix multiples

La matière couverte cette semaine porte sur le système de fichiers et sa manipulation par les processus.

Question 1. Accès aux fichiers

Les bits de permissions permet de contrôler l’accès aux fichiers. Considérons le répertoire ci-dessous :

-rw-r--r--  1 obo  obo   0 23 mar 21:57 a
-r-xr-x--x  1 obo  obo   0 23 mar 21:57 b
-rw-------  1 obo  obo   0 23 mar 21:57 c
-rw------x  1 obo  obo   0 23 mar 21:57 d
--w-----w-  1 obo  obo   0 23 mar 21:57 e
Un seul des groupes d’affirmations ci-dessous est vrai. Lequel ?
l’utilisateur obo peut lire le fichier c, exécuter le fichier b et modifier le contenu du fichier d
l’utilisateur obo peut lire le fichier a, exécuter le fichier b et modifier le contenu du fichier c

l’utilisateur obo peut lire le fichier e, exécuter le fichier b et modifier le contenu du fichier e

l’utilisateur obo peut lire le fichier c, exécuter le fichier d et modifier le contenu du fichier b

l’utilisateur obo peut lire le fichier c, exécuter le fichier a et modifier le contenu du fichier d

Question 2. Fichiers et répertoires

Les permissions associées aux répertoires ont un rôle un peu différent de celles qui sont associées aux fichiers. Considérons le répertoire ci-dessous qui contient 4 sous-répertoires.

drw-------  2 obo  obo   68 23 mar 22:25 a
dr-x------  2 obo  obo   68 23 mar 22:25 b
d-wx------  3 obo  obo  102 23 mar 22:27 c
drwx------  3 obo  obo  102 23 mar 22:26 d

Chacun de ces répertoires contient un fichier qui a comme nom f. La commande touch(1) peut être utilisée pour créer un fichier vide. Ainsi, dans ce répertoire, la commande touch f va créer le fichier f

ls -l f
-rw-r--r--  1 obo  obo  0 23 mar 22:30 f
Dans le répertoire ci-dessus, une seule séquence de commandes fonctionne sans erreur. Laquelle ?
ls -l d
touch c/x
cd b
ls -l b
cat c/f
cd d
ls -l c
touch d/x
cd a
ls -l c
touch a/x
cd c
ls -l b
touch b/x
cd b

Question 3. Permissions sur les fichiers

La page de manuel de chmod(1posix) décrit en détails les permissions relatives aux fichiers et répertoires. Ces permissions peuvent être représentées sous une forme numérique ou textuelle. Parmi les affirmations suivantes, relatives à des permissions pour des fichiers, un seul groupe est vrai. Lequel ?
  • Le fichier ayant 00467 comme permissions est exécutable par n’importe quel utilisateur
  • Le fichier ayant 00777 comme permissions est lisible par son propriétaire
  • Le fichier ayant 00600 ne peut être lu que par son propriétaire
  • Le fichier ayant 00647 comme permissions est exécutable par n’importe quel utilisateur
  • Le fichier ayant 00700 comme permissions est lisible par son propriétaire
  • Le fichier ayant 00421 comme permissions ne peut être lu que par son propriétaire
  • Le fichier ayant 00476 comme permissions est exécutable par n’importe quel utilisateur
  • Le fichier ayant 00747 comme permissions est lisible par son propriétaire
  • Le fichier ayant 00601 comme permissions ne peut être lu que par son propriétaire
  • Le fichier ayant 00677 comme permissions est exécutable par n’importe quel utilisateur
  • Le fichier ayant 00017 comme permissions est lisible par son propriétaire
  • Le fichier ayant 00400 comme permissions ne peut être lu que par son propriétaire
  • Le fichier ayant 00755 comme permissions est exécutable par n’importe quel utilisateur
  • Le fichier ayant 00417 comme permissions est lisible par son propriétaire
  • Le fichier ayant 00222 comme permissions ne peut être lu que par son propriétaire
  • Le fichier ayant 00666 comme permissions est exécutable par n’importe quel utilisateur
  • Le fichier ayant 00400 comme permissions est modifiable par son propriétaire
  • Le fichier ayant 00400 comme permissions ne peut être lu que par son propriétaire

Question 4. Permissions sur les fichiers

Les bits de permissions associés à un fichiers sont généralement représentés sous forme textuelle lorsque la commande ls(1) affiche le contenu d’un répertoire. Considérons le répertoire ci-dessous :

-rw-r--r--  1 obo  obo  0 23 mar 21:57 a
-rwxr-x--x  1 obo  obo  0 23 mar 21:57 b
-rw-------  1 obo  obo  0 23 mar 21:57 c
-rw------x  1 obo  obo  0 23 mar 21:57 d
--w-r--rw-  1 obo  obo  0 23 mar 21:57 e
Parmi les commandes suivantes, un seul groupe permet d’obtenir les mêmes permissions que ci-dessous. Lequel ?
chmod 644 a
chmod 751 b
chmod 600 c
chmod 601 d
chmod 246 e
chmod 446 a
chmod 157 b
chmod 006 c
chmod 106 d
chmod 642 e
chmod 444 a
chmod 751 b
chmod 600 c
chmod 604 d
chmod 123 e
chmod 322 a
chmod 364 b
chmod 300 c
chmod 301 d
chmod 123 e

.. comment::

Relisez la page de manuel de `chmod(1)`_

Question 5. Manipulation des répertoires

Les répertoires sont des fichiers spéciaux. Pour les utiliser, il faut faire appel aux fonctions opendir(3), readdir(3) et closedir(3).

/*
 * name!=NULL
 * retourne le nombre de fichiers dans le répertoire name
 * et -1 en cas d'erreur
 */
Parmi les séquences d’instructions ci-dessous, laquelle permet de compter le nombre de fichiers se trouvant dans le répertoire courant ?
int nfiles(char * name) {

  DIR *dirp;
  struct dirent *dp;
  dp=malloc(sizeof(struct dirent));
  if(dp==NULL) {
    return -1;
  }
  dirp = opendir(name);
  if(dirp==NULL) {
    return -1;
  }
  int count=0;
  while ((dp = readdir(dirp)) != NULL) {
     if (dp->d_type==DT_REG) {
       count++;
     }
  }
  int err = closedir(dirp);
  if(err<0) {
     return -1;
  }
  return(count);
}
int nfiles(char * name) {

  DIR *dirp;
  struct dirent *dp;
  dirp = opendir(name);
  if(dirp==NULL) {
    return -1;
  }
  int count=0;
  while (readdir(dirp) != NULL) {
       count++;
  }
  int err = closedir(dirp);
  if(err<0) {
     return -1;
  }
  return(count);
}
 int nfiles2(char * name) {

  DIR dirp;
  struct dirent dp;
  dirp = opendir(name);
  if(dirp==-1) {
    return -1;
  }
  int count=0;
  while ((dp = readdir(dirp)) != -1) {
       count++;
  }

  int err = closedir(dirp);
  if(err<0) {
    return -1;
  }
  return(count);
}
int nfiles(char * name) {

  DIR dirp;
  struct dirent dp;
  dirp = opendir(name);
  int count=0;
  while ((dp = readdir(dirp)) != NULL) {
     if (dp->d_type==DT_REG) {
       count++;
     }
  }
  int err = closedir(dirp);
  if(err<0) {
     return -1;
  }
  return(count);
}

Vérifiez vos réponses