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
obo peut lire le fichier c, exécuter le fichier b et modifier le contenu du fichier dobo peut lire le fichier a, exécuter le fichier b et modifier le contenu du fichier cl’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
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¶
- Le fichier ayant
00467comme permissions est exécutable par n’importe quel utilisateur - Le fichier ayant
00777comme permissions est lisible par son propriétaire - Le fichier ayant
00600ne peut être lu que par son propriétaire
- Le fichier ayant
00647comme permissions est exécutable par n’importe quel utilisateur - Le fichier ayant
00700comme permissions est lisible par son propriétaire - Le fichier ayant
00421comme permissions ne peut être lu que par son propriétaire
- Le fichier ayant
00476comme permissions est exécutable par n’importe quel utilisateur - Le fichier ayant
00747comme permissions est lisible par son propriétaire - Le fichier ayant
00601comme permissions ne peut être lu que par son propriétaire
- Le fichier ayant
00677comme permissions est exécutable par n’importe quel utilisateur - Le fichier ayant
00017comme permissions est lisible par son propriétaire - Le fichier ayant
00400comme permissions ne peut être lu que par son propriétaire
- Le fichier ayant
00755comme permissions est exécutable par n’importe quel utilisateur - Le fichier ayant
00417comme permissions est lisible par son propriétaire - Le fichier ayant
00222comme permissions ne peut être lu que par son propriétaire
- Le fichier ayant
00666comme permissions est exécutable par n’importe quel utilisateur - Le fichier ayant
00400comme permissions est modifiable par son propriétaire - Le fichier ayant
00400comme 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
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
*/
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);
}
en’est pas lisible par cet utilisateur.