.\" Copyright (C) 2004 Michael Kerrisk
.\"
.\" %%%LICENSE_START(VERBATIM)
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one.
.\"
.\" Since the Linux kernel and libraries are constantly changing, this
.\" manual page may be incorrect or out-of-date.  The author(s) assume no
.\" responsibility for errors or omissions, or for damages resulting from
.\" the use of the information contained herein.  The author(s) may not
.\" have taken the same level of care in the production of this manual,
.\" which is licensed free of charge, as they might when working
.\" professionally.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\" %%%LICENSE_END
.\"
.TH POSIX_OPENPT 3 2021-03-22 "" "Linux Programmer's Manual"
.SH NAME
posix_openpt \- open a pseudoterminal device
.SH SYNOPSIS
.nf
.B #include <stdlib.h>
.B #include <fcntl.h>
.PP
.BI "int posix_openpt(int " flags ");"
.fi
.PP
.RS -4
Feature Test Macro Requirements for glibc (see
.BR feature_test_macros (7)):
.RE
.PP
.BR posix_openpt ():
.nf
    _XOPEN_SOURCE >= 600
.fi
.SH DESCRIPTION
The
.BR posix_openpt ()
function opens an unused pseudoterminal master device, returning a
file descriptor that can be used to refer to that device.
.PP
The
.I flags
argument is a bit mask that ORs together zero or more of
the following flags:
.TP
.B O_RDWR
Open the device for both reading and writing.
It is usual to specify this flag.
.TP
.B O_NOCTTY
Do not make this device the controlling terminal for the process.
.SH RETURN VALUE
On success,
.BR posix_openpt ()
returns a file descriptor (a nonnegative integer) which is the lowest
numbered unused file descriptor.
On failure, \-1 is returned, and
.I errno
is set to indicate the error.
.SH ERRORS
See
.BR open (2).
.SH VERSIONS
Glibc support for
.BR posix_openpt ()
has been provided since version 2.2.1.
.SH ATTRIBUTES
For an explanation of the terms used in this section, see
.BR attributes (7).
.ad l
.nh
.TS
allbox;
lbx lb lb
l l l.
Interface	Attribute	Value
T{
.BR posix_openpt ()
T}	Thread safety	MT-Safe
.TE
.hy
.ad
.sp 1
.SH CONFORMING TO
POSIX.1-2001, POSIX.1-2008.
.PP
.BR posix_openpt ()
is part of the UNIX 98 pseudoterminal support (see
.BR pts (4)).
.SH NOTES
Some older UNIX implementations that support System V
(aka UNIX 98) pseudoterminals don't have this function, but it
can be easily implemented by opening the pseudoterminal multiplexor device:
.PP
.in +4n
.EX
int
posix_openpt(int flags)
{
    return open("/dev/ptmx", flags);
}
.EE
.in
.PP
Calling
.BR posix_openpt ()
creates a pathname for the corresponding pseudoterminal slave device.
The pathname of the slave device can be obtained using
.BR ptsname (3).
The slave device pathname exists only as long as the master device is open.
.SH SEE ALSO
.BR open (2),
.BR getpt (3),
.BR grantpt (3),
.BR ptsname (3),
.BR unlockpt (3),
.BR pts (4),
.BR pty (7)
