The perror() function produces a message on standard error describing the last error encountered during a call to a system or library function. When a system call fails, it usually returns -1 and sets the variable errno to a value describing what went wrong. (These values can be found in .) Many library functions do likewise.

Command line execution

Terminalbash
gcc -o simple_perror simple_perror.c  If we run the program now as, $./simple_perror  fopen: No such file or directory  Above program show, how an error number of ENOENT gets automatically assigned as error code and perror prints human readable message as “No such file or directory” Below program shows some of the other probable error codes and messages as, #include <stdio.h> #include <errno.h> int main(int argc, char **argv) { 	 int i=0; 	 for (i=1; i<=133; i++) { 	 	 errno = i; 	 	 switch (i) { 	 	 	 case EPERM: perror("EPERM"); break; 	 	 	 case ENOENT: perror("ENOENT"); break; 	 	 	 case ESRCH: perror("ESRCH"); break; 	 	 	 case EINTR: perror("EINTR"); break; 	 	 	 case EIO: perror("EIO"); break; 	 	 	 case ENXIO: perror("ENXIO"); break; 	 	 	 case E2BIG: perror("E2BIG"); break; 	 	 	 case ENOEXEC: perror("ENOEXEC"); break; 	 	 	 case EBADF: perror("EBADF"); break; 	 	 	 case ECHILD: perror("ECHILD"); break; 	 	 	 case EAGAIN: perror("EAGAIN"); break; 	 	 	 case ENOMEM: perror("ENOMEM"); break; 	 	 	 case EACCES: perror("EACCES"); break; 	 	 	 case EFAULT: perror("EFAULT"); break; 	 	 	 case ENOTBLK: perror("ENOTBLK"); break; 	 	 	 case EBUSY: perror("EBUSY"); break; 	 	 	 case EEXIST: perror("EEXIST"); break; 	 	 	 case EXDEV: perror("EXDEV"); break; 	 	 	 case ENODEV: perror("ENODEV"); break; 	 	 	 case ENOTDIR: perror("ENOTDIR"); break; 	 	 	 case EISDIR: perror("EISDIR"); break; 	 	 	 case EINVAL: perror("EINVAL"); break; 	 	 	 case ENFILE: perror("ENFILE"); break; 	 	 	 case EMFILE: perror("EMFILE"); break; 	 	 	 case ENOTTY: perror("ENOTTY"); break; 	 	 	 case ETXTBSY: perror("ETXTBSY"); break; 	 	 	 case EFBIG: perror("EFBIG"); break; 	 	 	 case ENOSPC: perror("ENOSPC"); break; 	 	 	 case ESPIPE: perror("ESPIPE"); break; 	 	 	 case EROFS: perror("EROFS"); break; 	 	 	 case EMLINK: perror("EMLINK"); break; 	 	 	 case EPIPE: perror("EPIPE"); break; 	 	 	 case EDOM: perror("EDOM"); break; 	 	 	 case ERANGE: perror("ERANGE"); break; 	 	 	 case EDEADLK: perror("EDEADLK"); break; 	 	 	 case ENAMETOOLONG: perror("ENAMETOOLONG"); break; 	 	 	 case ENOLCK: perror("ENOLCK"); break; 	 	 	 case ENOSYS: perror("ENOSYS"); break; 	 	 	 case ENOTEMPTY: perror("ENOTEMPTY"); break; 	 	 	 case ELOOP: perror("ELOOP"); break; 	 	 	 case ENOMSG: perror("ENOMSG"); break; 	 	 	 case EIDRM: perror("EIDRM"); break; 	 	 	 case ECHRNG: perror("ECHRNG"); break; 	 	 	 case EL2NSYNC: perror("EL2NSYNC"); break; 	 	 	 case EL3HLT: perror("EL3HLT"); break; 	 	 	 case EL3RST: perror("EL3RST"); break; 	 	 	 case ELNRNG: perror("ELNRNG"); break; 	 	 	 case EUNATCH: perror("EUNATCH"); break; 	 	 	 case ENOCSI: perror("ENOCSI"); break; 	 	 	 case EL2HLT: perror("EL2HLT"); break; 	 	 	 case EBADE: perror("EBADE"); break; 	 	 	 case EBADR: perror("EBADR"); break; 	 	 	 case EXFULL: perror("EXFULL"); break; 	 	 	 case ENOANO: perror("ENOANO"); break; 	 	 	 case EBADRQC: perror("EBADRQC"); break; 	 	 	 case EBADSLT: perror("EBADSLT"); break; 	 	 	 case EBFONT: perror("EBFONT"); break; 	 	 	 case ENOSTR: perror("ENOSTR"); break; 	 	 	 case ENODATA: perror("ENODATA"); break; 	 	 	 case ETIME: perror("ETIME"); break; 	 	 	 case ENOSR: perror("ENOSR"); break; 	 	 	 case ENONET: perror("ENONET"); break; 	 	 	 case ENOPKG: perror("ENOPKG"); break; 	 	 	 case EREMOTE: perror("EREMOTE"); break; 	 	 	 case ENOLINK: perror("ENOLINK"); break; 	 	 	 case EADV: perror("EADV"); break; 	 	 	 case ESRMNT: perror("ESRMNT"); break; 	 	 	 case ECOMM: perror("ECOMM"); break; 	 	 	 case EPROTO: perror("EPROTO"); break; 	 	 	 case EMULTIHOP: perror("EMULTIHOP"); break; 	 	 	 case EDOTDOT: perror("EDOTDOT"); break; 	 	 	 case EBADMSG: perror("EBADMSG"); break; 	 	 	 case EOVERFLOW: perror("EOVERFLOW"); break; 	 	 	 case ENOTUNIQ: perror("ENOTUNIQ"); break; 	 	 	 case EBADFD: perror("EBADFD"); break; 	 	 	 case EREMCHG: perror("EREMCHG"); break; 	 	 	 case ELIBACC: perror("ELIBACC"); break; 	 	 	 case ELIBBAD: perror("ELIBBAD"); break; 	 	 	 case ELIBSCN: perror("ELIBSCN"); break; 	 	 	 case ELIBMAX: perror("ELIBMAX"); break; 	 	 	 case ELIBEXEC: perror("ELIBEXEC"); break; 	 	 	 case EILSEQ: perror("EILSEQ"); break; 	 	 	 case ERESTART: perror("ERESTART"); break; 	 	 	 case ESTRPIPE: perror("ESTRPIPE"); break; 	 	 	 case EUSERS: perror("EUSERS"); break; 	 	 	 case ENOTSOCK: perror("ENOTSOCK"); break; 	 	 	 case EDESTADDRREQ: perror("EDESTADDRREQ"); break; 	 	 	 case EMSGSIZE: perror("EMSGSIZE"); break; 	 	 	 case EPROTOTYPE: perror("EPROTOTYPE"); break; 	 	 	 case ENOPROTOOPT: perror("ENOPROTOOPT"); break; 	 	 	 case EPROTONOSUPPORT: perror("EPROTONOSUPPORT"); break; 	 	 	 case ESOCKTNOSUPPORT: perror("ESOCKTNOSUPPORT"); break; 	 	 	 case EOPNOTSUPP: perror("EOPNOTSUPP"); break; 	 	 	 case EPFNOSUPPORT: perror("EPFNOSUPPORT"); break; 	 	 	 case EAFNOSUPPORT: perror("EAFNOSUPPORT"); break; 	 	 	 case EADDRINUSE: perror("EADDRINUSE"); break; 	 	 	 case EADDRNOTAVAIL: perro

Implementation details

The function perror() serves to translate this error code into human-readable form. If we write a simple program to demonstrate this, it could be as following, #include <stdio.h> #include <errno.h> int main(int argc, char **argv) { FILE *fp = NULL; fp = fopen("this_is_perror_test.txt", "r"); if (fp == NULL) { perror("fopen"); } return 0; } OR this same program can also be written using strerror as, [bash] #include <stdio.h> #include <errno.h> #include <string.h> int main(int argc, char **argv) { FILE *fp = NULL; fp = fopen("this_is_perror_test.txt", "r"); if (fp == NULL) { fprintf(stderr, "fopen: %s\n", strerror(errno)); } return 0; } $ gcc -o simple_perror simple_perror.c If we run the program now as, $./simple_perror fopen: No such file or directory Above program show, how an error number of ENOENT gets automatically assigned as error code and perror prints human readable message as “No such file or directory” Below program shows some of the other probable error codes and messages as, #include <stdio.h> #include <errno.h> int main(int argc, char **argv) { int i=0; for (i=1; i<=133; i++) { errno = i; switch (i) { case EPERM: perror("EPERM"); break; case ENOENT: perror("ENOENT"); break; case ESRCH: perror("ESRCH"); break; case EINTR: perror("EINTR"); break; case EIO: perror("EIO"); break; case ENXIO: perror("ENXIO"); break; case E2BIG: perror("E2BIG"); break; case ENOEXEC: perror("ENOEXEC"); break; case EBADF: perror("EBADF"); break; case ECHILD: perror("ECHILD"); break; case EAGAIN: perror("EAGAIN"); break; case ENOMEM: perror("ENOMEM"); break; case EACCES: perror("EACCES"); break; case EFAULT: perror("EFAULT"); break; case ENOTBLK: perror("ENOTBLK"); break; case EBUSY: perror("EBUSY"); break; case EEXIST: perror("EEXIST"); break; case EXDEV: perror("EXDEV"); break; case ENODEV: perror("ENODEV"); break; case ENOTDIR: perror("ENOTDIR"); break; case EISDIR: perror("EISDIR"); break; case EINVAL: perror("EINVAL"); break; case ENFILE: perror("ENFILE"); break; case EMFILE: perror("EMFILE"); break; case ENOTTY: perror("ENOTTY"); break; case ETXTBSY: perror("ETXTBSY"); break; case EFBIG: perror("EFBIG"); break; case ENOSPC: perror("ENOSPC"); break; case ESPIPE: perror("ESPIPE"); break; case EROFS: perror("EROFS"); break; case EMLINK: perror("EMLINK"); break; case EPIPE: perror("EPIPE"); break; case EDOM: perror("EDOM"); break; case ERANGE: perror("ERANGE"); break; case EDEADLK: perror("EDEADLK"); break; case ENAMETOOLONG: perror("ENAMETOOLONG"); break; case ENOLCK: perror("ENOLCK"); break; case ENOSYS: perror("ENOSYS"); break; case ENOTEMPTY: perror("ENOTEMPTY"); break; case ELOOP: perror("ELOOP"); break; case ENOMSG: perror("ENOMSG"); break; case EIDRM: perror("EIDRM"); break; case ECHRNG: perror("ECHRNG"); break; case EL2NSYNC: perror("EL2NSYNC"); break; case EL3HLT: perror("EL3HLT"); break; case EL3RST: perror("EL3RST"); break; case ELNRNG: perror("ELNRNG"); break; case EUNATCH: perror("EUNATCH"); break; case ENOCSI: perror("ENOCSI"); break; case EL2HLT: perror("EL2HLT"); break; case EBADE: perror("EBADE"); break; case EBADR: perror("EBADR"); break; case EXFULL: perror("EXFULL"); break; case ENOANO: perror("ENOANO"); break; case EBADRQC: perror("EBADRQC"); break; case EBADSLT: perror("EBADSLT"); break; case EBFONT: perror("EBFONT"); break; case ENOSTR: perror("ENOSTR"); break; case ENODATA: perror("ENODATA"); break; case ETIME: perror("ETIME"); break; case ENOSR: perror("ENOSR"); break; case ENONET: perror("ENONET"); break; case ENOPKG: perror("ENOPKG"); break; case EREMOTE: perror("EREMOTE"); break; case ENOLINK: perror("ENOLINK"); break; case EADV: perror("EADV"); break; case ESRMNT: perror("ESRMNT"); break; case ECOMM: perror("ECOMM"); break; case EPROTO: perror("EPROTO"); break; case EMULTIHOP: perror("EMULTIHOP"); break; case EDOTDOT: perror("EDOTDOT"); break; case EBADMSG: perror("EBADMSG"); break; case EOVERFLOW: perror("EOVERFLOW"); break; case ENOTUNIQ: perror("ENOTUNIQ"); break; case EBADFD: perror("EBADFD"); break; case EREMCHG: perror("EREMCHG"); break; case ELIBACC: perror("ELIBACC"); break; case ELIBBAD: perror("ELIBBAD"); break; case ELIBSCN: perror("ELIBSCN"); break; case ELIBMAX: perror("ELIBMAX"); break; case ELIBEXEC: perror("ELIBEXEC"); break; case EILSEQ: perror("EILSEQ"); break; case ERESTART: perror("ERESTART"); break; case ESTRPIPE: perror("ESTRPIPE"); break; case EUSERS: perror("EUSERS"); break; case ENOTSOCK: perror("ENOTSOCK"); break; case EDESTADDRREQ: perror("EDESTADDRREQ"); break; case EMSGSIZE: perror("EMSGSIZE"); break; case EPROTOTYPE: perror("EPROTOTYPE"); break; case ENOPROTOOPT: perror("ENOPROTOOPT"); break; case EPROTONOSUPPORT: perror("EPROTONOSUPPORT"); break; case ESOCKTNOSUPPORT: perror("ESOCKTNOSUPPORT"); break; case EOPNOTSUPP: perror("EOPNOTSUPP"); break; case EPFNOSUPPORT: perror("EPFNOSUPPORT"); break; case EAFNOSUPPORT: perror("EAFNOSUPPORT"); break; case EADDRINUSE: perror("EADDRINUSE"); break; case EADDRNOTAVAIL: perro

Gotchas and common issues

  • Permission checks - verify user access rights and sudo privileges before executing system-level operations.

  • Environment configuration - double-check path variables and dependency versions to prevent runtime failures.

  • Backup safeguards - maintain configuration backups before applying system or database modifications.

Following these steps ensures clean configuration and reliable execution for error handling in c programs using errno, perror and strerror.