---
name: "ttyname_r"
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/ttyname"
---

# ttyname\_r(3)

return name of a terminal

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

## NAME

ttyname, ttyname\_r - return name of a terminal

## LIBRARY

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

## SYNOPSIS

```
#include <unistd.h>
```

**char \*ttyname(int** *fd***);** **int ttyname\_r(**size\_t size;               **int** *fd***, char** *buf***\[***size***\], size\_t** *size***);**

## DESCRIPTION

The function **ttyname**() returns a pointer to the null-terminated pathname of the terminal device that is open on the file descriptor *fd*, or NULL on error (for example, if *fd* is not connected to a terminal). The return value may point to static data, possibly overwritten by the next call. The function **ttyname\_r**() stores this pathname in the buffer *buf* of size *size*.

## RETURN VALUE

The function **ttyname**() returns a pointer to a pathname on success. On error, NULL is returned, and *errno* is set to indicate the error. The function **ttyname\_r**() returns 0 on success, and an error number upon error.

## ERRORS

- **EBADF**

  Bad file descriptor.

- **ENODEV**

  *fd* refers to a slave pseudoterminal device but the corresponding pathname could not be found (see NOTES).

- **ENOTTY**

  *fd* does not refer to a terminal device.

- **ERANGE**

  (**ttyname\_r**()) *size* was too small to allow storing the pathname.

## ATTRIBUTES

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

| | | |
| --- | --- | --- |
| **Interface** | **Attribute** | **Value** |
| **ttyname**() | Thread safety | MT-Unsafe race:ttyname |
| **ttyname\_r**() | Thread safety | MT-Safe |

## STANDARDS

POSIX.1-2008.

## HISTORY

POSIX.1-2001, 4.2BSD.

## NOTES

A process that keeps a file descriptor that refers to a [**pts**(4)](/pts/4.md) device open when switching to another mount namespace that uses a different */dev/ptmx* instance may still accidentally find that a device path of the same name for that file descriptor exists. However, this device path refers to a different device and thus can't be used to access the device that the file descriptor refers to. Calling **ttyname**() or **ttyname\_r**() on the file descriptor in the new mount namespace will cause these functions to return NULL and set *errno* to **ENODEV**.

## SEE ALSO

[**tty**(1)](/tty/1.md), [**fstat**(2)](/fstat/2.md), [**ctermid**(3)](/ctermid/3.md), [**isatty**(3)](/isatty/3.md), [**pts**(4)](/pts/4.md)
