Travaux D - 02
Travaux D - 02
Travaux D - 02
Systèmes d’exploitation
ISPG 1
Système de fichier
2007-2008 Gestion des erreurs
Arguments du main
variables d’environnement
Première partie
TD 2
1 Représentation interne des fichiers
Exercice 1. Afin d’économiser de la place en mémoire, il est possible de regrouper différents objets
dans un même octet ou mot mémoire. en C, on utilise les champs de bits qui consistent en un
ensemble de bit consécutifs dans un mot qui se caractérise par le nombre de bits qui le composent.
Définir une structure de champs de bits qui permet de représenter le mode d’un fichier UNIX.
Exercice 2. Écrivez un programme qui prend en argument un fichier et renvoie :
1. son numéro de inode ;
2. le nombre de liens qu’il possède ;
3. son propriétaire ;
4. son groupe ;
5. sa taille ;
6. son type.
Vous utiliserez la fonction stat puis modifierez le programme afin d’utiliser la fonction fstat.
Exercice 3. Écrivez un programme qui interprète ses deux arguments comme des références de
fichiers et renvoie la valeur :
-1 sil le nombre de paramètres n’est pas correct ;
0 si les deux références correspondent à deux nœuds différents du système de gestion de fichiers ;
1 si elles correspondent au même nœud ;
2 si une erreur est rencontrée dans des appels à la primitive stat.
Exercice 4. Écrivez un programme qui recopie caractère par caractère le fichier donné en argument
sur la sortie standard, uniquement si le fichier donné en argument est un fichier régulier (en
utilisant la fonction fstat).
Exercice 5. Écrivez un programme qui effectue le travail de la commande cp en E-S de bas niveau.
1
Deuxième partie
TP 2
2 La gestion des erreurs
Les appels système apparaissent, traditionnellement, comme des fonctions à valeur entière et
l’échec d’un appel est matérialisé par une valeur de retour égale à −1. En cas d’échec d’un appel à
l’une de ces fonctions, il est possible d’obtenir une information plus précise sur la nature de l’erreur
rencontrée par l’intermédiaire de la variable entière externe errno. La valeur de la variable errno
n’est significative qu’au retour d’un appel à une fonction ayant échoué (la variable n’est pas affectée
au cours des appels réussis). La variable errno est définie dans le fichier errno.h qui contient la
liste des erreurs susceptibles de provoquer l’Échec d’un appel système. Dans ce même fichier, pour
chacune des valeurs possibles de errno, on trouve la définition d’une constante symbolique et un
texte en commentaire indiquant la nature de l’erreur. Il est possible, lorsqu’une fonction échoue
(valeur de retour −1 pour les fonctions à valeur numérique ou NULL pour celles renvoyant un
pointeur), de visualiser le message correspondant à l’erreur rencontrée au moyen de la fonction
void perror (const char *p_chaine) qui affiche le message associé à l’erreur, précédé de la
chaîne pointée par p_chaine (définie par l’utilisateur) suivie du séparateur :<space>.
Par ailleurs, deux variables sys_nerr et sys_errlist sont accessibles si elles ont été déclarées
externes dans le programme, sous la forme extern int sys_nerr; extern char *sys_errlist[];
sys_errlist est un tableau de sys_nerr pointeurs et pour chaque entier i, sys_errlist[i] est
un pointeur sur le message correspondant à l’erreur i.
Utiliser la gestion des erreurs dans les programmes à écrire dans la suite.
Le paramètre argc est le nombre total de paramètres. C’est à dire, le nombre de composantes
de la commande shell correspondante. Le paramètre argv est un tableau contenant les différents
paramètres de la commande. Il contient argc pointeurs (plus un pointeur NULL pour marquer
la fin). Le i-ème élément du tableau est le i-ème argument de la commande (le premier élément
du tableau, argv[0], pointe sur le nom de la commande). Le paramètre arge est une liste de
pointeurs permettant l’accès à l’environnement dans lequel le processus s’exécute. Chacun des
pointeurs permet d’accéder à une chaîne de caractères de la forme nom_variable=chaine_valeur
Ceci permet à un processus correspondant à l’exécution d’une commande tapée sous un shell
de s’exécuter dans l’environnement défini par l’utilisateur (par exemple, les variables TERM ou
PATH).
2
3.1 Accès à l’environnement
L’accès aux variables de l’environnement d’un processus peut se faire, dans un programme C,
de différentes façons.
Accès par la variable externe environ. L’environnement est également accessible au travers
de la variable externe environ. Le programme doit contenir la déclaration de cette variable sous la
forme extern char **environ;
#include<stdio.h>
void main (int argc, char *argv[], char **arge) {
extern **environ; char **env;
env = environ; /* préserve environ */
while ( *env != NULL )
puts( *env++);
}
3
#include<stdio.h>
#include<stdlib.h>
void main (int argc, char *argv[], char **arge) {
putenv("MYVAR=titi");
fprintf(stdout, "Vefir MYVAR = %s\n", getenv("MYVAR"));
}
4
4.4 Duplication de descripteurs
Cet exercice a pour but d’utiliser la fonction int dup().
Écrire un programme qui redirige la sortie d’erreur standard vers un fichier, fichier_erreur,
préalablement créé. C’est à dire, toute écriture de la forme write(2, ...) doit se faire dans le
fichier fichier_erreur. Le descripteur de valeur 2 étant au départ celui de la sortie d’erreur
standard. Quelle est la propriété de la fonction dup() qui est exploitée pour ainsi rediriger les E/S
standards ?
lstat est identique à stat, sauf qu’il donne le statut Généralement st_mtime est modifié par mknod(2), utime(2),
d’un lien lui-même et non pas du fichier pointé par ce et write(2). mais pas en cas de modification de pro-
lien.
priétaire, de groupe, de compte de liens physiques ou de
fstat est identique à stat, sauf que le fichier ouvert est mode.
pointé par le descripteur filedes, obtenu avec open(3).
Traditionnellement st_ctime est modifié par une écriture,
une lecture, ou une modification de données concernant
Les trois fonctions retournent une structure stat con- l’i-noeud (propriétaire, groupe, mode, etc...)
tenant les champs suivants : Les macros POSIX suivantes sont fournies pour manipuler
les statuts d’un fichier
struct stat
{ S_ISLNK(m) est-ce un lien symbolique ?
dev_t st_dev; /* Périphérique */
ino_t st_ino; /* Numéro i-noeud */ S_ISREG(m) un fichier régulier ?
mode_t st_mode; /* Protection */
nlink_t st_nlink; /* Nb liens matériels */ S_ISDIR(m) un répertoire ?
uid_t st_uid; /* UID propriétaire */
5
S_ISCHR(m) un péripherique en mode caractère ? ELOOP Trop de liens symboliques rencontrés dans le
chemin d’accès.
S_ISBLK(m) un périphérique en mode blocs ?
EFAULT Un pointeur se trouve en dehors de l’espace
S_ISFIFO(m) une FIFO ? d’adressage.
Les attributs suivants correspondent au champ st_mode. ENOMEM Pas assez de mémoire pour le noyau.
6
Christophe Blaess, 1997.
TRADUCTION