ptg10805159724 Pseudo Terminals Chapter 19
On FreeBSD,grantptandunlockptdo nothing other than argument validation; the PTYs
arecreated dynamically with the correct permissions. Note that FreeBSD defines the
O_NOCTTYflag only for compatibility with applications that callposix_openpt.FreeBSD
does not allocate a controlling terminal as a side effect of opening a terminal device, so the
O_NOCTTYflag has no effect.FreeBSD Linux Mac OS X Solaris
Function Description XSI 8.0 3.2.0 10.6.8 10grantpt change permissions of slave PTY device •••• •
posix_openpt open a master PTY device •••• •
ptsname return name of slave PTY device •••• •
unlockpt allow slave PTY device to be opened •••• •Figure 19.8 XSI pseudo terminal functionsThe Single UNIX Specification has improved portability in this area, but differences
remain. Weprovide two functions that handle all the details:ptym_opento open the
next available PTY master device andptys_opento open the corresponding slave
device.
#include "apue.h"
int ptym_open(char *pts_name,intpts_namesz);
Returns: file descriptor of PTY master if OK,−1 on error
int ptys_open(char *pts_name);
Returns: file descriptor of PTY slave if OK,−1 on error
Normally, we don’t call these two functions directly; instead, the functionpty_fork
(Section 19.4) calls them and alsoforksachild process.
Theptym_openfunction opens the next available PTY master.The caller must
allocate an array to hold the name of the slave; if the call succeeds, the name of the
corresponding slave is returned through pts_name.This name is then passed to
ptys_open,which opens the slave device. The length of the buffer in bytes is passed
inpts_nameszso that theptym_openfunction doesn’t copy a string that is longer than
the buffer.
The reason for providing two functions to open the two devices will become
obvious when we show thepty_forkfunction. Normally,aprocess callsptym_open
to open the master and obtain the name of the slave. The process thenforks, and the
child callsptys_opento open the slave after callingsetsidto establish a new session.
This is how the slave becomes the controlling terminal for the child.
#include "apue.h"
#include <errno.h>
#include <fcntl.h>
#if defined(SOLARIS)
#include <stropts.h>
#endif