Errno.h

Last updated

errno.h is a header file in the standard library of the C programming language. It defines macros for reporting and retrieving error conditions using the symbol errno (short for "error number"). [1]

Contents

errno acts like an integer variable. A value (the error number) is stored in errno by certain library functions when they detect errors. At program startup, the value stored is zero. Library functions store only values greater than zero. Any library function can alter the value stored before return, whether or not they detect errors. [2] Most functions indicate that they detected an error by returning a special value, typically NULL for functions that return pointers, and -1 for functions that return integers. A few functions require the caller to preset errno to zero and test it afterwards to see if an error was detected.

The errno macro expands to an lvalue with type int, sometimes with the extern and/or volatile type specifiers depending upon the platform. [3] Originally this was a static memory location, but macros are almost always used today to allow for multi-threading, so that each thread will see its own thread-local error number.

The header file also defines macros that expand to integer constants that represent the error codes. The C standard library only requires three to be defined: [2]

EDOM

Results from a parameter outside a function's domain, e.g. sqrt(-1)

ERANGE

Results from a result outside a function's range, e.g. strtol("0xfffffffff",NULL,0) on systems with a 32-bit wide long

EILSEQ(Required since 1994 Amendment 1 to C89 standard) [4]

Results from an illegal byte sequence, e.g. mbstowcs(buf,"\xff",1) on systems that use UTF-8.

POSIX compliant operating systems like AIX, Linux or Solaris include many other error values, many of which are used much more often than the above ones, such as EACCES for when a file cannot be opened for reading. [5] C++11 additionally defines many of the same values found within the POSIX specification. [6]

Traditionally, the first page of Unix system manuals, named intro(2), lists all errno.h macros, but this is not the case with Linux, where these macros are instead listed in the errno(3). [7]

An errno can be translated to a descriptive string using strerror (defined in string.h) or a BSD extension called sys_errlist. The translation can be printed directly to the standard error stream using perror (defined in stdio.h). As strerror in many Unix-like systems is not thread-safe, a thread-safe version strerror_r is used, but conflicting definitions from POSIX and GNU makes it even less portable than the sys_errlist table. [8]

GLIBC macros

The GNU C library (GLIBC) provides the additional POSIX error values macros in the header file errno.h. [9] These are the descriptions of the macros provided by strerror, excluding 41 and 58 as they are not in the POSIX standard:

EPERM (1)

Operation not permitted

ENOENT (2)

No such file or directory

ESRCH (3)

No such process

EINTR (4)

Interrupted system call

EIO (5)

Input/output error

ENXIO (6)

No such device or address

E2BIG (7)

Argument list too long

ENOEXEC (8)

Exec format error

EBADF (9)

Bad file descriptor

ECHILD (10)

No child processes

EAGAIN (11)

Resource temporarily unavailable

ENOMEM (12)

Cannot allocate memory

EACCES (13)

Permission denied

EFAULT (14)

Bad address

ENOTBLK (15)

Block device required

EBUSY (16)

Device or resource busy

EEXIST (17)

File exists

EXDEV (18)

Invalid cross-device link

ENODEV (19)

No such device

ENOTDIR (20)

Not a directory

EISDIR (21)

Is a directory

EINVAL (22)

Invalid argument

ENFILE (23)

Too many open files in system

EMFILE (24)

Too many open files

ENOTTY (25)

Inappropriate ioctl for device

ETXTBSY (26)

Text file busy

EFBIG (27)

File too large

ENOSPC (28)

No space left on device

ESPIPE (29)

Illegal seek

EROFS (30)

Read-only file system

EMLINK (31)

Too many links

EPIPE (32)

Broken pipe

EDOM (33)

Numerical argument out of domain

ERANGE (34)

Numerical result out of range

EDEADLK (35)

Resource deadlock avoided

ENAMETOOLONG (36)

File name too long

ENOLCK (37)

No locks available

ENOSYS (38)

Function not implemented

ENOTEMPTY (39)

Directory not empty

ELOOP (40)

Too many levels of symbolic links

ENOMSG (42)

No message of desired type

EIDRM (43)

Identifier removed

ECHRNG (44)

Channel number out of range

EL2NSYNC (45)

Level 2 not synchronized

EL3HLT (46)

Level 3 halted

EL3RST (47)

Level 3 reset

ELNRNG (48)

Link number out of range

EUNATCH (49)

Protocol driver not attached

ENOCSI (50)

No CSI structure available

EL2HLT (51)

Level 2 halted

EBADE (52)

Invalid exchange

EBADR (53)

Invalid request descriptor

EXFULL (54)

Exchange full

ENOANO (55)

No anode

EBADRQC (56)

Invalid request code

EBADSLT (57)

Invalid slot

EBFONT (59)

Bad font file format

ENOSTR (60)

Device not a stream

ENODATA (61)

No data available

ETIME (62)

Timer expired

ENOSR (63)

Out of streams resources

ENONET (64)

Machine is not on the network

ENOPKG (65)

Package not installed

EREMOTE (66)

Object is remote

ENOLINK (67)

Link has been severed

EADV (68)

Advertise error

ESRMNT (69)

Srmount error

ECOMM (70)

Communication error on send

EPROTO (71)

Protocol error

EMULTIHOP (72)

Multihop attempted

EDOTDOT (73)

RFS specific error

EBADMSG (74)

Bad message

EOVERFLOW (75)

Value too large for defined data type

ENOTUNIQ (76)

Name not unique on network

EBADFD (77)

File descriptor in bad state

EREMCHG (78)

Remote address changed

ELIBACC (79)

Can not access a needed shared library

ELIBBAD (80)

Accessing a corrupted shared library

ELIBSCN (81)

.lib section in a.out corrupted

ELIBMAX (82)

Attempting to link in too many shared libraries

ELIBEXEC (83)

Cannot exec a shared library directly

EILSEQ (84)

Invalid or incomplete multibyte or wide character

ERESTART (85)

Interrupted system call should be restarted

ESTRPIPE (86)

Streams pipe error

EUSERS (87)

Too many users

ENOTSOCK (88)

Socket operation on non-socket

EDESTADDRREQ (89)

Destination address required

EMSGSIZE (90)

Message too long

EPROTOTYPE (91)

Protocol wrong type for socket

ENOPROTOOPT (92)

Protocol not available

EPROTONOSUPPORT (93)

Protocol not supported

ESOCKTNOSUPPORT (94)

Socket type not supported

EOPNOTSUPP (95)

Operation not supported

EPFNOSUPPORT (96)

Protocol family not supported

EAFNOSUPPORT (97)

Address family not supported by protocol

EADDRINUSE (98)

Address already in use

EADDRNOTAVAIL (99)

Cannot assign requested address

ENETDOWN (100)

Network is down

ENETUNREACH (101)

Network is unreachable

ENETRESET (102)

Network dropped connection on reset

ECONNABORTED (103)

Software caused connection abort

ECONNRESET (104)

Connection reset by peer

ENOBUFS (105)

No buffer space available

EISCONN (106)

Transport endpoint is already connected

ENOTCONN (107)

Transport endpoint is not connected

ESHUTDOWN (108)

Cannot send after transport endpoint shutdown

ETOOMANYREFS (109)

Too many references: cannot splice

ETIMEDOUT (110)

Connection timed out

ECONNREFUSED (111)

Connection refused

EHOSTDOWN (112)

Host is down

EHOSTUNREACH (113)

No route to host

EALREADY (114)

Operation already in progress

EINPROGRESS (115)

Operation now in progress

ESTALE (116)

Stale file handle

EUCLEAN (117)

Structure needs cleaning

ENOTNAM (118)

Not a XENIX named type file

ENAVAIL (119)

No XENIX semaphores available

EISNAM (120)

Is a named type file

EREMOTEIO (121)

Remote I/O error

EDQUOT (122)

Disk quota exceeded

ENOMEDIUM (123)

No medium found

EMEDIUMTYPE (124)

Wrong medium type

ECANCELED (125)

Operation canceled

ENOKEY (126)

Required key not available

EKEYEXPIRED (127)

Key has expired

EKEYREVOKED (128)

Key has been revoked

EKEYREJECTED (129)

Key was rejected by service

EOWNERDEAD (130)

Owner died

ENOTRECOVERABLE (131)

State not recoverable

ERFKILL (132)

Operation not possible due to RF-kill

EHWPOISON (133)

Memory page has hardware error

See also

Related Research Articles

C is a general-purpose computer programming language. It was created in the 1970s by Dennis Ritchie, and remains very widely used and influential. By design, C's features cleanly reflect the capabilities of the targeted CPUs. It has found lasting use in operating systems, device drivers, and protocol stacks, but its use in application software has been decreasing. C is commonly used on computer architectures that range from the largest supercomputers to the smallest microcontrollers and embedded systems.

The Portable Operating System Interface is a family of standards specified by the IEEE Computer Society for maintaining compatibility between operating systems. POSIX defines both the system and user-level application programming interfaces (APIs), along with command line shells and utility interfaces, for software compatibility (portability) with variants of Unix and other operating systems. POSIX is also a trademark of the IEEE. POSIX is intended to be used by both application and system developers.

Berkeley sockets is an application programming interface (API) for Internet sockets and Unix domain sockets, used for inter-process communication (IPC). It is commonly implemented as a library of linkable modules. It originated with the 4.2BSD Unix operating system, which was released in 1983.

In computing, particularly in the context of the Unix operating system and its workalikes, fork is an operation whereby a process creates a copy of itself. It is an interface which is required for compliance with the POSIX and Single UNIX Specification standards. It is usually implemented as a C standard library wrapper to the fork, clone, or other system calls of the kernel. Fork is the primary method of process creation on Unix-like operating systems.

The C standard library or libc is the standard library for the C programming language, as specified in the ISO C standard. Starting from the original ANSI C standard, it was developed at the same time as the C library POSIX specification, which is a superset of it. Since ANSI C was adopted by the International Organization for Standardization, the C standard library is also called the ISO C library.

The printf family of functions in the C programming language are a set of functions that take a format string as input among a variable sized list of other values and produce as output a string that corresponds to the format specifier and given input values. The string is written in a simple template language: characters are usually copied literally into the function's output, but format specifiers, which start with a % character, indicate the location and method to translate a piece of data to characters. The design has been copied to expose similar functionality in other programming languages.

<span class="mw-page-title-main">Not a typewriter</span> Unix error code

In computing, "Not a typewriter" or ENOTTY is an error code defined in the errno.h found on many Unix systems. This code is now used to indicate that an invalid ioctl number was specified in an ioctl system call.

In Unix and Unix-like computer operating systems, a file descriptor is a process-unique identifier (handle) for a file or other input/output resource, such as a pipe or network socket.

stat (system call) Unix system call

stat is a Unix system call that returns file attributes about an inode. The semantics of stat vary between operating systems. As an example, Unix command ls uses this system call to retrieve information on files that includes:

Signals are standardized messages sent to a running program to trigger specific behavior, such as quitting or error handling. They are a limited form of inter-process communication (IPC), typically used in Unix, Unix-like, and other POSIX-compliant operating systems.

<span class="mw-page-title-main">Unix time</span> Date and time representation system widely used in computing

Unix time is a date and time representation widely used in computing. It measures time by the number of seconds that have elapsed since 00:00:00 UTC on 1 January 1970, the Unix epoch, without adjustments made due to leap seconds. In modern computing, values are sometimes stored with higher granularity, such as microseconds or nanoseconds.

In computing, the exit status, or exit code, of a terminated process is an integer number that is made available to its parent process. In DOS, this may be referred to as an errorlevel.

The seven standard Unix file types are regular, directory, symbolic link, FIFO special, block special, character special, and socket as defined by POSIX. Different OS-specific implementations allow more types than what POSIX requires. A file's type can be identified by the ls -l command, which displays the type in the first character of the file-system permissions field.

In computer programming, thread-local storage (TLS) is a memory management method that uses static or global memory local to a thread.

<span class="mw-page-title-main">Linux kernel interfaces</span> An overview and comparison of the Linux kernal APIs and ABIs.

The Linux kernel provides several interfaces to user-space applications that are used for different purposes and that have different properties by design. There are two types of application programming interface (API) in the Linux kernel that are not to be confused: the "kernel–user space" API and the "kernel internal" API.

In computing, exec is a functionality of an operating system that runs an executable file in the context of an already existing process, replacing the previous executable. This act is also referred to as an overlay. It is especially important in Unix-like systems, although it exists elsewhere. As no new process is created, the process identifier (PID) does not change, but the machine code, data, heap, and stack of the process are replaced by those of the new program.

A network socket is a software structure within a network node of a computer network that serves as an endpoint for sending and receiving data across the network. The structure and properties of a socket are defined by an application programming interface (API) for the networking architecture. Sockets are created only during the lifetime of a process of an application running in the node.

select is a system call and application programming interface (API) in Unix-like and POSIX-compliant operating systems for examining the status of file descriptors of open input/output channels. The select system call is similar to the poll facility introduced in UNIX System V and later operating systems. However, with the c10k problem, both select and poll have been superseded by the likes of kqueue, epoll, /dev/poll and I/O completion ports.

In computing, an error code is a numeric or alphanumeric code that indicates the nature of an error and, when possible, why it occurred. Error codes can be reported to end users of software, returned from communication protocols, or used within programs as a method of representing anomalous conditions.

<span class="mw-page-title-main">Shared memory</span> Computer memory that can be accessed by multiple processes

In computer science, shared memory is memory that may be simultaneously accessed by multiple programs with an intent to provide communication among them or avoid redundant copies. Shared memory is an efficient means of passing data between programs. Depending on context, programs may run on a single processor or on multiple separate processors.

References

  1. International Standard for Programming Language C (C11), ISO/IEC 9899:2011, p. 205
  2. 1 2 International Standard for Programming Language C (C99), ISO/IEC 9899:1999, p. 186
  3. "Checking for Errors". The GNU C Library (glibc). GNU Project. 2014-02-08. Retrieved 2014-06-25.
  4. "A brief description of Normative Addendum 1" . Retrieved 2013-09-12.
  5. errno.h : system error numbers  Base Definitions Reference, The Single UNIX Specification , Version 4 from The Open Group
  6. "Error numbers - cppreference.com" . Retrieved 2015-05-08.
  7. Stevens & Rago 2013, p. 14.
  8. McCabe, Colin. "The problem with strerror". www.club.cc.cmu.edu.
  9. "Error Codes (The GNU C Library)". www.gnu.org. Retrieved 2023-10-21.

Bibliography