Traitement des erreurs
Sous Linux, il est usuel que l’appel à des fonctions système retourne une valeur
entière signée (int syscall()
). Si la valeur retournée est 0
ou supérieur à 0
,
elle indique le succès de l’opération. Par contre, en cas d’erreur, on obtient
généralement -1
.
Le détail de l’erreur (sa cause / son type) peut être obtenu par l’intermédiaire de
la variable globale extern int errno;
déclarée dans le fichier <errno.h>
,
lequel définit aussi les codes d’erreurs du système, par exemple :
Code | Description | Code | Description |
---|---|---|---|
EPERM | Operation not permitted | EXDEV | Cross-device link |
ENOENT | No such file or directory | ENODEV | No such device |
ESRCH | No such process | ENOTDIR | Not a directory |
EINTR | Interrupted system call | EISDIR | Is a directory |
EIO | I/O error | EINVAL | Invalid argument |
ENXIO | No such device or address | ENFILE | File table overflow |
E2BIG | Argument list too long | EMFILE | Too many open files * |
ENOEXEC | Exec format error | ENOTTY | Not a typewriter |
EBADF | Bad file number | ETXTBSY | Text file busy |
ECHILD | No child processes | EFBIG | File too large |
EAGAIN | Try again | ENOSPC | No space left on device |
ENOMEM | Out of memory | ESPIPE | Illegal seek |
EACCES | Permission denied | EROFS | Read-only file system |
EFAULT | Bad address | EMLINK | Too many links |
ENOTBLK | Block device required | EPIPE | Broken pipe |
EBUSY | Device or resource busy | EDOM | Math argument out of domain of func |
EEXIST | File exists | ERANGE | Math result not representable |
La bibliothèque standard C fournit plusieurs services pour convertir les codes d’erreurs en une représentation textuelle et les afficher sur la console.
Exemple 1 :
#include <stdio.h>
#include <string.h>
#include <errno.h>
int ret = fonction();
if (ret == -1)
perror("ERROR");
Exemple 2 :
#include <stdio.h>
#include <string.h>
#include <errno.h>
int ret = fonction();
if (ret == -1) {
char estr[100] = {[0]=0,};
strerror_r(errno, estr, sizeof(estr)-1);
fprintf (stderr, "ERROR: %s", estr);
}
Remarque :
- La méthode
strerror
n’est pas thread-safe. Il est préférable d’utiliser la méthodestrerror_r
- Bien que la variable
errno
soit globale, sous Linux, elle est stockée par thread et par conséquent sûre.