Consignes [1 pts]
1. Questions sur les travaux pratiques [2 pts]
| Un fichier .txt pour chaque question posée : question-1.txt, question-2.txt, question-3.txt. |
1.1. Interruptions
Question : Expliquez le comportement du programme suivant (effets des appels à sigaction, kill, code de retour du programme).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <printf.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void handler(int sig) {
printf("Signal received: %d\n", sig);
exit(100);
}
int main() {
struct sigaction new_action = {};
new_action.sa_handler = handler;
if (sigaction(SIGINT, &new_action, NULL) == -1) {
perror("Failed to call sigaction system call");
return 0;
}
struct sigaction sigsev_new_action = {};
sigsev_new_action.sa_handler = SIG_IGN;
if (sigaction(SIGSEGV, &sigsev_new_action, NULL) == -1) {
perror("Failed to call sigaction system call");
return 0;
}
kill(getpid(), SIGSEGV);
kill(getpid(), SIGSEGV);
kill(getpid(), SIGINT);
return 0;
}
1.2. Descripteurs de fichiers
1
2
3
4
5
int main(void) {
close(0);
perror("Something went terribly wrong...");
return 0;
}
Question : Quel est l’effet de ce code ?
1.3. Duplication de processus
Question : Quelles sont les valeurs de retour de l’appel système fork() ?
2. Utilisation de Fork [3 pts]
| Un fichier exercice-2.c |
Écrivez un programme qui se duplique (via un fork).
Le processus père exécute les instructions suivantes :
-
Se duplique (
fork) -
Attend la fin du processus fils
-
Récupère la valeur retournée par le processus fils.
-
Se termine en retournant la valeur retournée par le processus fils multiplié par 2
Le processus fils exécute les instructions suivantes :
-
Se duplique (
fork) -
Attend la fin du processus petit-fils
-
Récupère la valeur retournée par le processus petit-fils.
-
Se termine en retournant la valeur retournée par le processus fils multiplié par 3
Le processus petit-fils exécute les instructions suivantes :
-
Affiche "Hello World From Child" sur la sortie standard
-
Se termine en retournant la valeur 1
3. Utilisation des Threads [4 pts]
| Un fichier exercice-3.c |
Écrivez un programme répondant aux contraintes ci-dessous.
Le programme principal exécute les instructions suivantes :
-
Créé trois threads
-
Attend et récupère la valeur retournée par les trois threads
-
Affiche sur la sortie standard les valeurs récupérées additionnées
-
Se termine
Le premier thread exécute les instructions suivantes :
-
Retourne la valeur 10
Le second thread exécute les instructions suivantes :
-
Retourne la valeur 20
Le troisième thread exécute les instructions suivantes :
-
Retourne la valeur 30
4. Tubes et redirections [5 pts]
| Un fichier exercice-4.c |
Écrivez un programme qui se duplique (via un fork).
Le processus père exécute les instructions suivantes :
-
Créé un tube (
pipe) -
Se duplique (
fork) -
Attend la fin du processus fils
-
Lit le tube (
read) -
Affiche la valeur issue du tube sur la sortie standard
Le processus fils exécute les instructions suivantes :
-
Ferme sa sortie standard
-
Remplace la sortie standard par la partie de lecture du tube
-
Envoie la chaine suivante dans le tube :
"Hello from child\n"(write) -
Se termine en renvoyant 0
5. Synchronisation [5 pts]
| Un fichier exercice-5.c |
#include
#include
#include
#include
long final_value = 0;
void increase_value(int increase_value) {
for (int i = 0; i < increase_value; ++i) {
usleep(100);
final_value++;
}
}
int main(int argc, char *argv[], char *arge[]) {
increase_value(500);
increase_value(1000);
increase_value(1500);
increase_value(2000);
increase_value(2500);
increase_value(3000);
increase_value(3500);
increase_value(4000);
increase_value(4500);
increase_value(5000);
printf("Final processed value : %ld\n", final_value);
return EXIT_SUCCESS;
}
Modifiez le programme ci-dessus pour que:
-
Chaque incrémentation soit réalisée dans un thread différent en utilisant la même fonction de traitement (10 threads)
-
Le programme principal attende la fin de l’exécution de tous les threads avant de se terminer
-
Les threads devront être créés en passant en argument la valeur à incrémenter (argument de la fonction
increase_value()) ; -
La modification de la valeur finale (
final_value) doit être protégée par le mécanisme de synchronisation le plus approprié.