---
name: "forkpty"
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/openpty"
---

# forkpty(3)

terminal utility functions

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

## NAME

openpty, login\_tty, forkpty - terminal utility functions

## LIBRARY

System utilities library (*libutil*, *-lutil*)

## SYNOPSIS

```
#include <pty.h>
```

**int openpty(int \****amaster***, int \****aslave***, char \****name***,**               **const struct termios \****termp***,**               **const struct winsize \****winp***);** **pid\_t forkpty(int \****amaster***, char \****name***,**               **const struct termios \****termp***,**               **const struct winsize \****winp***);**

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

**int login\_tty(int** *fd***);**

## DESCRIPTION

The **openpty**() function finds an available pseudoterminal and returns file descriptors for the master and slave in *amaster* and *aslave*. If *name* is not NULL, the filename of the slave is returned in *name*. If *termp* is not NULL, the terminal parameters of the slave will be set to the values in *termp*. If *winp* is not NULL, the window size of the slave will be set to the values in *winp*.

The **login\_tty**() function prepares for a login on the terminal referred to by the file descriptor *fd* (which may be a real terminal device, or the slave of a pseudoterminal as returned by **openpty**()) by creating a new session, making *fd* the controlling terminal for the calling process, setting *fd* to be the standard input, output, and error streams of the current process, and closing *fd*.

The **forkpty**() function combines **openpty**(), [**fork**(2)](/fork/2.md), and **login\_tty**() to create a new process operating in a pseudoterminal. A file descriptor referring to master side of the pseudoterminal is returned in *amaster*. If *name* is not NULL, the buffer it points to is used to return the filename of the slave. The *termp* and *winp* arguments, if not NULL, will determine the terminal attributes and window size of the slave side of the pseudoterminal.

## RETURN VALUE

If a call to **openpty**(), **login\_tty**(), or **forkpty**() is not successful, -1 is returned and *errno* is set to indicate the error. Otherwise, **openpty**(), **login\_tty**(), and the child process of **forkpty**() return 0, and the parent process of **forkpty**() returns the process ID of the child process.

## ERRORS

**openpty**() fails if:

- **ENOENT**

  There are no available terminals.

**login\_tty**() fails if [**ioctl**(2)](/ioctl/2.md) fails to set *fd* to the controlling terminal of the calling process.

**forkpty**() fails if either **openpty**() or [**fork**(2)](/fork/2.md) fails.

## ATTRIBUTES

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

| | | |
| --- | --- | --- |
| **Interface** | **Attribute** | **Value** |
| **forkpty**(), **openpty**() | Thread safety | MT-Safe locale |
| **login\_tty**() | Thread safety | MT-Unsafe race:ttyname |

## STANDARDS

BSD.

## HISTORY

The **const** modifiers were added to the structure pointer arguments of **openpty**() and **forkpty**() in glibc 2.8.

Before glibc 2.0.92, **openpty**() returns file descriptors for a BSD pseudoterminal pair; since glibc 2.0.92, it first attempts to open a UNIX 98 pseudoterminal pair, and falls back to opening a BSD pseudoterminal pair if that fails.

## BUGS

Nobody knows how much space should be reserved for *name*. So, calling **openpty**() or **forkpty**() with non-NULL *name* may not be secure.

## SEE ALSO

[**fork**(2)](/fork/2.md), [**ttyname**(3)](/ttyname/3.md), [**pty**(7)](/pty/7.md)
