C3 - Langage C - ISIMA 1 - Troisieme partie

80
http://www.isima.fr/~loic Septembre 2016 1

Transcript of C3 - Langage C - ISIMA 1 - Troisieme partie

Page 1: C3 - Langage C - ISIMA 1 - Troisieme partie

http://www.isima.fr/~loic

Septembre 2016

1

Page 2: C3 - Langage C - ISIMA 1 - Troisieme partie

2

Plan

• Déboguer en texte• Xlib• Arbres• Systèmes

Page 3: C3 - Langage C - ISIMA 1 - Troisieme partie

DÉBOGUER

Adaptation et traduction d'un tutorial écrit par Guy Kerenhttp://users.actcom.co.il/~choo/

Page 4: C3 - Langage C - ISIMA 1 - Troisieme partie

4

En situation

• Programme syntaxiquement correct

MAIS

1. Programme avec un comportement aléatoire2. Programme planté ?

Message Segmentation Fault Fichier coredump (peut être très gros)

Page 5: C3 - Langage C - ISIMA 1 - Troisieme partie

5

Déboguer ?• A la main

Afficher le nom des variables / valeurs Macro DUMP

• Utiliser un débogueur… gdb ou confrères

• Utiliser un éditeur de développement avec débogueur intégré Eclipse, Visual, Borland

• Programmes tiers valgrind (erreurs de contexte + fuite mémoire)

Page 6: C3 - Langage C - ISIMA 1 - Troisieme partie

6

Avertissement

• L'affichage printf pour un programme est une tache qu'il est possible/souhaitable de remettre à plus tard

• Forcer l'affichage avec fflush(stdout);

for (i = 0; i >= 0; ++i) { printf("%d", i);}

Page 7: C3 - Langage C - ISIMA 1 - Troisieme partie

7

Préalable

• Compiler tous les programmes avec l'option de profilage –g Attention cela ralentit la compilation et l'exécution

• Lancer gdb / ddd dans le répertoire où se trouvent les sources Plus facile Informations sur les lignes à problème

Page 8: C3 - Langage C - ISIMA 1 - Troisieme partie

8

Invoquer gdb

• produit GNU au format texte

• "Surcouches" graphiques xgdb ddd

gdb executable

gdb executable fichier_core

gdb executable numero_processus

Page 9: C3 - Langage C - ISIMA 1 - Troisieme partie

9

Exécuter un programme

Raccourci : rQuitter : quit ou q

run

run paramètres_ligne_commanderun 10 "2eme param"

[ddd] paramètres spécifiés dans un menu

Page 10: C3 - Langage C - ISIMA 1 - Troisieme partie

10

Point-d'arrêt (1)

• Break point• Arrêter le programme à un point donné

Idéalement avec le bogue présumé• A une ligne donnée

• A chaque fois qu'une fonction est appeléebreak fonction

break prog.c:115

Raccourci : b

[ddd] click

Page 11: C3 - Langage C - ISIMA 1 - Troisieme partie

11

Point-d'arrêt (2)

• Connaître les points d'arrêt• Effacer des points d'arrêt• Faire des points d'arrêts conditionnels

Arrêter le programme si une condition est réunie

help breakhelp breakpoints

continue (raccourci c)

Page 12: C3 - Langage C - ISIMA 1 - Troisieme partie

12

Avancer dans l'exécution

• Exécute la commande courante et s'arrête Affiche la prochaine commande

• Exécute la commande courante Si la commande est une fonction, s'arrête au

début de cette fonction

step

next

Page 13: C3 - Langage C - ISIMA 1 - Troisieme partie

13

Afficher des variables/expressions

• Afficher la valeur d'une variable Doit être accessible au moment de l'évaluation

• Afficher la valeur de toute expression

print i*ip 3*iprint argv[argc-1]print max(5, 10)

print iprint variable

[ddd] survol souris

Page 14: C3 - Langage C - ISIMA 1 - Troisieme partie

14

Pile d'appel de fonctions ?

• Quelle fonction s'exécute ?• Par qui a-t'elle été appelée ?

#0 fonction_courante#1 in fonction_appelante#2 in fonction_appelante_2

where

Page 15: C3 - Langage C - ISIMA 1 - Troisieme partie

15

Contexte / Frame

• #n : numéro du contexte

#0 fonction_courante#1 in fonction_appelante

frame 1print iAffiche la variable i de fonction_appelante

up (u)down (d)

Page 16: C3 - Langage C - ISIMA 1 - Troisieme partie

16

Déboguer un programme en cours

• Par paresse ?• Programme dont l'initialisation est trop longue …

1. Le programme se met en pause2. Faire les manipulations3. Quitter gdb = le programme continue

gdb programme processus_idgdb prog 16354

Page 17: C3 - Langage C - ISIMA 1 - Troisieme partie

17

Fichier core/coredump (1)

• Obtenu au plantage d'un programme• Le plantage n'est pas toujours facile à

reproduire• Image mémoire d'un processus• Pleins d'infos si options –g

Pile d'appels, contenu de variables, …• Le fichier n'est PAS toujours fiable

il peut être corrompu si la mémoire l'est

Page 18: C3 - Langage C - ISIMA 1 - Troisieme partie

18

Fichier core/coredump (2)

• Donner les chemins des fichiers s'ils ne sont pas dans le répertoire de lancement de gdb

• Toutes les commandes ne sont pas disponibles : commandes d'exécution (next) : print, where, frame

gdb programme fichier_core

Page 19: C3 - Langage C - ISIMA 1 - Troisieme partie

19

Aller plus loin…help (h)

help mot_clé

Exemples :• Gérer des fichiers sources dans plusieurs répertoires : dir• Lister des lignes de code : list ou l

Documentation officielle : http://www.cs.utah.edu/dept/old/texinfo/gdb/gdb_toc.html

Page 20: C3 - Langage C - ISIMA 1 - Troisieme partie

1. Généralités2. Événements3. Contexte graphique

Page 21: C3 - Langage C - ISIMA 1 - Troisieme partie

21

X Windows System

• Système graphique d’affichage sous UNIX X11 X

• Terminal texte α

• Gestion des événements asynchrone

Page 22: C3 - Langage C - ISIMA 1 - Troisieme partie

22

Xlib• Bibliothèque de bas niveau

Orientée événements (X / Protocole X) Pas orientée composants (widgets) Principales fonctions/déclarations préfixées par X

• Base pour des bibliothèques de plus haut niveau Intrinsics (Xt) Motif Qt GTK SDL

• Peu d’alternatives

Page 23: C3 - Langage C - ISIMA 1 - Troisieme partie

23

Un peu d’histoire• 1980 : MIT – Projet ATHENA• 1984 : Protocole X – Xlib• 1987 : Réécriture de X11R1 + Intrinsics• 1988 : fondation consortium X

Dernière version X11R6.3 en 1997• 1992 : projet XFree86• 1997 : fondation de the Open Group• 1999 : projet X.org• 2012 : sortie en X11R7.7

Page 24: C3 - Langage C - ISIMA 1 - Troisieme partie

24

Concepts

• Modèle client-serveur• Protocole X• Evénements• Display / écrans• Ressources éventuellement partagées

• Fenêtres• Contextes graphiques• Polices de caractères• Cartes de couleurs• Curseurs• Pixmaps

Page 25: C3 - Langage C - ISIMA 1 - Troisieme partie

25

Relation client-serveur

Serveur

Client

Client

Client

Protocole de communication

Service

Demandeur

Réseau (IP)Même machine (IPC)

Page 26: C3 - Langage C - ISIMA 1 - Troisieme partie

26

Client X / Serveur X• Deux processus distincts• Communication grâce au protocole X• Client X

Programme utilisateur qui exploite le serveur X Soumets de requêtes d’affichage Gère l’interaction avec l’utilisateur

• Serveur X Gestion et contrôle des E/S Gère un display (écran(s), souris, clavier)

• Inversion géographique par rapport au modèle classique

Page 27: C3 - Langage C - ISIMA 1 - Troisieme partie

27

Protocole X

• Description de la communication entre le client et le serveur X

• Gestion asynchrone des événements Pas d’attente de synchronisation Zones mémoire tampon

• Indépendant de l’architecture Réseau TCP/IP Inter Processus Communication

Page 28: C3 - Langage C - ISIMA 1 - Troisieme partie

28

Serveur X / Display

Carte graphiqueMémoirePériphériques d’entrée sortieMulti écrans ?

Multi écrans ?

Problématiques / portabilité• Taille de l’écran• Nombre de couleurs (profondeur)

Page 29: C3 - Langage C - ISIMA 1 - Troisieme partie

29

1 serveur X, 1 display, 1 écrana110.isima.fr:0.0

1 serveur X, 1 display, 2 écransa110.isima.fr:0.0 et a110.isima.fr:0.1

Clients X

Serveur

Terminal

Terminal

Réseau

Protocole X

Page 30: C3 - Langage C - ISIMA 1 - Troisieme partie

30

Fenêtre• Composant de base obligatoire• Hiérarchie de fenêtres

Fenêtre racine root non modifiable Client particulier : le gestionnaire

• Tous les événements/actions se font relativement à une fenêtre Une seule fenêtre reçoit les événements claviers

• Le client est responsable de l’affichage, pas le serveur Fenêtre pas affichée par défaut

Page 31: C3 - Langage C - ISIMA 1 - Troisieme partie

31

Evénements (1)

1. Entrées-sorties Appui sur une touche (avoir le focus) Clic de souris

2. Gestion des fenêtres Affichage/rafraîchissement de fenêtre (Exposure) Redimensionnement Mise en icône

3. Changement de configuration4. Communication entre clients

Page 32: C3 - Langage C - ISIMA 1 - Troisieme partie

32

Evénements (2)

• Relatifs à une fenêtre Propagation dans la hiérarchie Sélection et filtre

• Asynchrones• Pour le client

boucle principale d’attente et de gestion• Structures XEvent

Page 33: C3 - Langage C - ISIMA 1 - Troisieme partie

33

Quelques rappels de codage

0 0 00 1 11 0 11 1 1

0 0 00 1 01 0 01 1 1

0 0 00 1 11 0 11 1 0

OU|

ET&

OU EXCLUSIFXOR

Mettre à 1 les bits d’un masque en fonction de certains critères

Afficher deux fois un pixel l’efface

Page 34: C3 - Langage C - ISIMA 1 - Troisieme partie

34

Ecrire un programme

1. Déclarations & initialisations générales2. Connexion au serveur X3. Initialisations spécifiques X

• Créer les ressources• Afficher la fenêtre

4. Boucle principale• Réception & analyse des événements

5. Libération des ressources

Page 35: C3 - Langage C - ISIMA 1 - Troisieme partie

35

Inclusions des entêtes• Entêtes spécifiques à adapter, au minimum

• Ne pas oublier de mettre l’option –lX11à l’édition des liens

• Préciser les chemins des bibliothèques –Lrépertoire –L/usr/X11R6/lib par exemple

Des entêtes -Irépertoire

#include <X11/Xlib.h> /* ou */#include <X11R6/Xlib.h>

/* et d’autres suivant l’utilité */

Page 36: C3 - Langage C - ISIMA 1 - Troisieme partie

36

Window root; Window win; Display * dpy;

int ecran;

unsigned int wpx, bpx;

XEvent ev; unsigned int mask;

Fenêtre racine Fenêtre à créer display

écran par défaut

couleur d’avant-plan couleur de fond

événement masque

Déclarations

Page 37: C3 - Langage C - ISIMA 1 - Troisieme partie

37

Connexion & informations

dpy = XOpenDisplay(0);

ecran = DefaultScreen(dpy); root = DefaultRootWindow(dpy);

bpx = BlackPixel(dpy,ecran); wpx = WhitePixel(dpy,ecran);

Macros de convenance : ne commencent pas par X

Ouverture de la connexion

Tester si NULL

Récupération d’informations

Couleurs utilisées par l’écran

Page 38: C3 - Langage C - ISIMA 1 - Troisieme partie

38

Créer une fenêtre

win = XCreateSimpleWindow( dpy,root,0,0, LARGEUR,HAUTEUR,6,wpx,bpx);

XStoreName(dpy,win, "Titre fenêtre");

XSelectInput(dpy,win, ExposureMask );

XMapWindow(dpy,win);

Sélection des événements intéressants pour la fenêtre

Affichage de la fenêtre

Page 39: C3 - Langage C - ISIMA 1 - Troisieme partie

39

Sélection d’événements

Evénement Masque Valeur(fictive)

Masquerésultat

00000000

Expose ExposeMask 00000001 00000001

KeyPress KeyPressMask 00000010 00000011

ButtonPress ButtonPressMask 00001000 00001011

ButtonRelease ButtonReleaseMask 00010000 00011011

MotionNotify Button1MotionMask 10000000 10011011

Page 40: C3 - Langage C - ISIMA 1 - Troisieme partie

40

while(!sortie) { XNextEvent(dpy, &ev); switch(ev.type) { case Expose : afficheGraphisme(); break; case KeyPress : saisie(); break; case ButtonPress : default : puts("Evenement Inconnu !"); break; }}

Boucle principale

variable sortie mise à jour dans une des fonctions

Page 41: C3 - Langage C - ISIMA 1 - Troisieme partie

41

Libérer les ressources

• Détruire la fenêtre & fermer la connexion

• Rendre les ressources liées aux Contextes graphiques Polices de caractères Curseurs souris Pixmaps …

XDestroyWindow(dpy, win);XCloseDisplay(dpy);

XFreeGC(dpy, gcontext);

Page 42: C3 - Langage C - ISIMA 1 - Troisieme partie

42

Contexte graphique• Toutes les informations pour une opération

graphique• Dessin d’une forme

Épaisseur de trait• Affichage de texte lié à une police de caractères• Couleur d’avant plan

foreground color ou white pixel• Couleur de fond

background color ou black color

Page 43: C3 - Langage C - ISIMA 1 - Troisieme partie

43

GC gcontext;XGCValues gcv;unsigned long gcmask;

gcv.foreground = wpx;gcv.background = bpx;gcv.line_width = 3;

gcv.function = GXcopy;

gcmask = GCForeground | GCBackground | GCLineWidth | GCFunction;

gcontext = XCreateGC(dpy,win,gcmask,&gcv);

Variables

Couleur et trait

Affichage des pixels (remplacement, XOR…)

Masque pour champs renseignés précédemment

Création du contexte graphique

Page 44: C3 - Langage C - ISIMA 1 - Troisieme partie

44

Dessiner

• Dessin dans une boite (largeur, hauteur)• XDrawLine• XDrawRectangle• XFillRectangle• XDrawArc• XFillArc

angles en 64èmes de degrés

(0,0)

y

x

Coin haut gauche+ largeur+ hauteur

Page 45: C3 - Langage C - ISIMA 1 - Troisieme partie

45

Dans les exemples fournis…

• Comment changer un curseur de souris Sablier, pointeur, …

• Comment afficher une chaîne de caractères Impossible avec un premier événement

• Saisir une chaîne de caractère• Charger/libérer une police de caractères

Page 46: C3 - Langage C - ISIMA 1 - Troisieme partie

46

Gestion de la couleur

• Gestion compliquée lié à la disparité du matériel et à l’âge des concepts Frame buffer, plan de bits Profondeur d’écran depth

• Exemples de visuels visual Monochrome, niveau de gris Mode direct color & true color (24 bits)

• Palette colormap Niveaux de Rouge Vert Bleu

Page 47: C3 - Langage C - ISIMA 1 - Troisieme partie

47

Couleurs et fonctions utiles• XGetVisualInfo();• DefaultVisual();• DefaultDepth();• DefaultColormap();• XCreateColormap();• XAllocColorCells();• XSetWindowColormap();• XStoreColor();• XFreeColormap();

Page 48: C3 - Langage C - ISIMA 1 - Troisieme partie

48

Images / pixmaps• pixmap XCreatePixmap (display, fenetre, largeur, hauteur, codage_coul);

• XCopyArea(display, drawable_origine, drawable_destination, contexte_graphique, origine_x, origine_y, largeur, destination, destination_x, destination_y);

• XFreePixmap(display, pixmap);• XClearWindow(display, fenetre);

Page 49: C3 - Langage C - ISIMA 1 - Troisieme partie

49

Au delà du C …• Concepts X réutilisés partout notamment la

programmation événementielle• Notions

Affichage graphique Portabilité

• Langages avec interfaces graphiquesquasi-natives JAVA C# Visual C++

• Aller plus loin http://pficheux.free.fr/articles/lmf/xlib/ http://tronche.com/gui/x/xlib/

Page 50: C3 - Langage C - ISIMA 1 - Troisieme partie

APERÇU SUR LES ARBRES

Page 51: C3 - Langage C - ISIMA 1 - Troisieme partie

51

Arbres

• Structures arborescentes d'éléments ordonnables

• Efficacité et rapidité des algorithmes• Moins facile (parfois) à comprendre

• Insertion, suppression de nœuds• Equilibrage des branches ?

Page 52: C3 - Langage C - ISIMA 1 - Troisieme partie

52

10

5 13

3 7 15

91

Racine de l'arbreInsertion de 5, 13, 7, 15, 3, 9, 1

Nœud

Feuille

Page 53: C3 - Langage C - ISIMA 1 - Troisieme partie

53

10

5 13

3 7 15

91

PROFONDEUR

Exemple d'arbreéquilibré

Page 54: C3 - Langage C - ISIMA 1 - Troisieme partie

54

10

5

3 7

9

Exemple d'arbrenon équilibré 7

5 9

103

Exemple d'équilibragepossible

Page 55: C3 - Langage C - ISIMA 1 - Troisieme partie

55

Déclaration

struct noeud { int valeur; struct noeud * gauche; struct noeud * droit;}

Elément de classementFils gauche et fils droitDonnées portées ?

g dvaleur

Page 56: C3 - Langage C - ISIMA 1 - Troisieme partie

56

Parcours d'arbre• Affichage ?• Recherche ?

• Fonctions récursives (facile à comprendre) Parcours infixe Parcours préfixe Parcours postfixe

• Fonctions "dérécursivées" Souvent plus efficaces Usage d'une pile ?

Page 57: C3 - Langage C - ISIMA 1 - Troisieme partie

57

Parcours infixe

void parcours_infixe(struct noeud * r) {  if (r) {         parcours_infixe(r->gauche); printf("Valeur %d", r->valeur);     parcours_infixe(r->droit);   }}

r

Page 58: C3 - Langage C - ISIMA 1 - Troisieme partie

58

10

5 13

3 7 15

91

NULL

Parcours infixe sur racine "10"

Page 59: C3 - Langage C - ISIMA 1 - Troisieme partie

59

Parcours préfixe

void parcours_prefixe(struct noeud * r) {  if (r) {    printf("Valeur %d", r->valeur);     parcours_prefixe(r->gauche);     parcours_prefixe(r->droit);   }}

Page 60: C3 - Langage C - ISIMA 1 - Troisieme partie

60

10

5 13

3 7 15

91

NULL

Parcours préfixesur racine "10"

Page 61: C3 - Langage C - ISIMA 1 - Troisieme partie

61

Parcours postfixe

void parcours_postfixe(struct noeud * r) {  if (r) {        parcours_postfixe(r->gauche);     parcours_postfixe(r->droit); printf("Valeur %d", r->valeur);   }}

Page 62: C3 - Langage C - ISIMA 1 - Troisieme partie

62

10

5 13

3 7 15

91

NULL

Parcours suffixe sur racine "10"

Page 63: C3 - Langage C - ISIMA 1 - Troisieme partie

63

{ while ((r) && (valeur != r->valeur)) {     if (valeur < r->valeur) r = r->gauche; else r = r->droit;   } return r;}

Recherche

struct noeud * recherche (struct noeud * r, int valeur)

Page 64: C3 - Langage C - ISIMA 1 - Troisieme partie

64

void inserer (struct noeud *r, struct noeud * n) {  int ind = 0; struct noeud * prec; while (r) {    prec = r;    if (n->valeur < prec->valeur) {       ind = 0; r = r->gauche;    } else {       ind = 1; r = r->droit;    } }    

if (ind) prec->droit = n;  else prec->gauche = n; }

Insertion

Conditions :1. L'arbre existe2. Pas d'équilibrage

Page 65: C3 - Langage C - ISIMA 1 - Troisieme partie

65

TD

• Un arbre est créé dynamiquement• Comment libérer toute la mémoire ?

Procédure récursive ? Parcours correct de l'arbre

Page 66: C3 - Langage C - ISIMA 1 - Troisieme partie

C & UNIX

1. Processus2. Interface3. Entrées/sorties de bas niveau

Page 67: C3 - Langage C - ISIMA 1 - Troisieme partie

67

Processus

• Identifiant unique processus identifier Type spécial pid_t

• Processus père (sauf processus 0)

pid_t getppid();

pid_t getpid();

$ echo $$ (shell)

Page 68: C3 - Langage C - ISIMA 1 - Troisieme partie

68

Copie de processus (1)

• Création d'un processus fils, copie conforme du processus père Même zone de données et de code Même environnement Même priorité Même description de fichiers

• Exécution concurrente des deux processus

Page 69: C3 - Langage C - ISIMA 1 - Troisieme partie

69

Copie de processus (2)

Valeur de retour :-1 : erreur lors de la création

limite du nombre de processus 0: processus fils>0 : processus père, pid du processus fils

Après un fork(), tout se passe comme si chacun venait de faire un fork()

pid_t fork(); #include <unistd.h>

Page 70: C3 - Langage C - ISIMA 1 - Troisieme partie

70

Terminaison de processus

• Terminaison "normale" Fin de la fonction main() Fonction

• Valeur transmise au shell Retour du main() Paramètre d'exit()

void exit(int);

0 : fin normale

$ echo $? (shell [k]sh)> print ERRORLEVEL (win)

Page 71: C3 - Langage C - ISIMA 1 - Troisieme partie

71

exit()

• Définie dans

• Sortie propre du programme Tampons vidés Fichiers fermés

• Libérer la mémoire allouée sur le tas

#include <stdlib.h>

ptr = malloc(…);if (!ptr) exit(2);

Page 72: C3 - Langage C - ISIMA 1 - Troisieme partie

72

#include <stdio.h>#include <unistd.h>void main() {  pid_t pid;  switch(pid=fork()) {    case (pid_t) -1 : printf("Erreur");      exit(2);     case (pid_t) 0 : /* sleep(100); */      printf("FILS: %d (PERE: %d)", getpid(), getppid());       exit(0);     default : printf("PERE:%d (PÈRE: %d)", getpid(), getppid()); }

Exemple 1

Page 73: C3 - Langage C - ISIMA 1 - Troisieme partie

73

int i;for (i = 0; i < 3; i++) fork();

Exemple 2

• Combien de processus sont créés ?

i=0 i=1

i=1

i=2

i=2

i=2

i=2

Page 74: C3 - Langage C - ISIMA 1 - Troisieme partie

74

Interface C / Système

• Faire un appel système

• Passer des paramètres (ligne de commande)

• Flux standards

int system(char *);

int main(int, char **);

system("ls –l");system("date");

stdin : entrée standard <stdout : sortie standard >stderr : sortie d'erreur standard 2>

Page 75: C3 - Langage C - ISIMA 1 - Troisieme partie

75

Entrées/sorties de bas niveau• Fonctions fichiers de haut niveau

Fonctions textes ou binaires• Fonctions de bas niveau

Proches des primitives systèmes Plus rapide / plus directe Pas de formatage des données Pas de mémoire tampon Pas toujours portables

• Ne pas mélanger les deux types d'accès sur un même fichier

Page 76: C3 - Langage C - ISIMA 1 - Troisieme partie

76

Descripteur de fichier

• Simple entier pour repérer un fichier Equivalent de FILE des fonctions haut niveau

• Valeur réservée ou personnelle

• Nombre de fichiers ouverts simultanément limité

0 stdin1 stdout

2 stdout

3 Fichier spécial E/S

4 Imprimante

Page 77: C3 - Langage C - ISIMA 1 - Troisieme partie

Création / ouverture

• Création

Permission d'accès en octal• Ouverture

77

int creat(char * nom, int permission);

int open(char * nom, int mode, int perm);

O_RDONLY Lecture seule

O_WRONLY Ecriture seule

O_RDWR Lecture/écriture

Fonctions et constantes non standardisées• fcntl.h (Sys V)• sys/file.h (BSD)

Page 78: C3 - Langage C - ISIMA 1 - Troisieme partie

Fermeture/destruction

• Fermeture

Permission d'accès en octal• Destruction

78

int close(int fd);

void unlink(char * nom)

Page 79: C3 - Langage C - ISIMA 1 - Troisieme partie

Lecture/écriture/position

• Lecture

-1 en cas d'erreur, 0 pour EOF, n si tout va bien• Ecriture

• Position

• PPP

79

int read(int fd, char * tampon, int n);

int write(int fd, char * tampon, int n)

long tell(int fd);

long lseek(int fd, long off, int or);

0 SEEK_SET Début fichier

1 SEEK_CUR Position courante

2 SEEK_END Fin de fichier

Page 80: C3 - Langage C - ISIMA 1 - Troisieme partie

80

int getchar(void) {   char c; return (read(0, &c,1)==1?(int)c:EOF; }

int getchar(void) {   static char tampon[BUFSIZE]; static char * ptamp = tampon; static int n = 0;

if (!n) {   n = read (0, tampon, BUFSIZE); ptamp = tampon; } return (--n>=0)?(int)*ptamp++:EOF; }

Avec buffer

Sans buffer