1
TP4: Entre processus père et fils
A. Héritage :
1. Soit le code suivant :
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
char buf[1024]; /* tableau pour récupérer le répertoire de travail, à utiliser avec la fonction getcwd */
void main(){
int i;
nice(10); /* augmentation de 10 de la valeur du nice avant le fork*/
……… /*à compléter*/
}
a) Que représente la valeur de nice
b) Complétez le code afin d’afficher les informations suivantes sur le processus père et fils:
uid, euid, egid, cwd et nice.
2. Soit le code suivant. Exécutez et interprétez le résultat.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
void main(){
int m=5,n=10,status,w;
printf("1) Père: m= %d, n= %d, w=%d\n", m, n, w);
int pid=fork();
if(pid==0){
w=15;
printf("2) Fils: m= %d, n= %d, w=%d\n", m, n, w);
m *= 2; n *= 2;
printf("3) fils: m*2= %d, n*2= %d, w=%d\n", m, n, w);
exit(0);
}
wait(&status);
printf("4) Père: m= %d, n= %d, w=%d\n", m, n, w);
}
B. Wait :
Soit le code suivant :
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void main(){
int returnfork, returnWait, status;
returnfork=fork();
if (returnfork==0){
printf("processus fils %d\n", getpid());
exit(10);
}
Année universitaire 2019-2020
OS2 - SMI-S4
returnWait=wait(&status);
printf("processus père %d\n", getpid());
printf("sortie du wait \n ");
sleep(15);
printf("returnWait = %d status = %d\n", returnWait, WEXITSTATUS(status));
exit(0);
}
1. Exécutez puis commentez le résultat de l’exécution de ce code.
2. Quel est le rôle de wait?
3. Que représente la valeur de returnWait et celle de status?
C. Waitpid :
Soit le code suivant.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void){
int pid;
int retourFils;
int retourWP;
pid=fork();
switch(pid){
case -1:
printf("Echec de fork \n");
exit(2);
case 0:
printf("Dans le fils \n");
printf("PID %u PPID %u \n", getpid(), getppid());
sleep(5);
printf("Fin du fils\n");
exit(0);
default:
printf("Dans le pere \n");
do{
retourWP=waitpid(pid,&retourFils,WNOHANG);
if (retourWP==0){
printf("Fils n’a pas fini: retourWP= %d, retourFils= %d\n",retourWP,retourFils);
sleep(1);
}
} while (retourWP==0);
printf("Fils a fini: retourWP= %d, retourFils= %d\n",retourWP,retourFils);
} }