ptg10805159Section 19.6 Using theptyProgram 737
In this example, we assume that theSHELL variable is the Korn shell (probably
/bin/ksh). As we mentioned earlier,scriptcopies only what is output by the new
shell (and any processes that it invokes), but since the line discipline module above the
PTY slave normally has echo enabled, most of what we type is also written to the
typescriptfile.Running Coprocesses
In Figure15.18, the coprocess couldn’t use the standardI/O functions, because standard
input and standardoutput do not refer to a terminal, so the standardI/O functions treat
them as fully buffered. If we run the coprocess underptyby replacing the line
if (execl("./add2", "add2", (char *)0) < 0)
with
if (execl("./pty", "pty", "-e", "add2", (char *)0) < 0)
the program now works, even if the coprocess uses standardI/O.
Figure19.15 shows the arrangement of processes when we run the coprocess with a
pseudo terminal as its input and output. It is an expansion of Figure19.6, showing all
the process connections and data flow.The box labeled ‘‘driving program’’ is the
program from Figure15.18, with theexeclchanged as described previously.driving program forkexec parentpty fork childpty (coprocess)add2terminal
line disciplineterminal
device driverterminal
line disciplinePTY master PTY slavefork,execpipe2
pipe1user at a
terminalFigure 19.15 Running a coprocess with a pseudo terminal as its input and outputThis example shows the need for the-e(no echo) option for theptyprogram. The
ptyprogram is not running interactively,because its standardinput is not connected to
aterminal. In Figure19.11, theinteractiveflag defaults to false, since the call to