Print this page
14249 pseudo-terminal nomenclature should reflect POSIX
Change-Id: Ib4a3cef899ff4c71b09cb0dc6878863c5e8357bc

Split Close
Expand all
Collapse all
          --- old/usr/src/man/man7d/pts.7d.man.txt
          +++ new/usr/src/man/man7d/pts.7d.man.txt
   1      -PTS(7D)                             Devices                            PTS(7D)
        1 +PTM(7D)                             Devices                            PTM(7D)
   2    2  
   3    3  NAME
   4      -       pts - STREAMS pseudo-tty slave driver
        4 +     ptm, pts - STREAMS pseudo-terminal manager and subsidiary drivers
   5    5  
        6 +SYNOPSIS
        7 +     /dev/ptmx
        8 +
        9 +     /dev/pts/*
       10 +
   6   11  DESCRIPTION
   7      -       The pseudo-tty subsystem simulates a terminal connection, where the
   8      -       master side represents the terminal and the slave represents the user
   9      -       process's special device end point. In order to use the pseudo-tty
  10      -       subsystem, a node for the master side driver /dev/ptmx and N nodes for
  11      -       the slave driver (N is determined at installation time) must be
  12      -       installed. The names of the slave devices are /dev/pts/M where M has
  13      -       the values 0 through N-1. When the master device is opened, the
  14      -       corresponding slave device is automatically locked out. No user may
  15      -       open that slave device until its permissions are adjusted and the
  16      -       device unlocked by calling functions grantpt(3C) and unlockpt(3C). The
  17      -       user can then invoke the open system call with the name that is
  18      -       returned by the ptsname(3C) function. See the example below.
       12 +     The pseudo-terminal subsystem simulates a terminal connection, where the
       13 +     manager side represents the terminal and the subsidiary represents the
       14 +     user process's special device end point.  The manager device is set up as
       15 +     a cloned device where its major device number is the major for the clone
       16 +     device and its minor device number is the major for the ptm driver; see
       17 +     CLONE_DEV in ddi_create_minor_node(9F).
  19   18  
       19 +     There are no nodes in the file system for manager devices.  The manager
       20 +     pseudo driver is opened using the open(2) system call with /dev/ptmx as
       21 +     the device parameter.  The clone open finds the next available minor
       22 +     device for the ptm major device.
  20   23  
  21      -       Only one open is allowed on a master device. Multiple opens are allowed
  22      -       on the slave device. After both the master and slave have been opened,
  23      -       the user has two file descriptors which are end points of a full duplex
  24      -       connection composed of two streams automatically connected at the
  25      -       master and slave drivers. The user may then push modules onto either
  26      -       side of the stream pair. Unless compiled in XPG4v2 mode (see below),
  27      -       the consumer needs to push the ptem(7M) and ldterm(7M) modules onto the
  28      -       slave side of the pseudo-terminal subsystem to get terminal semantics.
       24 +     A manager device is only available if it and its corresponding subsidiary
       25 +     device are not already open.  Only one open is allowed on a manager
       26 +     device.  Multiple opens are allowed on the subsidiary device.
  29   27  
       28 +     When the manager device is opened, the corresponding subsidiary device is
       29 +     automatically locked out.  No user may open the subsidiary device until
       30 +     its permissions are adjusted and the device is unlocked by calling the
       31 +     functions grantpt(3C) and unlockpt(3C).  The user can then invoke the
       32 +     open(2) system call with the device name returned by the ptsname(3C)
       33 +     function.
  30   34  
  31      -       The master and slave drivers pass all messages to their adjacent
  32      -       queues. Only the M_FLUSH needs some processing. Because the read queue
  33      -       of one side is connected to the write queue of the other, the FLUSHR
  34      -       flag is changed to the FLUSHW flag and vice versa. When the master
  35      -       device is closed an M_HANGUP message is sent to the slave device which
  36      -       will render the device unusable. The process on the slave side gets the
  37      -       errno EIO when attempting to write on that stream but it will be able
  38      -       to read any data remaining on the stream head read queue. When all the
  39      -       data has been read, read returns 0 indicating that the stream can no
  40      -       longer be used. On the last close of the slave device, a 0-length
  41      -       message is sent to the master device. When the application on the
  42      -       master side issues a read() or getmsg() and 0 is returned, the user of
  43      -       the master device decides whether to issue a close() that dismantles
  44      -       the pseudo-terminal subsystem. If the master device is not closed, the
  45      -       pseudo-tty subsystem will be available to another user to open the
  46      -       slave device. Since 0-length messages are used to indicate that the
  47      -       process on the slave side has closed and should be interpreted that way
  48      -       by the process on the master side, applications on the slave side
  49      -       should not write 0-length messages. Unless the application is compiled
  50      -       in XPG4v2 mode (see below) then any 0-length messages written on the
  51      -       slave side will be discarded by the ptem module.
       35 +     After both the manager and subsidiary have been opened, the user has two
       36 +     file descriptors which are the end points of a full duplex connection
       37 +     composed of two streams which are automatically connected at the manager
       38 +     and subsidiary drivers.  The user may then push modules onto either side
       39 +     of the stream pair.  Unless compiled in XPG4v2 mode (see XPG4v2 MODE),
       40 +     the consumer needs to push the ptem(7M) and ldterm(7M) modules onto the
       41 +     subsidiary device to get terminal semantics.
  52   42  
       43 +     The manager and subsidiary drivers pass all messages to their adjacent
       44 +     queues.  Only the M_FLUSH needs some processing.  Because the read queue
       45 +     of one side is connected to the write queue of the other, the FLUSHR flag
       46 +     is changed to the FLUSHW flag and vice versa.
  53   47  
  54      -       The standard STREAMS system calls can access the pseudo-tty devices.
  55      -       The slave devices support the O_NDELAY and O_NONBLOCK flags.
       48 +     When the manager device is closed, an M_HANGUP message is sent to the
       49 +     subsidiary device which will render the device unusable.  The process on
       50 +     the subsidiary side gets an EIO error when attempting to write on that
       51 +     stream, but it will be able to read any data remaining on the stream head
       52 +     read queue.  When all the data has been read, read(2) returns 0
       53 +     indicating that the stream can no longer be used.
  56   54  
       55 +     On the last close of the subsidiary device, a 0-length message is sent to
       56 +     the manager device.  When the application on the manager side issues a
       57 +     read(2) or getmsg(2) and 0 is returned, the user of the manager device
       58 +     decides whether to issue a close(2) that dismantles the entire pseudo-
       59 +     terminal.  If the manager device is not closed, the pseudo-terminal will
       60 +     be available to another user to open the subsidiary device.
       61 +
       62 +     Since 0-length messages are used to indicate that the process on the
       63 +     subsidiary side has closed, and should be interpreted that way by the
       64 +     process on the manager side, applications on the subsidiary side should
       65 +     not write 0-length messages.  Unless the application is compiled in
       66 +     XPG4v2 mode (see XPG4v2 MODE), then any 0-length messages written to the
       67 +     subsidiary device will be discarded by the ptem(7M) module.
       68 +
       69 +     If O_NONBLOCK or O_NDELAY is set on the manager side:
       70 +
       71 +     o   Read on the manager side returns -1 with errno set to EAGAIN if no
       72 +         data is available
       73 +
       74 +     o   Write returns -1 with errno set to EAGAIN if there is internal flow
       75 +         control
       76 +
       77 +     Standard STREAMS system calls can access pseudo-terminal devices.  The
       78 +     subsidiary devices support the O_NDELAY and O_NONBLOCK flags.
       79 +
  57   80  XPG4v2 MODE
  58      -       XPG4v2 requires that open of a slave pseudo terminal device provides
  59      -       the process with an interface that is identical to the terminal
  60      -       interface (without having to explicitly push any modules to achieve
  61      -       this). It also requires that 0-length messages written on the slave
  62      -       side will be propagated to the master.
       81 +     XPG4v2 requires that subsidiary pseudo-terminal devices provide the
       82 +     process with an interface that is identical to the terminal interface,
       83 +     without needing to explicitly push any modules to achieve this.  It also
       84 +     requires that 0-length messages written on the subsidiary device will be
       85 +     propagated to the manager device.
  63   86  
  64      -       Experience has shown, however, that most software does not expect slave
  65      -       pty devices to operate in this manner and therefore this
  66      -       XPG4v2-compliant behaviour is only enabled in XPG4v2/SUS (see
  67      -       standards(5)) mode.
       87 +     Experience has shown that most software does not expect subsidiary
       88 +     pseudo-terminal devices to operate in this manner.  This XPG4v2-compliant
       89 +     behaviour is only enabled in XPG4v2/SUS (see standards(5)) mode.
  68   90  
  69      -EXAMPLES
  70      -         int    fdm fds;
  71      -         char   *slavename;
  72      -         extern char *ptsname();
       91 +IOCTLS
       92 +     The manager driver provides several ioctls to support the grantpt(3C),
       93 +     unlockpt(3C), and ptsname(3C) functions:
  73   94  
  74      -         fdm = open("/dev/ptmx", O_RDWR);  /* open master */
  75      -         grantpt(fdm);                     /* change permission of   slave */
  76      -         unlockpt(fdm);                    /* unlock slave */
  77      -         slavename = ptsname(fdm);         /* get name of slave */
  78      -         fds = open(slavename, O_RDWR);    /* open slave */
  79      -         ioctl(fds, I_PUSH, "ptem");       /* push ptem */
  80      -         ioctl(fds, I_PUSH, "ldterm");     /* push ldterm*/
       95 +     ISPTM   Determines whether the file descriptor is that of an open manager
       96 +             device.  On success, it returns the value 0.
  81   97  
       98 +     UNLKPT  Unlocks the manager and subsidiary devices.  It returns 0 on
       99 +             success.  On failure, errno is set to EINVAL indicating that the
      100 +             manager device is not open.
  82  101  
  83  102  FILES
  84      -       /dev/ptmx
  85      -                     master clone device
      103 +     /dev/ptmx                         Pseudo-terminal manager clone device.
  86  104  
      105 +     /dev/pts/N                        Pseudo-terminal subsidiary devices,
      106 +                                       where N is a non-negative integer.
      107 +                                       Located via calls to ptsname(3C).
  87  108  
  88      -       /dev/pts/M
  89      -                     slave devices (M = 0 -> N-1)
      109 +EXAMPLES
      110 +     Example 1 Opening the manager and subsidiary device for a pseudo-
      111 +     terminal.
  90  112  
      113 +           #include <stdlib.h>
      114 +           #include <sys/types.h>
      115 +           #include <sys/stat.h>
      116 +           #include <unistd.h>
      117 +           #include <stropts.h>
      118 +           #include <fcntl.h>
      119 +           #include <err.h>
      120 +           ...
      121 +           int fdm, fds;
      122 +           char *subsidiaryname;
      123 +           ...
      124 +           /*
      125 +            * NOTE: Portable applications should use posix_openpt(3C) here:
      126 +            */
      127 +           if ((fdm = open("/dev/ptmx", O_RDWR | O_NOCTTY)) < 0) {
      128 +                   err(1, "open manager");
      129 +           }
      130 +           if (grantpt(fdm) != 0 || unlockpt(fdm) != 0 ||
      131 +               (subsidiaryname = ptsname(fdm)) == NULL) {
      132 +                   close(fdm);
      133 +                   err(1, "locate subsidiary");
      134 +           }
      135 +           if ((fds = open(subsidiaryname, O_RDWR | O_NOCTTY)) < 0) {
      136 +                   close(fdm);
      137 +                   err(1, "open subsidiary");
      138 +           }
      139 +           if (ioctl(fds, I_PUSH, "ptem") != 0 ||
      140 +               ioctl(fds, I_PUSH, "ldterm") != 0) {
      141 +                   close(fds);
      142 +                   close(fdm);
      143 +                   err(1, "push modules");
      144 +           }
  91  145  
  92  146  SEE ALSO
  93      -       grantpt(3C), ptsname(3C), unlockpt(3C), ldterm(7M), ptm(7D), ptem(7M),
  94      -       standards(5)
      147 +     close(2), getmsg(2), open(2), read(2), grantpt(3C), posix_openpt(3C),
      148 +     ptsname(3C), unlockpt(3C), standards(5), ldterm(7M), pckt(7M), ptem(7M),
      149 +     ddi_create_minor_node(9F)
  95  150  
  96      -
  97      -       STREAMS Programming Guide
  98      -
  99      -                               February 29, 2020                       PTS(7D)
      151 +illumos                        February 5, 2022                        illumos
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX