Qu’est-ce que le prototype d’un wrapper d’appel système en C ?
int someSystemCall(…);
Code de retour :
−1 = erreur
≥ 0 = ok
< −1 = impossible
Variable globale errno :
type int
mise à jour en cas d’erreur
contenu non spécifié en cas de succès
Comment les flux noyeau sont-ils representer en C ?
Flux représenté par un descripteur de fichier
Par défaut :
0 -> stdin
1 -> stdout
2 -> stderr
reste non défini
Comment ouvrire un fichier avec les fonction “flux noyeau”
include <fcntl.h></fcntl.h>
-> int open(const char* path, int flags);
-> int open(const char* path, int flags, mode_t mode);
la fonction attribu le plus petit entier non attribué pour representer le flux..
La seconde version permet de spécifier des droit à la création d’un fichier
Flags fréquemment utilisés :
O_WRONLY écriture seule
O_RDONLY lecture seule
O_RDWR lecture + écriture
O_CREAT création si besoin
O_TRUNC supprime le contenu existant
O_APPEND ajout en fin de fichier
Lorsque O_CREAT :
cf man 2 chmod
Comment fermet un flux vers un fichier ouver par les fonction “flux noyau” en C ?
#include <unistd.h>
int close(int fd);
Comment lire et écrire dans un flux via les fonction “flux noyeau” en C ?
include <unistd.h></unistd.h>
-> ssize_t read(int fd, void* buf, size_t nbytes);
-> ssize_t write(int fd, const void* buf, size_t nbytes);
Code de retour :
−1 si erreur
sinon, n ≥ 0 = nb. d’octets lus écrits 0 si lecture en fin de fichier
⇝ curseur déplacé de n octets
buf peut être :
un pointeur vers de la mémoire allouée par malloc
l’adresse d’une variable locale
Comment modifier l’emplacement du curseur de lecture d’un flux via les fonction de “flux noyau” en C ?
include <unistd.h></unistd.h>
off_t lseek(int fd, off_t offset, int whence);
Code de retour :
−1 si erreur
sinon, pos ≥ 0 = nouvelle position absolue
whence peut être :
* SEEK_SET position par rapport au début du fichier
* SEEK_CUR position relative
* SEEK_END position par rapport à la fin du fichier
Comment dupliquer un flux via les fonction “flux noyau” en C ?
include <unistd.h></unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
Code de retour :
−1 si erreur
sinon, num. du nouveau descripteur de fichier
dup ouvre un nouveaux flux pour le flux entrée en paramêtre et lui attribut commme descripteur le plus petit entier naturel disponible.
dup2 attribu au descripteur de aldfd le flux du descripteur de newfd.
Comment ouvrir et fermer des flux via les fonction “libc” en C ?
include <stdio.h></stdio.h>
FILE* fopen(const char* path, const char* mode);
int
fclose(FILE* stream);
Retour pour fopen :
* NULL si erreur
* pointeur valide sinon
Retour pour fclose :
* 0 si succès
* EOF si erreur
Quels sont les mode de lecture de la “libc” et que font-ils ?
“r” : lecture | debut
“w” écriture | début | tronqué + créer le fichier si besoin
“a” écriture | fin |créer le fichier si besoin
“r+” lecture + écriture | début
“w+” : “r+” et tronqué + créer le fichier si besoin
“a+” : écriture + lecture | fin | créer le fichier si besoin
Comment lire et écrire (non formaté) dans un fichier ouvert par des fonctions “libc” en C ?
include <stdio.h></stdio.h>
-> size_t fread(void* ptr, size_t size, size_t nb, FILE* stream);
-> size_t fwrite(const void* ptr, size_t size, size_t nb, FILE* stream)
ptr = données à écrire/lues, à voir comme un tableau d’éléments
size = taille d’un élément
nb = nombre d’éléments à lire/écrire
stream = flux sur lequel faire l’opération
Valeur de retour :
* si succès, n ≥ 0 = nb. d’éléments lus/écrits
* pour fread, 0 si erreur ou fin de fichier
* pour fwrite, erreur quand n < nb
Comment lire et écrire (formaté) dans un fichier ouvert par des fonctions “libc” en C ?
include <stdio.h></stdio.h>
->int fprintf(FILE *stream, const char *format, …);
->int fscanf(FILE *stream, const char *format, …);
->int printf(const char *format, …);
->int scanf(const char *format, …);
Valeur de retour pour printf et fprintf :
<0 si erreur
n = nb. de caractères écrits sinon
Valeur de retour pour scanf et fscanf :
n = nb. de variables affectées
⇝ potentiellement moins que prévu, en cas d’erreur
Quelles sont les autres fonction utile à connaitre dans <stdio.h> en C ?
include <stdio.h>
-> int fseek(FILE *stream, long offset, int whence);
long ftell(FILE* stream);
-> int fflush(FILE *stream);
-> int feof(FILE *stream);
-> int ferror(FILE *stream);
-> int fileno(FILE *stream);
Comment arreter le programme via une fonction en C ?
include <stdlib.h></stdlib.h>
-> void exit(int status);
-> void _Exit(int status);
exit :
* flush et ferme les flux libc ouverts
* appelle les fonctions enregistrées via atexit
* libère les ressources
* termine le programme
_Exit :
* garantit seulement libération des ressources et terminaison
Comment manipuler les variables d’environnement (Valable pour UNIX) en C ?
include <stdlib.h>
-> char* getenv(const char* name);
-> int setenv(const char* name, const char* value, int overwrite);
-> int unsetenv(const char *name);
getenv retourne la valeur de la variable name qui peut être NULL
setenv définit ou met à jour la valeur de name
unsetenv supprime la variable name