Programmation Unix 2 cours n 8

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

Cours de S.E. les Signaux

Programmation système en C/C++

Cours Programmation Système

Communication Interprocessus

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

Le prototype de la fonction main()

Playing with ptrace() for fun and profit

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

Cours 6 : Tubes anonymes et nommés

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 au langage C

Programmation système de commandes en C

Introduction aux Systèmes et aux Réseaux

Programmation système I Les entrées/sorties

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)

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

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

Arguments d un programme

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

Programmation système

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

Le traitement du temps

Unix : Programmation Système

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

OS Réseaux et Programmation Système - C5

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

Les processus. Système L3, /39

Cours de Systèmes d Exploitation

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

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

Les structures. Chapitre 3

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

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

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

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

COMPARAISONDESLANGAGESC, C++, JAVA ET

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

INF 104 (SELC) Introduction au langage C

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Gestion de la mémoire

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

Algorithmique et Programmation, IMA

Compression de Données - Algorithme de Huffman Document de Conception

Java Licence Professionnelle CISII,

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

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

Simulation d un système de paiement par carte bancaire

Les structures de données. Rajae El Ouazzani

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


Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

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

Programmation Réseau SSH et TLS (aka SSL)

Derrière toi Une machine virtuelle!

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

Introduction à la Programmation Parallèle: MPI

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Architecture d un système d exploitation

Conventions d écriture et outils de mise au point

Chapitre 4 : Outils de communication centralisés entre processus

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

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

Programmation client-serveur sockets - RPC

Exercice sur les Dockers

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

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Le langage C. Séance n 4

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

Pensez à vous inscrire... si ce n est pas encore fait

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

Introduction à la programmation concurrente

Cours Langage C/C++ Programmation modulaire

TP2 : tableaux dynamiques et listes chaînées

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

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

Testez votre installation. Créer un répertoire vide

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

Cours de C. Allocation dynamique. Sébastien Paumier

Programmation en langage C

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

Programme Compte bancaire (code)

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

INITIATION A LA PROGRAMMATION

Programmation Classique en langage C


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

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

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

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

Un ordonnanceur stupide

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

Gestion des processus

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

Génération de code binaire pour application multimedia : une approche au vol

Transcription:

Programmation Unix 2 cours n 8 Edouard THIEL Faculté des Sciences Université d Aix-Marseille (AMU) Janvier 2017 Les transparents de ce cours sont téléchargeables ici : http://pageperso.lif.univ-mrs.fr/~edouard.thiel/ens/unix/ Lien court : http://j.mp/progunix Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 1/28

Plan du cours n 8 1. Réception des signaux 2. Envoi avec donnée 3. Compléments Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 2/28

1 - Réception des signaux Vie d un signal : 1. Un signal est généré par kill ; 2. il est en attente d être délivré par le système ; 3. il est délivré au processus cible. Un signal généré peut être bloqué par le système = il reste en attente. Un processus peut placer un masque de signaux = une liste de signaux à bloquer. Masque enlevé les signaux en attente sont délivrés. Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 3/28

Atomicité Règle pour les signaux standards : une seule occurrence d un signal X peut être en attente. si un signal X est généré alors qu un signal X est déjà en attente, il est perdu. Signaux temps réels (SIGRTMIN.. SIGRTMAX) : plusieurs occurrences d un signal peuvent être en attente, voir man getrlimit Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 4/28

Handler de signal Fonction appelée par le système lorsqu il délivre un signal sig pour que le processus capte ce signal. Prototype : void handler (int sig); Handlers fournis : SIG_DFL : handler par défaut SIG_IGN : pour ignorer un signal Comportement de SIG_DFL selon sig : (a) Terminaison du processus (b) Terminaison avec image mémoire (c) Ignorer le signal (d) Processus suspendu (e) Processus repris Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 5/28

Installer un handler avec signal() #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal (int sig, sighandler_t func); Installe le handler func pour le signal sig. Renvoie l ancien handler, ou SIG_ERR. Exemple : void capter (int sig) { printf ("Reçu signal %d\n", sig); int main () { signal (SIGTERM, capter); signal (SIGQUIT, capter); signal (SIGHUP, SIG_IGN);... Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 6/28

Problèmes de portabilité Interface historique : le comportement de signal varie selon le système ; les versions du système. Exemple : lorsqu un signal est capté, sur SysV : SIG_DFL est réinstallé sur BSD : le handler est maintenu Pendant l appel d un handler (= la délivrance du signal), sur SysV : le handler peut être interrompu pour le même signal sur BSD : le signal est masqué Linux SysV ; MacOS BSD Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 7/28

Réarmer signal() sur SysV et Linux Exemple : void capter (int sig) { signal (SIGTERM, capter); // on réarme en premier printf ("Reçu signal %d\n", sig); int main () { signal (SIGTERM, capter); // une fois au début de main while (1) { faire_quelque_chose(); Fragile : dans capter, SIG_DFL avant réarmement + SIGTERM non masqué Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 8/28

Ne pas utiliser signal() Seul usage portable de signal() : pour installer SIG_DFL ou SIG_IGN. Solution : utiliser sigaction() Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 9/28

Installer un handler avec sigaction() Complètement normalisé par POSIX, mais plus compliqué. #include <signal.h> int sigaction (int sig, const struct sigaction *act, struct sigaction *old); struct sigaction { void (*sa_handler)(int); sigset_t sa_mask; int sa_flags; ; Installe le handler act->sa_handler pour le signal sig. Si old NULL, récupère l ancien handler dans old->sa_handler. Renvoie 0 succès, -1 erreur. Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 10/28

Exemple void capter (int sig) { printf ("Reçu signal %d\n", sig); int main () { struct sigaction act; act.sa_handler = capter; sigemptyset (&act.sa_mask); act.sa_flags = 0; sigaction (SIGTERM, &act, NULL); sigaction (SIGQUIT, &act, NULL); act.sa_handler = SIG_IGN; sigaction (SIGHUP, &act, NULL);... Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 11/28

Masquer des signaux Avec sigaction, un signal délivré sig est toujours masqué. On peut rajouter des signaux dans le masque (en plus de sig) : struct sigaction act; sigemptyset (&act.sa_mask); sigaddset (&act.sa_mask, SIGTERM);... sigaction (sig, &act, NULL); Liste des opérations possibles : #include <signal.h> int sigemptyset (sigset_t *set); int sigfillset (sigset_t *set); int sigaddset (sigset_t *set, int signum); int sigdelset (sigset_t *set, int signum); int sigismember (const sigset_t *set, int signum); Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 12/28

Options De nombreux paramétrages sont possibles. act.sa_flags = flag1 flag2...; Par défaut, le handler est maintenu après délivrance. On peut demander la réinstallation de SIG_DFL : act.sa_flags = SA_RESET_HAND; Par défaut, tout appel bloquant est interrompu par un signal, puis échoue avec errno = EINTR. On peut demander que les appels bloquants soient silencieusement repris : act.sa_flags = SA_RESTART; plus facile à gérer : aucun code supplémentaire Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 13/28

Une fonction utilitaire int mysignal (int sig, void (*h)(int), int options) { struct sigaction s; s.sa_handler = h; sigemptyset (&s.sa_mask); s.sa_flags = options; int r = sigaction (sig, &s, NULL); if (r < 0) perror ( func ); return r; Exemple d usage : void capter (int sig) { printf ("Reçu signal %d\n", sig); int main () { mysignal (SIGTERM, capter, SA_RESTART); mysignal (SIGQUIT, capter, SA_RESTART); mysignal (SIGHUP, SIG_IGN, 0);... Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 14/28

Compilation avec gcc Pour compiler en C99 (ou C ANSI) avec les types et fonctions POSIX sur les signaux, il faut déclarer _GNU_SOURCE dans la ligne de commande : gcc -Wall -W -std=c99 -D_GNU_SOURCE ex1.c -o ex1 ou dans le source : #define _GNU_SOURCE // en premier #include <stdio.h> #include <signal.h> puis : gcc -Wall -W -std=c99 ex1.c -o ex1 Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 15/28

2 - Envoi avec donnée On peut envoyer un signal avec une donnée : #include <signal.h> int sigqueue(pid_t pid, int sig, const union sigval value); union sigval { int sival_int; void *sival_ptr; ; sigqueue() fonctionne comme kill(). Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 16/28

Exemple union sigval value; value.sival_int = 123; sigqueue (pid, sig, value); ou encore struct { int foo; char bar; toto = { 123, a ; union sigval value; value.sival_ptr = &toto; sigqueue (pid, sig, value); Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 17/28

Recevoir une donnée Lorsqu un signal est envoyé avec une donnée par sigqueue, on peut retrouver cette donnée en mettant SA_SIGINFO dans sa_flags, et en fixant sa_sigaction à la place de sa_handler : struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *);... ; Le premier paramètre est le signal ; le second contient la donnée ; le troisième peut recevoir un contexte (inutile, mettre NULL). Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 18/28

Réception d informations Un signal capté par un handler sa_sigaction reçoit : struct siginfo_t {... pid_t si_pid; uid_t si_uid; sigval_t si_value; int si_code;... La donnée envoyée par sigqueue est dans si_value. De plus si_code décrit la cause de l envoi : SI_USER par kill ou raise SI_QUEUE par sigqueue SI_KERNEL par le noyau... une 50 aine de cas prévus! Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 19/28

Exemple de réception d informations void capter (int sig, siginfo_t *info, void *ctx) { printf ("Reçu signal %d\n", sig); if (info->si_code == SI_QUEUE) printf ("PID émetteur %d, donnée %d\n", (int) info->si_pid, info->si_value.sival_int); int main () { struct sigaction act; act.sa_sigaction = capter; /* au lieu de sa_handler */ sigemptyset (&act.sa_mask); act.sa_flags = SA_RESTART SA_SIGINFO; sigaction (SIGTERM, &act, NULL);... Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 20/28

Limitations Pas de moyen pour savoir s il faut utiliser si_value.sival_int ou si_value.sival_ptr sival_ptr : uniquement pour des adresses partagées Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 21/28

3 - Compléments L appel d un handler peut avoir lieu lorsque le processus revient d une interruption matérielle ; vient d être élu par l ordonanceur ; revient d un appel système. Un signal est sans effet sur un zombie, même SIGKILL. Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 22/28

Signaux captables Tous les signaux sont captables sauf : SIGKILL, SIGSTOP, SIGCONT La différence entre SIGSTOP et SIGTSTP : SIGTSTP peut être capté. Si le processus est stoppé (il a reçu SIGSTOP ou SIGTSTP) un signal SIGTERM ou SIGCONT le réveille ; les autres signaux seront délivrés au réveil. Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 23/28

Duplication et recouvrement Lors de la duplication avec fork : les handlers sont conservés ; les signaux en attente sont supprimés dans le fils. Lors d un recouvrement avec exec* : les handlers sont remis à SIG_DFL ; sauf pour SIG_IGN : les signaux ignorés restent ignorés. But : protéger un programme de signaux. Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 24/28

Exemple (1/3) Programme protecsig.c qui se recouvre avec une commande et la protège d une liste de signaux. Usage : protecsig sig... -r com [arg...] Première étape : position de "-r" int main (int argc, char *argv[]) { int ind_r; for (ind_r = 1; ind_r < argc; ind_r++) if (!strcmp (argv[ind_r], "-r")) break; if (ind_r <= 1 ind_r >= argc-1) { fprintf (stderr, "Usage : %s sig... -r com " "[arg...]\n", argv[0]); exit (1); Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 25/28

Exemple (2/3) Deuxième étape : on installe SIG_IGN pour les signaux. for (int i = 1; i < ind_r; i++) { int sig = atoi (argv[i]); if (sig <= 0 sig >= NSIG) { fprintf (stderr, "Erreur, signal %s " "incorrect\n", argv[i]); continue; if (mysignal (sig, SIG_IGN, SA_RESTART) < 0) fprintf (stderr, "Erreur, signal %d non " "captable\n", sig); else printf ("Protégé du signal %d\n", sig); Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 26/28

Exemple (3/3) Troisième étape : recouvrement. printf ("Exécution de la commande...\n"); execvp (argv[ind_r+1], argv+ind_r+1); perror ("exec"); exit (1); Exemple : sleep 60 Dans un autre terminal : killall -1 sleep Essayer avec -2, -3, -9 Recommencer avec :./protecsig 1 2 9 -r sleep 60 Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 27/28

Suppression automatique des zombies Dans le père : mysignal (SIGCHLD, capter_sigchld, SA_RESTART); void capter_sigchld () { int p; while ((p = waitpid (-1, NULL, WNOHANG)) > 0) printf ("Zombie %d supprimé\n", p); Rappel : waitpid renvoie -1 : pas de fils ni zombie, 0 : pas de zombie, > 0 : PID du zombie supprimé. Edouard.Thiel@univ-amu.fr Programmation Unix 2 cours n 8 CC BY-NC 28/28