---
name: "sys_nerr"
section: "3"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd"]
url: "https://new.carta.tech/perror/3"
---

# sys\_nerr(3)

print a system error message

Part of [perror(3)](/perror/3.md).

## NAME

perror - print a system error message

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <stdio.h>
```

**void perror(const char \****s***);**

**#include \<errno.h\>**

**int** *errno***;  /\* Not really declared this way; see [errno(3)](/errno/3.md) \*/**

**\[\[deprecated\]\] const char \*const** *sys\_errlist***\[\];** **\[\[deprecated\]\] int** *sys\_nerr***;**

Feature Test Macro Requirements for glibc (see [**feature\_test\_macros**(7)](/feature_test_macros/7.md)):

*sys\_errlist*, *sys\_nerr*:

```
    From glibc 2.19 to glibc 2.31:
        _DEFAULT_SOURCE
    glibc 2.19 and earlier:
        _BSD_SOURCE
```

## DESCRIPTION

The **perror**() function produces a message on standard error describing the last error encountered during a call to a system or library function.

First (if *s* is not NULL and *\*s* is not a null byte ('\\0')), the argument string *s* is printed, followed by a colon and a blank. Then an error message corresponding to the current value of *errno* and a new-line.

To be of most use, the argument string should include the name of the function that incurred the error.

The global error list *sys\_errlist*\[\], which can be indexed by *errno*, can be used to obtain the error message without the newline. The largest message number provided in the table is *sys\_nerr*-1. Be careful when directly accessing this list, because new error values may not have been added to *sys\_errlist*\[\]. The use of *sys\_errlist*\[\] is nowadays deprecated; use [**strerror**(3)](/strerror/3.md) instead.

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 *\<errno.h\>*.) Many library functions do likewise. The function **perror**() serves to translate this error code into human-readable form. Note that *errno* is undefined after a successful system call or library function call: this call may well change this variable, even though it succeeds, for example because it internally used some other library function that failed. Thus, if a failing call is not immediately followed by a call to **perror**(), the value of *errno* should be saved.

## ATTRIBUTES

For an explanation of the terms used in this section, see [**attributes**(7)](/attributes/7.md).

| | | |
| --- | --- | --- |
| **Interface** | **Attribute** | **Value** |
| **perror**() | Thread safety | MT-Safe race:stderr |

## STANDARDS

- *errno* **perror**()

  C11, POSIX.1-2008.

- *sys\_nerr* *sys\_errlist*

  BSD.

## HISTORY

- *errno* **perror**()

  POSIX.1-2001, C89, 4.3BSD.

- *sys\_nerr* *sys\_errlist*

  Removed in glibc 2.32.

## SEE ALSO

[**err**(3)](/err/3.md), [**errno**(3)](/errno/3.md), [**error**(3)](/error/3.md), [**strerror**(3)](/strerror/3.md)
