TRAVAUX PRATIQUES Programmation Système

Documents pareils
Cours Programmation Système

Programmation système en C/C++

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

Cours 6 : Tubes anonymes et nommés

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

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

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)

Le prototype de la fonction main()

Les processus. Système L3, /39

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)

Introduction aux Systèmes et aux Réseaux

Programmation système

Gestion des processus

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

Programmation système de commandes en C

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

Introduction au langage C

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

Communication Interprocessus

Architecture d un système d exploitation

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

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Conventions d écriture et outils de mise au point

Unix : Programmation Système

Programmation système I Les entrées/sorties

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

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

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

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

Architecture des ordinateurs

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

OS Réseaux et Programmation Système - C5

Bases de programmation. Cours 5. Structurer les données

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

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

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

Exécutif temps réel Pierre-Yves Duval (cppm)

Cours de S.E. les Signaux

ENSP Strasbourg (Edition ) Les Systèmes Temps Réels - Ch. DOIGNON. Chapitre 3. Mise en œuvre : signaux, gestion du temps et multi-activités

Programmation Classique en langage C

Cours de Systèmes d Exploitation

Chap III : Les tableaux

Java Licence Professionnelle CISII,

Simulation d un système de paiement par carte bancaire

GESTION DES FICHIERS C/UNIX

Lier Erlang avec d autres langages de programmation

Arguments d un programme

Chapitre 4 : Outils de communication centralisés entre processus

Gestion de la mémoire

Algorithmique et Programmation, IMA

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

Langages et Concepts de Programmation Introduction à la programmation en langage C

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Programmation C. Apprendre à développer des programmes simples dans le langage C

COMPARAISONDESLANGAGESC, C++, JAVA ET

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

Le traitement du temps

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


Programmation C. J.-F. Lalande. 15 novembre 2012

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

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

Programmation C++ (débutant)/instructions for, while et do...while

EPREUVE PRATIQUE DES TECHNIQUES INFORMATIQUES ACTIVITE N 1. Thème de l activité : Configuration d un firewall

INFO-F-404 : Techniques avancées de systèmes d exploitation

Playing with ptrace() for fun and profit

Programmation client-serveur sockets - RPC

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

Problèmes liés à la concurrence

Les chaînes de caractères

Le langage C. Séance n 4

Introduction à la Programmation Parallèle: MPI

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

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

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

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

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

Cours Langage C/C++ Programmation modulaire

ACTIVITÉ DE PROGRAMMATION

Les fichiers. Chapitre 4

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

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

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

Communication par sockets

Claude Delannoy. 3 e édition C++

Exercice sur les Dockers

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Cours de programmation avancée. Le langage C. Université du Luxembourg

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Notes de Cours - Programmation Pascal Ferraro

Cours d algorithmique pour la classe de 2nde

Outils pour la pratique

INFO-F-105 Language de programmation I Séance VI

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

Transcription:

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 1 ère année Génie Informatique Interface C/UNIX, appels système (NB Enoncés donnés en supplément des exemples et exercices du Poly) 1. Primitive fork() - Créer le programme fork.c suivant: printf("processus fils %d\n", getpid()); else printf("processus pere %d\n", getpid()); - Compiler et exécuter. - Faire afficher aussi et pour chaque processus, le n pid du processus père. Primitive getppid() - Quel est ce processus père? - Constater avec la commande ps, le n pid du shell. - Création de deux fils. printf("un processus fils %d\n", getpid()); else /* Creer un autre fils ici. */ printf("un autre processus fils %d\n", getpid()); else printf("processus pere %d\n", getpid()); - Tester et commenter le programme suivant : printf("a\n"); fork(); printf("b\n"); - Idem pour le programme suivant printf("a\n"); fork(); Najib TOUNSI 1

printf("b\n"); fork(); printf("c\n"); 2. Le Couple fork() / exec() - Créer le programme prog.c suivant: main(int argc, char* argv[]){ printf("le programme %s lancé par un autre\n", argv[0]); - Compiler par: $ cc -o prog prog.c - Exécuter par: $ prog - Quel est cet «autre» programme dans ce cas? - Créer le programme ForkExec.c suivant: #include <unistd.h> execl("prog", "prog", NULL); else printf("le programme normal\n"); - Compiler et exécuter. Constater le résultat. - Transformer prog.c en progparam.c suivant. Compiler le vers prog. main(int argc, char* argv[]){ int i; printf("le programme (%s) lancé et parametres recus:\n", argv[0]); for(i=1; i<argc; i++) printf("%s\n",argv[i]); - Modifier le programme ForkExec.c en remplaçant la ligne execl par: execl("prog", "prog", "Ali", "Rabat", "21", NULL); - Compiler et exécuter. Constater le résultat. 3. Communication entre processus. Pimitive kill(). Avec shell. - Créer le programme bouc.c suivant qui boucle indéfiniment. while(1); - Compiler et exécuter en background par a.out & - Noter le n du processus et faire ps. - Taper maintenant, kill -15 n processus (ou bien kill -TERM n processus ). Refaire ps. Najib TOUNSI 2

- Recommencer avec les signaux 11 (SEGV) ou 9 (KILL), etc... NB. kill -l, donne la liste des signaux possibles. idem, mais plus détaillé, avec man 7 signal. Communication père -> fils. Le père envoie au fils un signal avec kill. - Créer le programme kill.c suivant ou le processus fils boucle indéfiniment et est arrêté par le processus père. int pid; if ((pid=fork()) == 0) while(1); else{ sleep(2); kill (pid, SIGTERM); sleep(2); - Compiler et exécuter. Résultat? - Exécuter en background maintenant (a.out &). - Faire ensuite ps, et attendre la fin avant de refaire ps. Constater le fait. - Faire: man 7 signal - et remplacer SIGTERM par un autre signal. SIGINT, SIGQUIT, SIGBUS, SIGFPE,... Que se passe t-il avec SIGFPE? Vérifier l'existence d'un fichier core. - Utiliser SIGCHLD maintenant, et refaire la même chose qu'en b) et b'). 4. Déroutement de signaux. La primitive signal(). - Créer le programme suivant où le processus père boucle jusqu'à réception de signal (SIGBUS) par le fils : main() { int pid; if ( (pid=fork())!=0){ printf("processus pere: Mon fils est %d\n", pid); /* signal( SIGBUS, handl); */ while(1) sleep(1); /* boucle jusqu'a interruption */ else { sleep(1); printf("processus fils est %d\n",getpid()); kill(getppid(), SIGBUS); /* interrompt le pere */ void handl(int sig){ /* Deroutement du signal recu */ printf("message recu 5/5 %d\n",sig); exit(0); - Compiler et exécuter. Constater le message système (ERREUR BUS) du au signal reçu. - Decommenter maintenant la ligne /* signal( ) */. Refaire l'exécution et constater que Najib TOUNSI 3

le signal a bien été capté par le programme. - Faire varier les signaux captés (exple SIGUSR1, SIGCHLD,...) - Faire un programme simple qui fait une division par zéro, et constater le résultat. Capter le signal SIGFPE maintenant, et vérifier le résultat. int x=1,y=1; /* signal(sigfpe, handl) ; */ x /= x-y; void handl(int sig){ printf("attention, division par zero. Signal: %d\n",sig); exit(0); - Ignorer un signal. Faire le programme qui utilise le handler système SIG_IGN pour ignorer un signal /* signal(sigbus, SIG_IGN) ;*/ sleep(10); - Exécuter en background et envoyer (kill -BUS pid) le signal SIGBUS. Constater le réésultat. $ a.out & [1] 4231 $ kill -BUS 4231 Decommenter la ligne signal() et recommencer. - Capter un signal (handler utilisateur), et revenir au handler système par défaut (SIG_DFL). signal(sigbus, handl) ; while(1); void handl(int sig){ printf("message recu 5/5 signal= %d\n",sig); signal (SIGBUS, SIG_DFL); - Exécuter par: $ a.out& [1] 4553 $ kill -BUS 4553 $ Message recu 5/5 signal= 7 $ kill -BUS 4553 [1]- Bus error a.out et constater le résultat (! 4553 est le n du processus de cet exemple. Utiliser celui qui s affiche dans son cas). 5. Primitives wait() et waitpid(), d'attente entre processus. Najib TOUNSI 4

- Ecrire et exécuter le programme suivant. Constater le résultat. Le père se bloque par wait() en attendant le fils. #include <sys/types.h> #include <sys/wait.h> int status; int pidf, pidw; if ((pidf = fork()) == 0) { system("ps"); sleep(5); /* exit(1025);*/ else { printf("j'attend %d\n",pidf); pidw= wait(&status); printf("%d est termine \n",pidw); /* printf("\n%d %d \n\n", status, WEXITSTATUS(status)); */ - Le père peut récupérer la valeur exit() du fils. (2e octet du paramètre status) #include <sys/types.h> #include <sys/wait.h> int status; int pidf, pidw; if ((pidf = fork()) == 0) { system("ps"); sleep(5); exit(5); else { printf("j'attend %d\n",pidf); pidw= wait(&status); printf("%d est termine \n",pidw); printf("\n%d %d %d \n\n", status, status/256, WEXITSTATUS(status)); - Avec waitpid(), on peut désigner le fils à attendre. Vérifier le sur le programme suivant qui lance deux processus fils et attend le deuxième. #include <sys/types.h> #include <sys/wait.h> main() { pid_t pid, pid1, pid2; int status; if ((pid1 = fork()) == 0) exit(0); else if ((pid2 = fork()) == 0) sleep(2), exit(1); else { system("ps"); pid = waitpid(pid2, &status, 0); printf(" fils termine %d son status %d \n", pid, WEXITSTATUS(status)); - On ne bloque pas le père en attente. (On utilise waitpid(pid1, &status, WNOHANG)). Constater que le programme se termine très vite, car il n'attend pas le fils qui dort. Najib TOUNSI 5

Najib TOUNSI 6