TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique



Documents pareils
Cours 6 : Tubes anonymes et nommés

Programmation système de commandes en C

Cours Programmation Système

LEs processus coopèrent souvent pour traiter un même problème. Ces

Programmation système en C/C++

Introduction aux Systèmes et aux Réseaux

3IS - Système d'exploitation linux - Programmation système

Les processus. Système L3, /39

GESTION DES FICHIERS C/UNIX

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

Qu'est-ce qu'un processus: Définitions

Le système de gestion des fichiers, les entrées/sorties.

Programmation système I Les entrées/sorties

Simulation d un système de paiement par carte bancaire

Le prototype de la fonction main()

Introduction au langage C

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Programmation Système (en C sous linux) Rémy Malgouyres LIMOS UMR 6158, IUT département info Université Clermont 1, B.P.

Architecture d un système d exploitation

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Communication Interprocessus

DUT Informatique Module Système S4 C Département Informatique 2009 / Travaux Pratiques n o 5 : Sockets Stream

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Le langage C. Séance n 4

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Java Licence Professionnelle CISII,

Cours de Système : Gestion de Fichiers

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Les structures de données. Rajae El Ouazzani

Programmation système

Applications client/serveur TCP/IP - Sockets Rappels. C.Crochepeyre Applications CS 1

Derrière toi Une machine virtuelle!

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Les processus 2/54. Qu est-ce qu un processus? 3(6)/54. Se souvenir 1(1)/54. Le système de fichiers (exemple du disque dur)

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

TP réseaux 4 : Installation et configuration d'un serveur Web Apache


Les structures. Chapitre 3

TP2 : tableaux dynamiques et listes chaînées

Les débordements de tampons et les vulnérabilités de chaîne de format 1

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Les fichiers. Chapitre 4

Outils pour la pratique

Système et réseaux (SR1) Gestion des utilisateurs

Algorithmique et Programmation, IMA

Les processus légers : threads. Système L3, /31

Programmation en langage C

Playing with ptrace() for fun and profit

Gestion des processus

Exercice sur les Dockers

Communication par sockets

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

SUPPORT DE COURS. Langage C

Programmation Web. Madalina Croitoru IUT Montpellier

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Programmation client-serveur sockets - RPC

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

Cours 14 Les fichiers

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Introduction à la Programmation Parallèle: MPI

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

INITIATION A LA PROGRAMMATION

gestion des processus La gestion des processus

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Unix : Programmation Système

Projet de programmation (IK3) : TP n 1 Correction

Programmer en JAVA. par Tama

Lier Erlang avec d autres langages de programmation

Initiation à la programmation en Python

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Plan du cours. Historique du langage Nouveautés de Java 7

Cours Langage C/C++ Programmation modulaire

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Problèmes liés à la concurrence

Structure d un programme

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

Stockage du fichier dans une table mysql:

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Cours d initiation à la programmation en C++ Johann Cuenin

BASES DE DONNEES TP POSTGRESQL

SCHMITT Année 2012/2014 Cédric BTS SIO. TP Serveur Backup

Claude Delannoy. 3 e édition C++

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

OS Réseaux et Programmation Système - C5

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia

Cours de C. Allocation dynamique. Sébastien Paumier

Transcription:

Communications entre Processus Communication par tubes. TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique Exemple 1: On a deux processus Père/Fils. Le père envoi au fils un message dans un tube. Message envoyé en bloc et lu caractère par caractère puis imprimé. #include <unistd.h> char message[25] = "Cela provient d'un tube"; /* * communication PERE --> FILS par pipe int p[2]; int pipe(int[2]); if (pipe(p) == -1) fprintf(stderr, "erreur ouverture pipe\n"); exit(1); if (fork() == 0) /* fils char c; while (read(p[0], &c, 1)!= 0) printf("%c", c); else /* suite pere write(p[1], message, 24); Remarquer l'arrêt de read() sur valeur retour nulle. (Réalisé par dans le processus père). Exercice: Faire un programme où ce sont deux fils qui communiquent, l'un écrivain et l'autre lecteur. Exemple 2: Considérons maintenant deux écrivains et un lecteur sur le même tube. Deux fils écrivent respectivement les séquences "ABC...Z" et "abc...z" par blocs de trois caractères, et un troisième fils lit dans le tube par blocs de 4 caractères. #include <unistd.h> /* Cummunication par pipe * FILS1 et FILS2 Ecrivains Najib TOUNSI 1

* FILS3 lecteur, meme pipe void f1(), f2(), f3(); /* les 3 fils void (*tab_fonct[3]) () = f1, f2, f3; int p[2]; char seq1[27] = "ABCDEFGHIJKILMOPQRSTUVWXYZ"; /* ecrite par FILS1 char seq2[27] = "abcdefghijklmnopqrstuvwxyz"; /* ecrite par FILS2 int i; int pipe(); if (pipe(p) == -1) fprintf(stderr, "erreur ouverture pipe\n"); exit(1); for (i = 0; i < 3; i++) switch (fork()) case 0: (*tab_fonct[i]) (); default:; void f1() int i; for (i = 0; i < 26; i += 3) write(p[1], &seq1[i], 3); sleep(3); void f2() int i; for (i = 0; i < 26; i += 3) write(p[1], &seq2[i], 3); sleep(4); void f3() char s[5]; int nb_lu; while ((nb_lu = read(p[0], s, 4)) > 0) printf("%s", s); printf("\n"); Les appels sleep() entre chaque écriture des écrivains, sont là pour simuler d'autres traitements des processus. Najib TOUNSI 2

Exemple de Programme Communications entre Processus. Communication par tubes nommés (fifos). Voici deux programmes, serveur.c et client.c, qui communiquent par deux tubes nommés cli2serv et serv2cli. Deux Processus Communicants Par Tubes nommés Le programme client.c envoie une requête de type a + b, dans le tube cli2serv, et le programme serveur.c lui retourne la réponse dans le tube serv2cli. C'est le programme serveur.c qui crée les tubes (désignés par les variables QUESTION et REPONSE) et qui les supprime en fin d'exécution. Il doit donc être lancé avant le programme client qui suppose les tubes existants. Les deux programmes se synchronisent sur l'ouverture des tubes qui doit se faire dans le même ordre. L'arrêt de la communication se fait quand le programme client envoi le message bye; le serveur répond alors par ciao. programme serveur.c % cat serveur.c /* Serveur: retourne resultat (requete a+b) * Cree les fifos cli2serv et serv2cli * LANCER LE SERVEUR D'ABORD (car il ecrase fifos) #include <sys/types.h> #include <fcntl.h> #include <string.h> #define QUESTION "cli2serv" #define REPONSE "serv2cli" void trait(); /* traitement du serveur int fdq, fdr; unlink(question); unlink(reponse); /* Creation fifos if (mkfifo(question, 0644) == -1 mkfifo(reponse, 0644) == -1) perror("impossible creer fifos"); /* Attente des ouvertures Clients Najib TOUNSI 3

fdq = open(question, O_RDONLY); fdr = open(reponse, O_WRONLY); trait(fdr, fdq); close(fdq); close(fdr); unlink(question); unlink(reponse); void trait(fdr, fdq) int fdr, fdq; /* fdr et fdq descripteurs reponse/question int opd1, opd2, res; char opr; char quest[11]; char rep[11]; /* traitement serveur * envoi reponse a question * a + b venant de client. * arret question = "Ciao" while (1) read(fdq, quest, 10); sscanf(quest, "%d%1s%d", &opd1, &opr, &opd2); if (strcmp(quest, "Ciao") == 0) strcpy(rep, "Bye"); write(fdr, rep, 10); break; res = opd1 + opd2; sprintf(rep, "%d", res); write(fdr, rep, 10); programme client.c % cat client.c /* Client: envoie expressions * Les fifos sont supposes crees * par le serveur et sont cli2serv * et serv2cli #include <sys/types.h> #include <fcntl.h> #include <string.h> #define QUESTION "cli2serv" #define REPONSE "serv2cli" void trait(); /* traitement client int fdq, fdr; fdq = open(question, O_WRONLY); if (fdq == -1) fprintf(stderr, "Impossible ouvrire fifo %s\n", QUESTION); fprintf(stderr, "Lancer serveur d\'abord?\n"); Najib TOUNSI 4

fdr = open(reponse, O_RDONLY); if (fdr == -1) fprintf(stderr, "Impossible ouvrire fifo %s\n", REPONSE); fprintf(stderr, "Lancer serveur d\'abord?\n"); trait(fdr, fdq); close(fdq); close(fdr); void trait(fdr, fdq) int fdr, fdq; /* fdr et fdq descripteurs reponse/question char rep[11]; char quest[10]; /* traitement client * lecture expression a op b * dans stdin et ecriture reponse * dans stdout. Arret rep = "Bye" while (1) if (gets(quest) == NULL) write(fdq, quest, 10); printf("client -> %s \n", quest); read(fdr, rep, 10); printf("serveur -> %s \n", rep); if (strcmp(rep, "Bye") == 0) break; Script d'exécution % ls cli_serv serv_cli cli_serv not found serv_cli not found % client Impossible ouvrire fifo cli_serv Lancer serveur d'abord? % serveur & [1] 21653 % client 2 +4 Client -> 2 +4 Serveur -> 6 3 + 7 Client -> 3 + 7 Serveur -> 10 Ciao Client -> Ciao Serveur -> Bye [1] + Done serveur PS: Bravo et félicitations pour votre patience... Najib TOUNSI 5

Projet Mini Shell Najib Tounsi Squelette initial - Faire le programme suivant: [tounsi@genux C]$ cat minishell2.c #include<stdio.h> #include<string.h> #define L 80 #define W 20 char ligne[l]; /* Ligne commande char mot[w][l]; /* Les mots de la ligne commande void LireLigneCom(); void TraitLigneCom(); int ExecuterCom(); int pid, i, j, s; LireLigneCom(); TraitLigneCom(); while (strcmp(mot[0], "logout")!= 0) s = ExecuterCom(); printf("%d\n", s); LireLigneCom(); TraitLigneCom(); void LireLigneCom() char prompt[20] = "MiniShell OK>"; printf("%s", prompt); fgets(ligne, L + 1, stdin); /* gets() deconseillee /* On lit une ligne commande de 80 caracteres void TraitLigneCom() /* Selectionne les mots de la ligne commande et les place dans la tableau mot[] sscanf(ligne, "%s", mot[0]); /* Test: on commence par le 1er mot qui est la commande int ExecuterCom() /* Sera developpe' dans le cadre de ce TP int pid, status; if (strlen(mot[0]) == 0) /* pas de commande return 0; /* On lance un fils qui va executer la commande switch (pid = fork()) case -1: return -1; /* pas de fork case 0: if (execlp(mot[0], mot[0], mot[1], NULL) == -1) Najib TOUNSI 6

/* exec echoue exit(2) ; default: /* le minishell attend la fin de la commande if (wait(&status)==-1) return -1 ; return status/256; /* NB. le NULL dans execlp devra être remplacé par les autres mots de la ligne commande 1) Tester le programme sur des fichiers exécutables de votre choix. 2) Développer ce programme pour: - Tenir compte des paramètres de la commande à exécuter (Remplir le tableau mot[][]) - Lancement de la commande en background (utiliser waitpid() ) - Tenir compte d'un tube entre deux commandes sans paramètres NB. Faire man execl, man wait, etc... pour en savoir plus. Najib TOUNSI 7