Remarque: n’oubliez pas, lors de l’utilisation d’appels systèmes, de traiter les cas d’erreur.
Dîner des philosophes diner_phi avec sleep #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #define NOMBRE_DE_PHILOSOPHE 5 #define NOMBRE_DE_REPAS 2 // Attends pendant une durée pseudo-aléatoire entre 1 et 5 secondes void attendre() { int sleep_time = (rand() % 5) + 1; // int sleep_time = 1; sleep(sleep_time); } // Tableau qui contient le nombre de repas mangés par chaque philosophe.
Remarque: n’oubliez pas, lors de l’utilisation d’appels systèmes, de traiter les cas d’erreur.
Dîner des philosophes Le problème du Dîner des philosophes consiste en un nombre de n (habituellement égal à cinq) de philosophes assis autour d’une table ronde, sur laquelle sont installées n assiettes et n couverts. Chaque philosophe dispose d’un couvert de chaque côté de son assiette.
Les philosophes, ont trois états penser, manger, attendre de manger. Les philosophes commencent tous dans l’état penser.
Objectif: utiliser les sockets du domaine Unix (AF_UNIX et SOCK_STREAM) et le multiplexage d’entrée-sorties.
Remarque: n’oubliez pas, lors de l’utilisation d’appels système, de traiter les cas d’erreur.
Écho Développez un serveur simple srv_echo.c qui accepte les clients et leur renvoie tel quel et directement ce qu’ils envoient. Le serveur traite entièrement chaque client l’un après l’autre. Le serveur reçoit et envoie au fur et à mesure : n’attendez pas de recevoir tous les octets avant de commencer à envoyer.
Remarque: n’oubliez pas, lors de l’utilisation d’appels systèmes, de traiter les cas d’erreur.
Echo Le programme srv_echo.c #include<stdlib.h> #include<stdio.h> #include<unistd.h> #include<string.h> #include<sys/socket.h> #include<sys/un.h> #include<signal.h> void gere(int sock) { fprintf(stderr, "** Terminaison du serveur et libération des ressources **\n"); close(sock); unlink("sock"); exit(EXIT_SUCCESS); } int main(int argc, char** argv){ struct sigaction action; sigemptyset(&action.sa_mask); action.sa_flags = 0; action.sa_handler = gere; sigaction(SIGINT, &action, NULL); int sock = socket(AF_UNIX, SOCK_STREAM, 0); struct sockaddr_un addr; addr.sun_family = AF_UNIX; strncpy(addr.
Remarque: n’oubliez pas, lors de l’utilisation d’appels systèmes, de traiter les cas d’erreur.
Modification du gestionnaire d’un signal On veut gérer le signal d’interruption de processus (signal SIGINT) de plusieurs facons: Gestion directe du signal avec un affichage: #include<stdlib.h> #include<stdio.h> #include<unistd.h> #include<signal.h> void gere(int sig) { printf("Réception du signal SIGINT\n"); exit(1); } int main(void) { struct sigaction action; sigemptyset(&action.sa_mask); action.sa_flags = 0; action.sa_handler = gere; sigaction(SIGINT, &action, NULL); pause(); return 0 ; } En ignorant l’occurence du signal: #include<signal.