int count_me(int i) { static int count = 0; /* variable globale à visibilité locale */ count += i; return count; }
Proposez un mécanisme pour assurer le partage des accès à ce tableau fibtab entre tous les processus légers. Donnez la nouvelle implémentation de la fonction fib().#define INCONNUE -1 static int fibtab [];
Squelette d’un serveur de chat multithreadé
Les fichiers sources d’un squelette de serveur de chat multithreadé sont accessibles dans cette archive. Vous y trouverez :
- un Makefile ;
- mtcs.c, point d’entrée du programme. Ouvre le port de connexion du serveur, écoute sur ce port et établit la connexion pour chaque nouveau client. Délègue à manage_cnct() la création d’un thread en charge de la gestion de cette connexion ;
- cnct.c et cnct.h, gestion de la connexion d’un client ;
- tools.c et tools.h, outils divers ;
- config.h, configuration du serveur.
La version fournie de la fonction manage_cnct() n’est pas multithreadée ; la connexion d’un client bloque le serveur...
Seul le fichier cnct.c est à modifier. Vous fournirez aussi des fichiers stat.h et stat.c pour la gestion des statistiques.
Il est possible d’activer la production de traces d’exécution du serveur par l’option -v. Utilisez les fonctions pgrs*() pour ce faire.
Utilisation du serveur de chat multithreadé
Au démarrage du serveur, le numéro du port d’écoute est affiché :
% ./mtcs Server open on port 8012 ...il faut repérer ce numéro de port d’écoute (ici 8012), il faut aussi identifier aussi le nom de la machine ! (localhost pour la machine locale peut suffire).
On peut alors lancer des clients. Depuis un autre terminal :
% telnet localhost 8012 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. mtcs : bienvenu foooooooooooooooo foooooooooooooooo FOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooo............. FOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooo.............on termine par control-] puis quit:
^] telnet> quit Connection closed.
Exercice 5 (Serveur de chat) Un serveur de chat multithreadé est basé sur le principe suivant :Dans une version initiale non multithreadée, l’implémentation de manage_cnct() repose sur un simple appel à repeater().
- un thread maître assure l’écoute sur une socket de connexion ;
- à chaque nouvelle demande de connexion, il crée une socket pour interagir avec le client et délègue cette interaction à un thread par un appel à la fonction
int manage_cnct(int fd);- cette fonction est en charge de créer un thread et d’enregistrer le descripteur fd comme celui d’un nouveau client ;
- ce thread devra lire en boucle sur la socket puis répéter sur l’ensemble des sockets des autres clients.
Question 1 Donnez une implantation de la fonction manage_cnct() déléguant à un thread l’appel à la fonction.On se préoccupera aussi de la terminaison de ce thread.
Question 2 Quelle structure de données doit être partagée entre les threads pour réaliser cette répétition des flux d’entrée ? Identifiez les accès qui seront réalisés à cette structure de données. Comment les protéger ?On désire ajouter le maintien de statistiques au serveur de chat. Les informations suivantes seront mémorisées :
- nombre de clients ;
- nombre de lignes reçues ;
- nombre de lignes envoyées ;
- nombre maximal de client à un instant donné ;
- nombre maximal de lignes reçues d’un client ;
- nombre maximal de lignes envoyées à un client.
De plus, on désire pouvoir interroger le serveur sur ces statistiques en lui envoyant un signal SIGUSR1
Question 3 Comment garder et mettre à jour ces informations de statistiques ?Question 4 Pourquoi est-il dangereux de contrôler par un verrou mutex POSIX l’accès partagé aux informations de statistiques entre les threads produisant ces statistiques et le handler de signaux affichant ces statistiques ?Question 5 Implantez cette prise de statistiques et leur affichage.
![]()
![]()
![]()