Have in mind that errno is not necessarily a variable but that the syntax is only an indication how it might been declared. On many modern systems with thread interfaces errno is some macro that resolves to an object that is local to the current thread.
When a standard library function fails, it often sets errno to the appropriate error code. The C standard requires at least 3 values for errno be set:
| Value | Meaning |
|---|---|
| EDOM | Domain error |
| ERANGE | Range error |
| EILSEQ | Illegal multi-byte character sequence |
If perror is not flexible enough, you may obtain a user-readable error description by calling strerror from <string.h>.
int main(int argc, char *argv[])
{
FILE *fout;
int last_error = 0;
if ((fout = fopen(argv[1], "w")) == NULL) {
last_error = errno;
/* reset errno and continue */
errno = 0;
}
/* do some processing and try opening the file differently, then */
if (last_error) {
fprintf(stderr, "fopen: Could not open %s for writing: %s",
argv[1], strerror(last_error));
fputs("Cross fingers and continue", stderr);
}
/* do some other processing */
return EXIT_SUCCESS;
}
To print a user-readable error message to stderr, call perror from <stdio.h>.
int main(int argc, char *argv[])
{
FILE *fout;
if ((fout = fopen(argv[1], "w")) == NULL) {
perror("fopen: Could not open file for writing");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
This will print an error message concerning the current value of errno.