Previous Up Next

3  Rappels Unix

Tous les appels systèmes renvoient -1 en cas d’erreur. Dans ce cas, la variable errno contient le code de l’erreur.

3.1  Obtenir des informations sur un fichier : stat

Pour obtenir des information sur un fichier, utiliser :
int stat (char *pathname, struct stat *buf);
int fstat (int fd, struct stat *buf);

La structure struct stat contient de nombreux champs (voir man stat pour plus de détails), dont st_uid (propriétaire du fichier), st_size (taille du fichier), st_mode (droit d’accès), st_mtime (date de dernière modification)…

#include <sys/types.h>
#include <sys/stat.h>
main (int argc, char **argv)
{
    struct stat buf;
    if (stat (argv[1], &buf) == -1)
      perror (argv[1]);
    else
      printf ("%s: proprietaire %d, taille %d\n", argv[1], buf.st_uid, buf.st_size);
}

3.2  Ouverture d’un fichier open

Pour obtenir un descripteur de fichier permettant d’accèder (lecteur ou écriture) à un fichier, on utilise l’appel système open. Les trois formes d’utilisation habituelles sont :

    int fd = open ("toto", O_RDONLY);
    int fd = open ("toto", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    int fd = open ("toto", O_WRONLY | O_CREAT | O_EXCL, 0644);
    if (fd == -1) { erreur... }

La première ligne ouvre le fichier en lecture ; la deuxième ouvre le fichier pour écriture, avec création s’il n’existe pas et troncature s’il existe déjà ; la troisième ligne ouvre le fichier pour écriture, avec création s’il n’existe pas et erreur s’il existe déjà. Le troisième argument est utilisé pour définir les droits d’accès (ici rw-r--r--) s’il y a création du fichier.

3.3  Lecture/écriture read/write

int read (int fd, void *buf, int nbyte);
int write (int fd, const void *buf, int nbyte);

L’appel système read lit sur le descripteur au plus nbyte octets et les range à l’adresse buf. Il renvoie le nombre d’octets effectivement lus, ou 0 si la « fin de fichier » a été atteinte (il n’y a et il n’y aura plus rien à lire : socket fermé ou fichier complètement lu), ou -1 en cas d’erreur.

L’appel système write écrit sur le descripteur au plus nbyte octets rangés à l’adresse buf. Il renvoie le nombre d’octets effectivement écrits, ou -1 en cas d’erreur.

Quand read ou write sont appliqués à un fichier, le nombre d’octets lus ou écrits est toujours le nombre demandé (sauf lorsque la fin du fichier est atteinte) ; quand ils sont appliqués à un descripteur associé à un socket, le nombre d’octets lus ou écrits peut être inférieur au nombre demandé.

3.4  Les signaux

Un signal est un événement asynchrone auquel il est possible d’associer un traitement spécifique (une procédure qui sera invoquée par le système à la délivrance du signal). En absence de traitement, un signal entraîne en général la mort du processus destinataire. L’association d’un traitement se fait au moyen de la primitive signal :

    void traitement_sig (int sig)
    {
        signal (SIGCHLD, traitement_sig); /* remise en place du traitement */
        ...
    }
    ...
    main()
    {
       ...
       signal (SIGCHLD, traitement_sig);
       ...
    }

Previous Up Next