Cours 1



next up previous
Next: Chapitre 2 Up: Cours systèmes Previous: Avant Propos

Plan

  • Systèmes d'exploitation
  • Réseaux
  • Système de fichiers en Unix
  • Le shell Unix
  • Le langage C. Typage faible. C++. Ansi C
  • Manipulations des chaines de caractères et des pointeurs en C
  • Environnement de programmation adb, dbx, gdb
  • Exercices


  • Cours 1

    Systèmes d'exploitation (operating systems)

  • Applications

  • Librairies systèmes (entrées/sorties)
  • Appels système (read, write)
  • Noyau unix (/vmunix)
  • Le système est l'ensemble des librairies, des appels-système et du noyau.


    Cours 1

    Systèmes (historique)

  • traitement par lots (batch)
  • multiprogrammation (60-65)
  • temps partagé (1963, SDS 930, Butler Lampson, UCB; 1967, GE 645 Multics, Corbato -- Organick, MIT)
  • temps partagé standard (1969, PDP 7--11, Unix, Ken Thompson, Dennis Ritchie, Bell labs; 1979, Vax/750, Bill Joy, Ozalp Babaoglu, UCB)
  • TIT     .MULTICS SYSTEM : AN EXAMINATION OF ITS STRUCTURE
    ZAUT    .ORGANICK, ELLIOTT I.
    DAT     .1972
    EDI     .MIT PRESS,CAMBRIDGE, MA
    

    Autres systèmes:

  • Alto, Dorado, Macintosh, Taos (Xerox PARC)
  • CTSS, ITS (MIT)
  • Tops10/20, Sail (DEC, SU)
  • SunOS, System V, Posix (Sun, AT&T)
  • Mach (CMU), OSF (complément de Sun et AT&T)
  • VMS, Windows NT ... Sprite, Opal, Plan 9, Topaz


  • Cours 1

    Réseaux

    Fonctions
  • Réseaux locaux: distribution des fichiers, interaction.
  • Interconnexion: courier, transferts de fichiers.
  • Technologie

  • Réseaux locaux (1975, Ethernet, Metcalfe, Xerox PARC, 3-10Mbds; Token ring 10Mbds, CMU/ITC; 1985 FDDI 100Mbds, INRIA; 1990 1Gbds, DEC/SRC)
  • Interconnexion (ARPAnet 1970; uucp 1980; Internet 1985)


  • Cours 1

    Système de fichiers Unix

  • Arborescent


  • Liens en dûr, et liens symboliques


  • /vmunix le noyau du système


  • /etc/init le programme qui s'exécute au boot:




  • Cours 1

    Système de fichiers Unix (exemples)

  • /bin, /usr/bin, /usr/local/bin, /usr/ucb binaires des commandes
  • /lib, /usr/lib, /usr/local/lib librairies
  • /tmp fichiers temporaires
  • /usr/users/cie6/knaff home directory (la correspondance se trouve dans /etc/passwd)
  • /etc fichiers annexes système
  • /dev les périphériques
  • /man les manuels


  • Cours 1

    L'interpréteur de commandes (/bin/sh)

  • faire man sh, man csh, man tcsh, man bash, man perl
  • faire learn sur poly
  • entrée/sortie standards
  • redirection de celles-ci
  • composition pipes
  • jokers *, ?
  • petit langage de contrôle
  • variables d'environnement
  • script-shells, paramètres $0, $1, $2, etc
  • fonctions `xxx`
  • quotes 'a*b', "a*$1"
  • TIT     .The UNIX programming environment
    SLA     .Brian W. Kernighan, Rob Pike. - Englewood Cliffs, NJ
            .: Prentice-Hall, 1984. - X-357 p. ; 24 cm. - (Prentice-
            .Hall software series).
    


    Cours 1

    L'interpréteur de commandes (exemples)

  • who | wc -l
  • hist | spline | psplot | lpr
  • (cd directory1; tar cf - fichier1) | (cd directory2; tar xf -)
  • (date; who) > foto1
  • (date; who) >> foto1
  • mail -s URGENT levy <lettre_de_protestation
  • ls a*.c
  • echo *
  • emacs notre éditeur de texte favori (Richard Stallman, FSF)


  • Cours 1

    Le langage C -- Dennis Ritchie (Bell labs 1972)

  • BCPL, B, C, typage faible, portabilité, ne pas gaspiller un seul octet
  • fonctions et procedures non imbriquées (pour efficacité)
  • manipulation agréable des pointeurs
  • bon interface avec Unix (tout Unix est écrit en C)
  • TIT     .BCPL : THE LANGUAGE AND ITS COMPILER
    AUT     .Richards, Martin. / Whitby-Strevens, Colin.
    DAT     .1979
    EDI     .CAMBRIDGE UNIVERSITY PRESS,CAMBRIDGE, MA
    
    TIT     .The C programming language
    SLA     .Brian W. Kernighan, Dennis M. Ritchie. - Englewood Cliffs,
            .NJ : Prentice Hall, 1978. - X-228 p. ; 24 cm. - (Prentice
            .Hall software series).
    


    Cours 1

    Exemple 1 de programme C

    const N = 100;
    var a: array [1..N] of integer;
    
    procedure Insertion;
    
        var i, j, v: integer;
    
        begin
        for i := 2 to N do 
            begin
            v := a[i]; j := i;
            while a[j-1] > v do
                begin a[j] := a[j-1]; j:= j-1 end;
            a[j] := v;
            end;
        end;
    
    
    #define N     100
    int a[100];
    
    void Insertion()
    {
        int i, j, v;
    
        for (i = 1; i < N; ++i) {
            v = a[i]; j = i;
            while (a[j-1] > v) {
                a[j] = a[j-1]; j = j-1;
            }
            a[j] = v;
        }
    }
    


    Cours 1

    Exemple 1 (suite)

    
    void Insertion()
    {
        register int i, j, v;
    
        for (i = 1; i < N; ++i) {
            v = a[i];
            for (j = i; (j > 0) && (a[j-1] > v); --j)
                a[j] = a[j-1];
            a[j] = v;
        }
    }
    
    


    Cours 1

    Exemple 1 (suite)

  • &x
  • (références)
  • &p (pointeurs)
  • Première équation des pointeurs
            *&x == x
    
  • Horreurs en C

    void Insertion()
    {
        int v, *p, *q;
    
        for (p = &a[1]; p < &a[N]; ++p)
            v = *p;
            for (q = p; (p > &a[0]) && (*(q-1) > v); --q)
                *q = *(q-1);
            *q = v;
        }
    }
    
    void Insertion()
    {
        register int v, *p, *q;
    
        for (p = a + 1; p < a + N; ++p)
            v = *p;
            for (q = p; (p > a) && (*(q-1) > v); --q)
                *q = *(q-1);
            *q = v;
        }
    }
    


    Cours 1

    Exemple 1 -- Programme principal

    
    #include <stdio.h>
    #define N     100
    int a[N];
    
    void Insertion (int a[], int n)
    {
    ...
    }
    
    int main()
    {
        int x, n;
    
        printf ("Entrez les nombres a trier (-1 pour terminer)\n");
        n = 0;
        for (;;) {
            scanf ("%d\n", &x);
            if ((x == -1) || (n >= N))
                break;
            a[n++] = x;
        }
        Insertion (a, n);
        for (i = 0; i < n; ++i)
            printf ("a[%2d] = %d\n", i, a[i]);
    }   
    


    Cours 1

    Remarques sur C (1)

  • Appel par référence == Appel par valeur sur l'adresse
    void Exchange (int *p, int *q)
    {
        int r;
    
        r = *p; *p = *q; *q = r;
    }
    
    int main ()
    {
        int x, y;
        Exchange (&x, &y);
    }
    
  • Deuxième équation des pointeurs:
                 &a[i] == a + i
    pour tout tableau a et entier i. Donc, si on a un tableau int a[1000], une procédure f de signature f(int *p) peut s'écrire f(&a[0]) ou f(a). On peut aussi déclarer la signature sous la forme f(int p[]) avec un tableau ouvert.


  • En C, les chaines de caractères sont des tableaux de caractères finis par le caractère null (0 en ASCII). Donc
    char nom[] = "levy";
    
    nom[0] == 'l'           nom[1] == 'e' 
    nom[2] == 'v'           nom[3] == 'y' 
    nom[4] == 0 == '\0' 
    


  • Cours 1

    Remarques sur C (2)

  • Toute expression suivie de ";" (et précédée éventuellement d'une étiquette) devient une instruction. Comme x = 1 est une expression retournant la valeur de son membre droit 1, on écrit:
    if (x == 3)
        x = 1;
    else
        x = 0;
    }
    
  • Une instruction composée est une suite d'éventuelles déclarations et d'instructions encadrée par { et }.
  • Les enregistrements ``structures'':
    struct point {
        int x;
        int y;
    };
    
    struct point p, q;
    
    ... p.x = q.x - 2; ...
    
    struct complex {
        float re;
        float im;
    } z1, z2;
    
    struct complex z3;
    
    ... z.re = 3.14; ...
    


  • Cours 1

    Remarques sur C (3)

  • Structures récursives:
     
    struct tnode {
        char *word;
        int count;
        struct tnode *left;
        struct tnode *right;
    }
    
    struct t {
        ...
        struct s *p;
    };
    
    struct s {
        ...
        struct t *q;
    }
    
  • Pointeurs vers des structures:
    struct tnode *p; 
    
    ...(*p).left...  
    ...p->left...
    
  • Pointeurs vers des fonctions:
    int *f(); est une fonction retournant un pointeur vers des int
    int (*pf)(); est un pointeur vers une fonction


  • Cours 1

    Remarques sur C (4)

  • Unions (type somme ou variant):
    union complexe { 
       struct cartesien {
           float: re;
           float: im;
       };
       struct polaire {
           float: rho;
           float: theta;
       };
    } x, y;
    
    ...x.cartesien.re...
    ...y.polaire.rho...
    
  • Typedefs (nouvelle structure de données)
    typedef unsigned long   u_long;
    
    u_long x, y;
    
  • Coercion ``cast''
    float x = 3.14;
    int i;
    i = (int) x;
    
    short x;
    char *p;
    p = (char *) &x;
    


  • Cours 1

    Remarques sur C (5)

  • sizeof, malloc
    #include <stdlib.h> 
    
    /* talloc: make a node */
    struct tnode *talloc (void)
    {
        return (struct tnode *) malloc (sizeof(struct tnode));
    }
    


  • Cours 1

    Exemple de programme C (1)

  • Entrer le programme sous emacs et le sauver dans prog1.c
  •  
    
    #include <stdio.h>
    
    int main() /* count digits, white space, others */
    {
        int c, i , nwhite, nother, ndigit[10];
    
        nwhite = nother = 0;
        for (i = 0; i < 10; ++i)
            ndigit[i] = 0;
        while ((c = getchar()) != EOF) {
            switch (c) {
            case '0': case '1': case '2': case '3': case '4':
            case '5': case '6': case '7': case '8': case '9':
                ++ ndigit [c - '0'];
                break;
            case ' ':
            case '\n':
            case '\t':
                nwhite++;
                break;
            default:
                nother++;
                break;
            }
        }
        printf("digits =");
        for (i = 0; i < 10; i++)
            printf(", white space = %d, other = %d\n",
                nwhite, nother);
    }
    



    Cours 1

    Example de programme C (2)

  • Commande de compilation et exécution
    % cc prog1.c
    % a.out
    
  • Mise au point. On peut se servir de adb, dbx ou {\tt gdb}. Ce dernier est fortement conseillé sous emacs, si on a des bonnes macros pour interfacer la souris.
  • Mettre dans le fichier .emacs de son homedir, la ligne
    (load "/usr/users/labos/profs/levy/emacs/x-mouse-s.elc")

    Compiler prog1.c avec l'option -g
    % cc -g prog1.c
    Sous emacs, taper la commande sur le fichier binaire a.out. Dans le binaire, le nom du fichier source et des indications sur les variables et numéros de lignes ont été rajoutées par l'option -g de cc.
    LIRE LE MANUEL GDB
    On peut par exemple aller dans le source en pointant avec la souris (bouton de gauche), et mettre un point d'arrêt avec la commande CTL-X-SPACE met un point d'arrêt sur cette ligne. En allant dans le buffer gdb, on peut taper
    (gdb) run, pour démarrer
    (gdb) p nwhite pour imprimer nwhite
    (gdb) cont ...



    Cours 1

    Quelques exemples de programmes de librairie

    En /usr/local/src/src.pmax/ultrix-3.1-pmax/lib/libc/gen, le programme de conversion de chaines ASCII en entier.
    % more atoi.c
    /* @(#)atoi.c   4.3 (Berkeley) 81/02/28 */
    int atoi(p)
    register char *p;
    {
            register int n;
            register int f;
    
            n = 0;
            f = 0;
            for(;;p++) {
                    switch(*p) {
                    case ' ':
                    case '\t':
                            continue;
                    case '-':
                            f++;
                    case '+':
                            p++;
                    }
                    break;
            }
            while(*p >= '0' && *p <= '9')
                    n = n*10 + *p++ - '0';
            return(f? -n: n);
    }
    
    Regarder lib/libc/mips/gen/atof.c!!

    Cours 1

    Quelques exemples de programmes de librairie

    En lib/libc/mips/gen/strncmp.c
    % more strncmp.c
    /* $Header: strncmp.c,v 1.1 87/02/16 11:17:00 dce Exp $ */
    
    /*
     * Compare strings (at most n bytes):  s1>s2: >0  s1==s2: 0  s1<s2: <0
     */
    
    strncmp(s1, s2, n)
    register char *s1, *s2;
    register n;
    {
    
            while (--n >= 0 && *s1 == *s2++)
                    if (*s1++ == '\0')
                            return(0);
            return(n<0 ? 0 : *s1 - *--s2);
    }
    
    Regarder lib/libc/mips/gen/atof.c!!

    Cours 1

    Quelques exemples de programmes de librairie

    En lib/libc/mips/gen/strcpy.c
    % more strncpy.c
    /* $Header: strncpy.c,v 1.1 87/02/16 11:17:02 dce Exp $ */
    
    /*
     * Copy s2 to s1, truncating or null-padding to always copy n bytes
     * return s1
     */
    
    char *
    strncpy(s1, s2, n)
    register char *s1, *s2;
    {
            register i;
            register char *os1;
    
            os1 = s1;
            for (i = 0; i < n; i++)
                    if ((*s1++ = *s2++) == '\0') {
                            while (++i < n)
                                    *s1++ = '\0';
                            return(os1);
                    }
            return(os1);
    }
    


    Cours 1

    Exercices en TD et à la maison

  • Débutants en C
    prendre le poly du TC et faire les premiers exemples de programme en C (tri bulle, tri insertion, etc). N'utiliser que scanf et printf pour les entrées/sorties.


  • Connaisseurs de C
    Vérifier vos connaissances sur les chaines de caractères (en prévision du mini-shell). Donc faire:
  • Pour lire, on ne fait qu'avec les primitives du poly de TC getchar(), getc(), putchar, putc,printf) et on utilise pour le moment que les file pointers (pas de fd SVP). On expliquera la logique des redirections que dans la lecon sur le système de fichier (TD2).

    Cours 1

    /usr/include/sys/ino.h?

    /usr/include/sys/ino.h?

    /*
     * Inode structure as it appears on
     * a disk block.
     */
    struct dinode
    {
            unsigned short  di_mode;/* mode and type of file */
            short   di_nlink;       /* number of links to file */
            short   di_uid;         /* owner's user id */
            short   di_gid;         /* owner's group id */
            off_t   di_size;        /* number of bytes in file */
            char    di_addr[40];    /* disk block addresses */
            time_t  di_atime;       /* time last accessed */
            time_t  di_mtime;       /* time last modified */
            time_t  di_ctime;       /* time created */
    };
    #define INOPB   8       /* 8 inodes per block */
    /*
     * the 40 address bytes:
     *      39 used; 13 addresses
     *      of 3 bytes each.
     */