• Aucun résultat trouvé

Répertoires de processus

Dans le document Programmation Avancée sous Linux (Page 151-159)

Soyez conscient du fait que les noms, la signification et les formats de sortie des entrées du système de fichiers/procpeuvent changer au fil des révisions du noyau Linux. Si vous les utilisez au sein d’un programme, assurez-vous que le comportement du programme reste cohérent si une entrée est absente ou formatée d’une façon inconnue.

7.2 Répertoires de processus

Le système de fichiers/proccontient un répertoire par processus s’exécutant sur le système.

Le nom de chacun de ces répertoires est l’identifiant du processus auquel il correspond1. Ces répertoires apparaissent et disparaissent dynamiquement lors du démarrage et de l’arrêt d’un processus. Chaque dossier contient plusieurs entrées donnant accès aux informations sur le processus en cours d’exécution. C’est de ces répertoires de processus que le système de fichiers /proc tire son nom.

1Sur certains systèmes UNIX, les identifiants de processus sont alignés au moyen de zéros. Ce n’est pas le cas sous GNU/Linux.

Chaque répertoire de processus contient ces fichiers :

– cmdline contient la liste d’argument du processus. L’entrée cmdline est décrite dans la Section 7.2.2, « Liste d’arguments d’un processus ».

– cwdest un lien symbolique pointant vers le répertoire de travail courant du processus (qui peut être défini par exemple, via un appel àchdir).

– environ contient l’environnement du processus. Le fichier environ est décrit dans la Section 7.2.3, « Environnement de processus ».

– exeest un lien symbolique pointant vers l’image binaire exécutée par le processus. L’entrée exeest décrite dans la Section 7.2.5, « Descripteurs de fichiers d’un processus ».

– mapscontient des informations sur les fichiers mis en correspondance avec l’espace mémoire du processus. Consultez le Chapitre 5, Section 5.3, « Mémoire mappée », pour plus de dé-tails sur le fonctionnement des fichiers mis en correspondance avec la mémoire. Pour chaque fichier mis en correspondance, maps affiche l’intervalle d’adresses de l’espace mémoire du processus avec lequel le fichier est mis en correspondance, les permissions applicables à ces adresses, le nom du fichier ainsi que d’autres informations.

Le tableau maps affiche pour chaque processus le fichier binaire en cours d’exécution, les bibliothèques partagées actuellement chargées et les autres fichiers que le processus a mis en correspondance avec sa mémoire.

– root est un lien symbolique vers le répertoire racine du processus. Généralement, il s’agit d’un lien vers /, le répertoire racine du système. Le répertoire racine d’un processus peut être changé par le biais de l’appel chrootou de la commande chroot2.

– stat contient des statistiques et des informations sur le statut du processus. Ce sont les mêmes données que celles présentées dans le fichier status, mais au format numérique brut, sur une seule ligne. Ce format est difficile à lire mais plus adapté au traitement automatique par des programmes.

Si vous voulez utiliser le fichier stat dans vos programmes, consultez la page de manuel de proc qui décrit son contenu en invoquantman 5 proc.

– statm contient des informations sur la mémoire utilisée par le processus. Le fichierstatm est décrit dans la Section 7.2.6, « Statistiques mémoire de processus ».

– statuscontient des informations statistiques et statut sur le processus formatée de façon à être lisibles par un humain. La Section 7.2.7, « Statistiques sur les processus » présente une description du fichierstatus.

– Le fichier cpun’apparaît que sur les noyaux Linux SMP. Il contient un récapitulatif de la consommation en temps (utilisateur et système) du processus, par processeur.

Notez que pour des raisons de sécurité, les permissions de certains fichiers sont définies de façon à ce que seul l’utilisateur propriétaire du processus (ou le superutilisateur) puisse y accéder.

7.2.1 /proc/self

Une entrée particulière dans le système de fichiers /proc facilite son utilisation par un programme pour obtenir des informations sur le processus au sein duquel il s’exécute. L’entrée

2L’appel et la commandechrootsortent du cadre de ce livre. Consultez la page de manuel dechrootdans la section 1 pour des informations sur la commande (man 1 chroot) ou la page de manuel de chroot dans la section 2 (man 2 chroot) pour plus d’informations sur l’appel.

7.2. RÉPERTOIRES DE PROCESSUS 139 /proc/self est un lien symbolique vers le répertoire de /proc correspondant au processus courant. La destination du lien/proc/selfdépend du processus qui l’utilise : chaque processus voit son propre répertoire comme destination du lien.

Par exemple, le programme du Listing 7.2 utilise la destination du lien /proc/self pour déterminer son identifiant de processus (nous ne faisons cela que dans un but d’illustration ; l’appel de la fonction getpid, décrite dans le Chapitre 3, « Processus », Section 3.1.1, « Identi-fiants de processus » constitue une façon beaucoup plus simple d’arriver au même résultat). Ce programme utilise l’appel système readlink, présenté dans la Section 8.11, «readlink: lecture de liens symboliques », pour extraire la cible du lien.

Listing 7.2 – (get-pid.c) – Récupérer son PID à partir de /proc/self

1 # i n c l u d e < s t d i o . h >

2 # i n c l u d e < sys / t y p e s . h >

3 # i n c l u d e < u n i s t d . h >

4

5 /* R e n v o i e l ’ i d e n t i f i a n t de p r o c e s s u s de l ’ a p p e l a n t , d é t e r m i n é à p a r t i r du

6 l i e n s y m b o l i q u e / p r o c / s e l f . */

7

8 p i d _ t g e t _ p i d _ f r o m _ p r o c _ s e l f ()

9 {

10 c h a r t a r g e t [ 3 2 ] ;

11 i n t pid ;

12 /* Lit la c i b l e du l i e n s y m b o l i q u e . */

13 r e a d l i n k ( " / p r o c / s e l f " , target , s i z e o f ( t a r g e t ) ) ;

14 /* La c i b l e est un r é p e r t o i r e p o r t a n t de nom du PID . */

15 s s c a n f ( target , " % d " , & pid ) ;

16 r e t u r n ( p i d _ t ) pid ;

17 }

18 i n t m a i n ()

19 {

20 p r i n t f ( " / p r o c / s e l f r e n v o i e l ’ i d e n t i f i a n t % d \ n " ,

21 (i n t) g e t _ p i d _ f r o m _ p r o c _ s e l f () ) ;

22 p r i n t f ( " g e t p i d () r e n v o i e l ’ i d e n t i f i a n t % d \ n " , (i n t) g e t p i d () ) ;

23 r e t u r n 0;

24 }

7.2.2 Liste d’arguments d’un processus

Le fichiercmdlinecontient la liste d’arguments du processus (consultez le Chapitre 2, « Écrire des logiciels GNU/Linux de qualité », Section 2.1.1, « La liste d’arguments »). Les arguments sont présentés sous forme d’une seule chaîne de caractères, les arguments étant séparés par des NUL. La plupart des fonctions de traitement de chaînes de caractères s’attendent à ce la chaîne en elle-même soit terminée par unNULet ne géreront pas lesNULcontenus dans la chaîne correctement, vous aurez donc à traiter le contenu de cette chaîne d’une façon spéciale.

Dans la Section 2.1.1, nous avons présenté un programme, Listing 2.1, qui affichait sa liste d’arguments. En utilisant l’entréecmdlinedu système de fichiers/proc, nous pouvons créer un programme qui affiche la liste d’arguments d’un autre processus. Le Listing 7.3 est un programme de ce type ; il affiche la liste d’arguments du processus dont l’identifiant est passé en paramètre.

Comme il peut y avoir plusieursNULdans le contenu de cmdline et non un seul en fin de chaîne,

NUL et NULL

NULest le caractère dont la valeur décimale est 0. Il est différent deNULL, qui est un pointeur avec une valeur de 0. En C, une chaîne de caractères est habituellement terminée par un caractère NUL. Par exemple, la chaîne de caractères"Coucou !"occupe 9 octets car il y a unNULimplicite après le point d’exclamation indiquant la fin de la chaîne.

NULL, par contre, est une valeur de pointeur dont vous pouvez être sûr qu’elle ne correspondra jamais à une adresse mémoire réelle dans votre programme.

En C et en C++,NULest représenté par la constante de caractère’0’, ou(char) 0. La définition de NULL diffère selon le système d’exploitation ; sous Linux, NULL est défini comme((void*)0) en C et tout simplement 0 en C++.

nous ne pouvons pas déterminer la taille de la chaîne en utilisant strlen (qui se contente de compter le nombre de caractères jusqu’à ce qu’elle rencontre un NUL). Au lieu de cela, nous déterminons la longueur decmdline grâce àread, qui renvoie le nombre d’octets lus.

Listing 7.3 – (print-arg-list.c) – Affiche la Liste d’Arguments d’un Processus

1 # i n c l u d e < f c n t l . h >

7.2. RÉPERTOIRES DE PROCESSUS 141

Supposons que le processus 372 soit le démon de journalisation système,syslogd.

% ps 372

Dans ce cas, syslogd a été invoqué avec les arguments-m 0.

7.2.3 Environnement de processus

Le fichierenvironcontient l’environnement du processus (consultez la Section 2.1.6, « L’en-vironnement »). Comme pour cmdline, les différentes variables d’environnement sont séparées par desNUL. Le format de chaque élément est le même que celui utilisé dans la variableenviron, à savoir VARIABLE=valeur.

Le Listing 7.4 présente une généralisation du programme du Listing 2.3 de la Section 2.1.6.

Cette version prend un identifiant du processus sur la ligne de commande et affiche son environ-nement en le lisant à partir de /proc.

Listing 7.4 – (print-environment.c) – Affiche l’Environnement d’un Processus

1 # i n c l u d e < f c n t l . h >

24 c l o s e ( fd ) ;

L’entrée exe pointe vers le fichier binaire exécuté par le processus. Dans la Section 2.1.1, nous avons expliqué que le nom de ce fichier est habituellement passé comme premier élément de la liste d’argument. Notez cependant qu’il s’agit d’une convention ; un programme peut être invoqué avec n’importe quelle liste d’arguments. Utiliser l’entrée exe du système de fichiers /proc est une façon plus fiable de déterminer le fichier binaire en cours d’exécution.

De même, il est possible d’extraire l’emplacement absolu de l’exécutable, à partir du système de fichiers /proc. Pour beaucoup de programmes, les fichiers auxiliaires se trouvent dans des répertoires relatifs à l’exécutable, il est donc nécessaire de déterminer où se trouve réelle-ment le fichier binaire. La fonction get_executable_path du Listing 7.5 détermine le chemin du fichier binaire s’exécutant au sein du processus appelant en examinant le lien symbolique /proc/self/exe.

Listing 7.5 – (get-exe-path.c) – Obtient l’Emplacement du Fichier Binaire en Cours d’Exécution

7.2. RÉPERTOIRES DE PROCESSUS 143

Le répertoire fd contient des sous-répertoires correspondant aux descripteurs de fichiers ouverts par un processus. Chaque entrée est un lien symbolique vers le fichier ou le périphérique désigné par le descripteur de fichier. Vous pouvez lire ou écrire sur ces liens symboliques ; cela revient à écrire ou à lire depuis le fichier ou le périphérique ouvert dans le processus cible. Les noms des entrées du sous-répertoire fdcorrespondent aux numéros des descripteurs de fichiers.

Voici une astuce amusante que vous pouvez essayer avec les entréesfdde/proc. Ouvrez une nouvelle fenêtre de terminal et récupérez l’identifiant de processus du processus shell en lançant ps.

% ps

PID TTY TIME CMD

1261 pts/4 00:00:00 bash 2455 pts/4 00:00:00 ps

Dans ce cas, le shell (bash) s’exécute au sein du processus 1261. Ouvrez maintenant une seconde fenêtre et jetez un oeil au contenu du sous-répertoire fd pour ce processus.

% ls -l /proc/1261/fd total 0

lrwx--- 1 samuel samuel 64 Jan 30 01:02 0 -> /dev/pts/4 lrwx--- 1 samuel samuel 64 Jan 30 01:02 1 -> /dev/pts/4 lrwx--- 1 samuel samuel 64 Jan 30 01:02 2 -> /dev/pts/4

(Il peut y avoir d’autres lignes si d’autres fichiers sont ouverts). Souvenez-vous de ce que nous avons dit dans la Section 2.1.4, « E/S standards » : les descripteurs de fichiers 0, 1 et 2 sont initialisés pour pointer vers l’entrée, la sortie et la sortie d’erreurs standards, respectivement.

Donc, en écrivant dans le fichier/proc/1261/fd/1vous pouvez écrire sur le périphérique attaché

à stdout pour le processus shell – dans ce cas, un pseudo TTY correspondant à la première fenêtre. Dans la seconde fenêtre, essayez d’écrire un message dans ce fichier :

% echo "Coucou." >> /proc/1261/fd/1

Le texte apparaît dans la première fenêtre.

Les descripteurs de fichiers autres que l’entrée, la sortie et la sortie d’erreurs standards apparaissent dans le sous-répertoire fd. Le Listing 7.6 présente un programme qui se contente d’ouvrir un descripteur pointant vers un fichier passé sur la ligne de commande et de boucler indéfiniment.

Listing 7.6 – (open-and-spin.c) – Ouvre un Fichier en Lecture

1 # i n c l u d e < f c n t l . h >

2 # i n c l u d e < s t d i o . h >

3 # i n c l u d e < sys / s t a t . h >

4 # i n c l u d e < sys / t y p e s . h >

5 # i n c l u d e < u n i s t d . h >

6

7 i n t m a i n (i n t argc , c h a r* a r g v [])

8 {

9 c o n s t c h a r* c o n s t f i l e n a m e = a r g v [ 1 ] ;

10 i n t fd = o p e n ( f i l e n a m e , O _ R D O N L Y ) ;

11 p r i n t f ( " d a n s le p r o c e s s u s % d , le d e s c r i p t e u r % d p o i n t e v e r s % s \ n " ,

12 (i n t) g e t p i d () , (i n t) fd , f i l e n a m e ) ;

13 w h i l e (1) ;

14 r e t u r n 0;

15 }

Essayez de le lancer dans une fenêtre :

% ./open-and-spin /etc/fstab

dans le processus 2570, le descripteur 3 pointe vers /etc/fstab

Dans une autre fenêtre, observez le contenu du sous-répertoirefdcorrespondant à ce processus.

% ls -l /proc/2570/fd total 0

lrwx--- 1 samuel samuel 64 Jan 30 01:30 0 -> /dev/pts/2 lrwx--- 1 samuel samuel 64 Jan 30 01:30 1 -> /dev/pts/2 lrwx--- 1 samuel samuel 64 Jan 30 01:30 2 -> /dev/pts/2 lr-x--- 1 samuel samuel 64 Jan 30 01:30 3 -> /etc/fstab

Notez que l’entrée du descripteur de fichier 3 est liée au fichier /etc/fstabvers lequel pointe le descripteur.

Les descripteurs de fichiers peuvent pointer vers des sockets ou des tubes (consultez le Chapitre 5 pour plus d’informations). Dans un tel cas, la cible du lien symbolique correspondant au descripteur de fichier indiquera « socket » ou « pipe » au lieu de pointer vers un fichier ou un périphérique classique.

7.2.6 Statistiques mémoire de processus

L’entrée statm contient une liste de sept nombres, séparés par des espaces. Chaque valeur correspond au nombre de pages mémoire utilisées par le processus dans une catégorie donnée.

Les voici , dans l’ordre :

7.3. INFORMATIONS SUR LE MATÉRIEL 145

Dans le document Programmation Avancée sous Linux (Page 151-159)