Systèmes et Réseaux (SR1)
- MIAGE 2
Systèmes d'exploitation
TP n°1 : Processus Unix
Commande de compilation d'un programme C : gcc -o prog prog1.c prog2.c ... progn.c
Librairie à utiliser (inclure csapp.h aux programmes du TP) : csapp.h et csapp.c
Pour utiliser csapp, ajouter les options suivantes dans la commande de compilation : -l socket -lnsl -lrt
Testez les commandes top et ps sur la machine que vous utilisez. Qu'effectuent-elles ?
Ecrivez un programme qui affiche le numéro (PID) du processus qui l'exécute. Lancez ce programme plusieurs fois ; que remarquez-vous ?
Modifiez ce programme pour qu'il affiche son PID et son PPID. Exécutez-le plusieurs fois ; que remarquez-vous ?
Testez la commande env pour afficher les valeurs des variables d'environnement courantes.
Avec
la commande echo, examinez en particulier la valeur de la variable PATH.
Quelle est sa valeur ?
Cette variable permet de localiser automatiquement un fichier exécutable
(binaire) en définissant une suite de répertoires dans lesquels on recherche le
programme exécutable, dans l'ordre d'apparition des répertoires. C'est ce qui
permet, par exemple, à l'utilisateur de taper la commande
gcc au lieu
(par exemple) de /usr/local/bin/gcc.
Pour connaître la localisation exacte d'une commande, on utilise
which.
Essayez, par exemple, which ls et
which gcc. Quels sont les
résultats obtenus ?
Exécutez la commande setenv SAVEPATH $PATH (qui recopie dans la nouvelle
variable d'environnement SAVEPATH la valeur courante de PATH). Puis exécutez
setenv PATH /:. et tapez la commande
ls. Que constatez-vous ? Comment
l'expliquez-vous ?
Pour restaurer la valeur de votre variable PATH, exécutez
setenv PATH $SAVEPATH.
Puis exécutez unsetenv SAVEPATH pour éliminer la variable SAVEPATH de
votre environnement.
Comment se fait-il que la commande setenv continue de fonctionner malgré la modification du PATH ?
Ecrire un programme qui reproduit l'arbre
généalogique ci-après. Chaque processus doit afficher son PID, son PPID et
afficher les fils qu'il engendre.
Que se passe-t-il si on lance plusieurs fois le programme ? (observez l'ordre d'apparition des messages à l'écran et commentez)
On considère deux structures de filiation (chaîne
et arbre) représentées ci-dessous. Ecrire un programme qui réalise une chaîne de
n processus, où n est passé en paramètre de
l'exécution de la commande (par exemple, n = 4
dans l'exemple donné). Faire imprimer le numéro de chaque processus et celui de
son père. Même question avec la structure en arbre.
Modifiez le programme de la question 4.1 pour que le fils 2 affiche son message avant les fils 1 et 3.
Modifiez ce programme pour que les petits-fils 1 et 2 affichent leur message avant les fils 2 et 3.
La primitive execv permet de créer un processus pour exécuter un programme déterminé (qui a auparavant été placé dans un fichier, sous forme de binaire exécutable).
#include <unistd.h>
int execv(char* filename, char* argv[]);
Le paramètre filename pointe vers le nom (absolu ou relatif) du fichier exécutable, argv vers le tableau contenant les arguments (terminé par NULL). Par convention, le paramètre argv[0] contient le nom du fichier exécutable, les arguments suivants étant les paramètres successifs de la commande. (Voir aussi la primitive execve).
Que fait le programme ci-dessous.
#include <stdio.h>
#include <unistd.h>
#define NMAX 5
int main() {
char* argv[NMAX];
argv[0] = "ls"; argv[1] = "-lt"; argv[2] = "/"; argv[3] =
NULL;
execv("/bin/ls", argv);
}
Ecrire un programme execcmd qui exécute une
commande Unix passée en paramètre. Exemple d'exécution :
execcmd /bin/ls -Ft /
Ecrire un programme qui lance le programme de la question 2.3, en modifiant certaines variables d'environnement. Faire afficher ces variables par le programme. (utiliser la primitive execve).