Bonjour, je suis en étude d'informatique et je suis actuellement en session d'examen. J'ai mon examen de système d'exploitation bientôt et je voudrai être sur que ma synthèse ne comporte pas d'erreur. Et que j'ai bien compris toute les notions vu en cour.
- L'instruction fork(). Quel est le rôle de cette instruction? Faire une comparaison des deux
processus résultants.
Fork() à pour effet de cloner un processus. Tout est cloné à part les adresses mémoires qui sont propres à chacun. Il possède chacun un identifiant unique (PID)
Le clone(fils) hérite des descripteurs des ressources.- Après un fork, qui est le père, qui est le fils?
int fork() ; renvoit un entier qui peut avoir 3 valeurs :
- si <0 = erreur
- si 0 = vous êtes le fils
- si >0 = vous êtes le père- Comment faire communiquer deux processus ayant un lien de parenté? Donnez un exemple d'implémentation de la méthode, pas de code mais un algorithme.
Pour faire communiquer 2 processus avec un lien de parenté, on utilse :
-Les tubes anonymes
int tube[2] où tube[0] désigne la sortie du tube (où on lit)
tube[1] désigne l’entrée du tube (où on écrit)
On crée ensuite le tube avec pipe(tube).
Si la fonction renvoit une valeur <0, il y a une erreur lors de la création.
Pour écrire, on utilise l’instruction : write(tube[1], var, sizeof(var))
Sans oublier de fermer préalablement la sortie du tube : close(tube[0])
Pour lire, on utilise l’instruction : read(tube[0], var, sizeof(var))
Et on fermera préalablement l’entrée du tube : close(tube[1])
Exemple d’implémentation :
-On initialise le tube (int tube[2])
-On pipe. Si la valeur renvoyée est < 0 : erreur, on stoppe.
Sinon,
-On fork et on met la valeur renvoyée dans une variable pid de type pid_t. Si pid < 0 : Erreur, on stoppe.
Sinon,
-Si pid == 0, on est le fils. On ferme l’entrée du tube (tube[1]) et on lit la sortie du tube (tube[0]) avec l’instruction « read » décrite plus haut.
-Si pid > 0, on est le père. On ferme la sortie du tube (tube[0]) et on écrit à l’entrée du tube (tube[1]) avec l’instruction « write » décrite plus haut.
On attend la fin du fils avec l’instruction « wait(0) »
-Fin du programme.- Comment faire communiquer deux processus n’ayant pas de lien de parenté? Expliquez trois méthodes. Donnez un exemple d'implémentation de la méthode que vous voulez, pas de code mais un algorithme.
-Fichier : Chaque processus peut lire et écrire dans un fichier qui leur est connu.
-File de message :
-Tube nommé : Permettent à des processus sans lien de parenté de communiquer en mode flot (stream).
Exemple d’implémentation :
Le 1er processus :
·Creation du tube
·Ouverture en ecriture
·Ouverture en lecture
·Fermeture en ecriture
·Fermeture en lecture
·Suppression du tube (unlink)- Comment faire communiquer deux fils d'un même père, ensembles? Donnez un exemple d'implémentation de la méthode, pas de code mais un algorithme.
Si les deux fils doivent communiquer dans les deux sens (écrire et lire) on doit initialiser deux tubes.
Exemple d’implémentation :- Comment le père peut-il récupérer le statut de fin d'un de ses fils? Donnez un exemple d'implémentation de la méthode.
On attends la fin du fils avec un wait(&status) (ou de waitpid(-1,&status, 0|WNOHANG|WUNTRACED)). Après on peut récupérer le statut de fin grace à différentes macros.
On vérifie d’abord que le fils c’est terminé correctement avec « (WIFEXITED(status)) ». Si la macro a retourné TRUE, on recupère le code de retour du fils avec « WEXITSTATUS(status) ».
Exemple d’implémentation :
Fin du programme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 int status ; wait(&status) ; if (WIFEXITED(status)){ écrire (« Processus terminé, code de retour : » WEXITSTATUS(status)) }- Comment un père peut-il être certain de la fin de tous ses fils avant de se terminer?
Donnez un exemple d'implémentation de la méthode.
En faisant une boucle de wait() qui boucle autant de fois qu’il y a de fils. Si la fonction wait() retourne -1, il y a une erreur. Sinon le fils s’est bien terminé.
A la fin de la boucle, on est alors certain que tous les fils se sont bien terminés.
Exemple d’implémentation :
Un père crée x fils et attend leur fin pour se terminer.
Fin du programme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int status ; for(i=0 ; i<x ; i++){ if (wait(&status) == -1){ perror(« wait : ») ; exit(1) ; } else{ printf(« Le fils sest bien terminé ») ; } }
- Expliquer comment utiliser les tubes nommés pour faire communiquer deux processus
n'ayant pas de parenté directe.
Grâce à la fonction mkfifo on peut crée deux tube nommé reliant deux processus n’ayant pas le même parent et spécidié les droits d’accès. La fonction renvoie 0 en cas de succès et -1 si echec. Il faux ouvrir les tubes en lecture et écriture sinon la communication sera bloquante.
Pour ouvrir en mode lecture non bloquant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 int fd_write, fd_read; if ( (mkfifo("tube1",S_IRUSR|S_IWUSR) == -1) ||(mkfifo("tube2",S_IRUSR|S_IWUSR) == -1)){ perror ("mkfifo"); exit (1); } if (( fd_write = open ("tube1", O_WRONLY)) == -1) { perror ("open"); exit (2); } if (( fd_read = open ("tube2", O_RDONLY)) == -1) { perror ("open"); exit (3);- Comment récupérer le résultat de l'exécution d'un programme système? Expliquer l'implémentation de la fonction utilisée.
je ne sais pas
Partager