ERRNO(3)

NAME
errno - number of last error

SYNOPSIS
#include <errno.h>

DESCRIPTION
The <errno.h> header file defines the integer variable errno , which is set by system calls and some library functions in the event of an error to indicate what went wrong. Its value is significant only when the call returned an error (usually -1), and a function that does succeed is allowed to change errno. Sometimes, when -1 is also a valid successful return value one has to zero errno before the call in order to detect possible errors. errno is defined by the ISO C standard to be a modifiable lvalue of type int, and must not be explicitly declared; errno may be a macro. errno is thread-local; setting it in one thread does not affect its value in any other thread. Valid error numbers are all non-zero; errno is never set to zero by any library function. All the error names specified by POSIX.1 must have distinct values, with the exception of EAGAIN and EWOULDBLOCK, which may be the same. POSIX.1 (2001 edition) lists the following symbolic error names. Of these, EDOM and ERANGE are in the ISO C standard. ISO C Amendment 1 defines the additional error number EILSEQ for coding errors in multibyte or wide characters.

E2BIG
    Arg list too long

EACCES
    Permission denied

EADDRINUSE
    Address in use

EADDRNOTAVAIL
    Address not available

EAFNOSUPPORT
    Address family not supported

EAGAIN
    Resource temporarily unavailable

EALREADY
    Connection already in progress

EBADF
    Bad file descriptor

EBADMSG
    Bad message

EBUSY
    Resource busy

ECANCELED
    Operation canceled

ECHILD
    No child processes

ECONNABORTED
    Connection aborted

ECONNREFUSED
    Connection refused

ECONNRESET
    Connection reset

EDEADLK
    Resource deadlock avoided

EDESTADDRREQ
    Destination address required

EDOM
    Domain error

EDQUOT
    Reserved

EEXIST
    File exists

EFAULT
    Bad address

EFBIG
    File too large

EHOSTUNREACH
    Host is unreachable

EIDRM
    Identifier removed

EILSEQ
    Illegal byte sequence

EINPROGRESS
    Operation in progress

EINTR
    Interrupted function call

EINVAL
    Invalid argument

EIO Input/output error

EISCONN
    Socket is connected

EISDIR
    Is a directory

ELOOP
    Too many levels of symbolic links

EMFILE
    Too many open files

EMLINK
    Too many links

EMSGSIZE
    Inappropriate message buffer length

EMULTIHOP
    Reserved

ENAMETOOLONG
    Filename too long

ENETDOWN
    Network is down

ENETRESET
    Connection aborted by network

ENETUNREACH
    Network unreachable

ENFILE
    Too many open files in system

ENOBUFS
    No buffer space available

ENODATA
    No message is available on the STREAM head read queue

ENODEV
    No such device

ENOENT
    No such file or directory

ENOEXEC
    Exec format error

ENOLCK
    No locks available

ENOLINK
    Reserved

ENOMEM
    Not enough space

ENOMSG
    No message of the desired type

ENOPROTOOPT
    Protocol not available

ENOSPC
    No space left on device

ENOSR
    No STREAM resources

ENOSTR
    Not a STREAM

ENOSYS
    Function not implemented

ENOTCONN
    The socket is not connected

ENOTDIR
    Not a directory

ENOTEMPTY
    Directory not empty

ENOTSOCK
    Not a socket

ENOTSUP
    Not supported

ENOTTY
    Inappropriate I/O control operation

ENXIO
    No such device or address

EOPNOTSUPP
    Operation not supported on socket

EOVERFLOW
    Value too large to be stored in data type

EPERM
    Operation not permitted

EPIPE
    Broken pipe

EPROTO
    Protocol error

EPROTONOSUPPORT
    Protocol not supported

EPROTOTYPE
    Protocol wrong type for socket

ERANGE
    Result too large

EROFS
    Read-only file system

ESPIPE
    Invalid seek

ESRCH
    No such process

ESTALE
    Reserved

ETIME
    STREAM ioctl() timeout

ETIMEDOUT
    Operation timed out

ETXTBSY
    Text file busy

EWOULDBLOCK
    Operation would block (may be same value as EAGAIN)

EXDEV
    Improper link

NOTES
A common mistake is to do
    if (somecall() == -1) {
        printf("somecall() failed\n");
        if (errno == ...) { ... }
    }
where errno no longer needs to have the value it had upon return from somecall() (i.e., it may have been changed by the printf()). If the value of errno should be preserved across a library call, it must be saved:
    if (somecall() == -1) {
        int errsv = errno;
        printf("somecall() failed\n");
        if (errsv == ...) { ... }
    }

It was common in traditional C to declare errno manually (i.e., extern int errno) instead of including <errno.h>. Do not do this. It will not work with modern versions of the C library. However, on (very) old Unix systems, there may be no <errno.h> and the declaration is needed.

SEE ALSO
perror(3), strerror(3)