TP 3
TP 3
TP 3
TP n◦3 - Correction
Fonction exec
Pour toute question pendant le TP, commencez par consulter l’aide de exec en entrant la
commande man 3 exec.
pid_t pid;
int attente_fils,attente_pere;
if(argc != 3)
perror("usage: ex1 n m\n");
attente_pere = atoi(argv[1]);
attente_fils = atoi(argv[2]);
switch(pid=fork()) {
case -1:
perror("fork error");
break;
case 0:
sleep(attente_fils);
printf("fils attente finie\n");
break;
default:
sleep(attente_pere);
printf("pere attente finie\n");
break;
1
}
fin src/ex1.c
Correction :
1. Utiliser les options l a x de ps pour pouvoir voir le processus init.
2. Voir que le père du programme est le terminal. Sentir ce qui se passe quand le père meurt avant le
fils (init devient le père ).
3. Voir ce qui se passe quand le fils meurt avant le père. Processus zombies (state Z).
Sentir pourquoi, il faudra utiliser les fonctions wait.
Correction : Comprendre comment UNIX trouve les programmes qu’on lui demande d’exécuter.
Changer des variables d’environnement : PATH=$PATH :.../tp3/progs/
Exercice 4 Ecrire un programme prog1 qui crée un processus fils qui exécute affichez avec
l’argument salut. On utilisera la fonction execl.
Correction : Remarque : ne pas oublier le nom du programme dans la liste des arguments.
début src/prog1.c
int main() {
2
pid_t pid;
fin src/prog1.c
Exercice 5 Ecrire un programme prog2 qui crée un processus fils qui a un environnement
à seulement deux variables PATH=/src et USER=unknown. Pour vérification, il affichera ses
arguments et ses variables d’environnement. On utilisera cette fois la fonction execve.
On s’inspirera du programme ci-dessous qui affiche les valeurs des variables d’environnement
de votre machine.
début src/env.c
int main() {
char ** ptr;
extern char **environ;
fin src/env.c
Correction :
début src/argenv.c
char ** ptr;
extern char **environ;
int i;
printf("\nArguments : \n");
for(i=0;i<argc;i++)
printf("%s\n",argv[i]);
3
for(ptr = environ;*ptr != 0;ptr++)
printf("%s\n",*ptr);
fin src/argenv.c
début src/prog2.c
int main() {
pid_t pid;
char * arguments[] = {"argenv",(char *) 0};
fin src/prog2.c
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
pid_t pid1,pid2,pid_premier;
int status;
switch(pid1=fork()) {
case -1:
perror("fork error");
4
break;
case 0:
execlp("ls","ls",(char *) 0);
break;
default:
switch(pid2=fork()) {
case -1:
perror("fork error");
break;
case 0:
execlp("ps","ps",(char *) 0);
break;
default:
break;
}
break;
}
pid_premier = wait(&status);
wait(&status);
fin src/ex6.c