Sie sind auf Seite 1von 3

Faculté des Mathématiques et de l’Informatique 3ème année Licence ISIL

Département d’Informatique Module : Système d’exploitation II

Tp 2 : waitpid()
Quelle sont les résultats attendu pour l’execution de Waitpid() ;

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void) {
int pid1 = fork();
int status ;
if (pid1< 0) {
printf("Error ");
return 1;
}
if (pid1 == 0) {
sleep(3);
printf("Le processus (%d) a fini sont exécution \n",getpid());
return 0;
}
int pid2 = fork();
if (pid2< 0) {
printf("Error ");
return 2;
}

if (pid2 == 0) {
sleep(1);
printf("Le processus (%d) avec un temps min a fini sont exécution
\n",getpid());
return 0;
}

int pid1_res = waitpid(pid1,NULL,0) ;


printf("En attente du procrssus (%d) \n", pid1_res);

int pid2_res = waitpid(pid2,NULL,0) ;


printf("En attente du processus (%d) \n", pid2_res);
return 0;
}

Que ce passe il si ont remplace waitpid(pid1,NULL,0) avec :

1- waitpid(pid1,NULL,WNOHANG) Et Waitpid(pid2,NULL, WNOHANG)

2- waitpid(pid1,NULL,WIFCONTINUED(status)) et waitpid(pid2,NULL,WIFICONTINUED(status))
Faculté des Mathématiques et de l’Informatique 3ème année Licence ISIL
Département d’Informatique Module : Système d’exploitation II

Processus : exec
Exercice 2 Un exemple avec execv & execl, executer le programme suivent.
Expliquer l’affichage de ce programme

// programme forkExec.c
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
if (fork()==0) { // premier fils
char* args[]={"ls","-l", NULL};
execv("/bin/ls",args);
printf("echec de execv de ls \n");
exit(1);
} else if (fork()==0) { // second fils
execl("/bin/pwd","pwd",NULL); printf("echec de execl de pwd
\n"); exit(1);
} else { int pid, status;
pid=wait(&status);
printf("fin du fils %d avec %d\n", pid,
WEXITSTATUS(status)); pid=wait(&status);
printf("fin du fils %d axec %d\n", pid,
WEXITSTATUS(status));
}
return 0;
}

Exercice 4 : exécuter le programme suivent puis répondez aux question :

1- Que ce passe-t-il si l'appel système `execve()` dans le processus fils de `forkExecve.c` réussit ?
2- Comment le programme forkExecve.c récupèret-il le code de sortie du proceessus fils ( fils.c) ?

// programme forkExecve.c // programme fils.c


#include <sys/wait.h> #include <stdio.h>
#include <stdio.h> #include <unistd.h>
#include <unistd.h> #include <stdlib.h>
#include <stdlib.h> int main(int argc, char* argv[],
int main( ) { char*env[]) {
if (fork()==0) { // fils printf(" argc = %d \n", argc);
char* args[]={"fils", NULL}; char* int i;
env[]={"PWD=../",NULL}; for(i=0; i<argc;i++)
execve("./fils", args, env); printf("echec de printf(" argv[%d]=%s \n", i,
execve \n"); argv[i]);
exit(1); for(i=0;env[i]!=NULL;i++)
} // père printf(" env[%d]=%s \n", i,
int pid, status; pid=wait(&status); env[i]); printf("
printf("fin du fils %d avec %d\n", pid, getenv(PWD)=%s\n" ,
WEXITSTATUS(status)); getenv("PWD"));
return 0; exit(0); }
}
Faculté des Mathématiques et de l’Informatique 3ème année Licence ISIL
Département d’Informatique Module : Système d’exploitation II

Devoir :
1- Donnez un code qui crée l’arbre de processus suivant :

- PP est le processus principal (qui exécute le code).

- Après avoir créé ses éventuels fils, chaque processus affiche à l’écran son nom et son
pid puis se termine.

2 – Complétez le code pour que chaque père attende la fin de ses fils avant de se terminer.

3 – Complétez le code pour que les processus feuilles F4, F5, F6 et F7 se transforment respectivement en :
date, ls, ps et cat fich.txt.
La transformation de chaque processus feuille est lancée juste après l’affichage de son nom et son pid.

4 – Quels sont les avantages et les inconvénients d'utiliser execlp() par rapport à d'autres fonctions
d'exécution de commandes comme execvp() ?

5– Comment pourriez-vous implémenter une communication entre les processus feuilles et le processus
parent pour transmettre des informations ou des résultats ?

6 – Quelles sont les implications en termes de sécurité lors de l'exécution de commandes système
directement à partir d'un programme en C ?

Das könnte Ihnen auch gefallen