• Aucun résultat trouvé

Travaux Dirigés

N/A
N/A
Protected

Academic year: 2022

Partager "Travaux Dirigés"

Copied!
7
0
0

Texte intégral

(1)

Extrait du référentiel : BTS Systèmes Numériques option A (Informatique et Réseaux) Niveau(x) S6. Systèmes d’exploitation

S6.2. S.E. Multitâches professionnelles

Processus lourds / légers, diagramme des états d’une tâche

Ordonnancement des processus

3

Objectifs du TD :

- Exécution séquentielle - Les processus sous Linux :

- l’appel « fork » - les appels « exec »

- synchronisation des terminaisons (primitive « wait ») Pré-requis :

- Cours sur le multitâche (processus et thread)

EXÉCUTION SÉQUENTIELLE

Question 1

Que fait le code ci-dessous ? S’agit-il d’une application multitâche ?

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

// Fonctions : void slash(void);

void diese(void);

int main(void) {

setbuf(stdout, NULL); // pas de tampon sur stdout printf("Je vais lancer les 2 fonctions\n");

(2)

slash();

diese();

return EXIT_SUCCESS;

}

void slash(void) {

int i;

char c1 = "/";

for (i = 1;i <= 200;i++) {

write(1, &c1, 1);// écrit un caractère sur stdout (descripteur 1) }

return;

}

void diese(void) {

int i;

char c1 = "#";

for (i = 1;i <= 200;i++) {

write(1, &c1, 1);

} return;

}

………...

………...

………...

………...

………...

LES PROCESSUS SOUS LINUX

L’APPEL « fork »

Question 2

Expliquez et écrivez l’affichage obtenu par l’utilisation de la primitive « fork » dans le code ci- dessous.

#include <stdio.h>

int main() {

if (fork())

printf("Je suis le père\n");

else

printf("Je suis le fils\n");

return 0;

}

(3)

………...

………...

………...

………...

………...

Question 3

Complétez l’affichage « Je suis …….. » dans le code ci-dessous.

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int main() {

int pid;

pid = fork();

if (pid == -1) {

perror("fork"); exit(-1);

}

if (pid == 0) printf("Je suis ...\n"); // le père ou le fils ? if (pid != 0) printf("Je suis ...\n"); // le père ou le fils ? return 0;

}

LES APPELS « exec »

Après une opération « fork », le noyau Unix a créé un nouveau processus qui est une copie conforme du processus qui a réalisé l’appel. Si l’on désire exécuter du code à l’intérieur de ce nouveau processus, on utilisera un appel de type « exec » : execl, execlp, execle, execv ou execvp. La famille de fonctions « exec » remplace l’image mémoire du processus en cours par un nouveau processus.

À partir d’un programme en C, il est possible d’exécuter des processus de plusieurs manières avec soit l’appel « system » soit les appels « exec » (voir man exec).

Exemple 1 avec l’appel system() :

#include <stdio.h>

#include <stdlib.h>

int main() {

printf("Resultat de la commande ps -l :\n");

system("ps -l");

printf("Fin\n");

(4)

return 0;

}

Affichage en console Exemple 2 avec l’appel execlp() :

#include <stdio.h>

#include <unistd.h>

int main() {

printf("Resultat de la commande ps -l :\n");

execlp("ps", "ps", "-l", NULL); // voir man execlp printf("Fin\n");

}

Affichage en console Question 4

Quel est le rôle de la commande « ps » ?

………...

………...

………...

………...

(5)

Question 5

Comparez les PID/PPID de l’exécution des deux exemples.

………...

………...

………...

………...

………...

………...

Question 6

Dans l’exemple 2, le message « Fin » ne s’affiche pas, pourquoi ?

………...

………...

………...

Question 7

Complétez/modifiez le programme ci-dessous pour qu’il lance une calculatrice (kcalc) et un éditeur de texte (gedit) en utilisant « exec ».

#include <stdio.h>

#include <unistd.h>

int main() {

if (! fork()) { printf("Fils 1 : je lance une calculatrice !\n"); } if (! fork()) { printf("Fils 2 : je lance un éditeur de texte !\n"); }

return 0;

}

(6)

SYNCHRONISATION DES TERMINAISONS

On ne peut présumer l’ordre d’exécution de ces processus. Il sera donc impossible de déterminer quels processus se termineront avant tels autres (y compris leur père). D’où l’existence, dans certains cas, d’un problème de synchronisation.

La primitive « wait » permet l’élimination de ce problème en provoquant la suspension du processus appelant jusqu’à ce que l’un de ses processus fils se termine.

Question 8

Selon le code ci-dessous, quel processus se termine le premier ?

#include <stdio.h>

int main() {

if (fork()) {

printf("Je suis le père\n");

printf("Fin du père\n");

} else {

printf("Je suis le fils\n");

printf("Fin du fils\n");

}

return 0;

}

………...

Question 9

En utilisant la primitive « wait », modifiez le programme pour que « le père » se termine toujours après « son fils ».

………...

………...

………...

………...

………...

………...

………...

………...

………...

(7)

Question 10

En utilisant les fonctions etoile() et diese() fournies ci-dessous, écrivez un programme multitâche qui permette de paralléliser l’exécution de ces fonctions. Donnez l’affichage obtenu.

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

void etoile(void) {

int i;

char c1 = '*';

for(i=1;i<=200;i++) {

write(1, &c1, 1);// écrit un caractère sur stdout (descripteur 1) }

return;

}

void diese(void) {

int i;

char c1 = '#';

for(i=1;i<=200;i++) {

write(1, &c1, 1);

} return;

}

int main() {

int pid;

pid = fork();

if (pid == -1) {

perror("fork");

exit(-1);

}

if (pid == 0) {

}

if (pid != 0) {

}

return 0;

}

Références

Documents relatifs

En utilisant le programme fourier_paire , on peut vérifier le calcul des coefficients, puis représenter la fonction sur plusieurs périodes (à gauche), ou voir (à droite) que la

Nous allons voir dans ce chapitre comment un programme C en cours d’exécution peut créer un nouveau processus (fonction fork), puis au chapitre suivant comment un programme C en

Apr` es le vote, une synth` ese est faite par un programme informatique qui d´ etermine une ou plusieurs listes de trois candidats de sorte que chaque membre, quel que soit son vote,

Nous allons voir dans ce chapitre comment un programme C en cours d’exécution peut créer un nouveau processus (fonction fork), puis au chapitre suivant comment un programme C en