<p>Before looking at the Linux implementation, first a general Unix
description of threads, processes, process groups and sessions.
+</p><p>
+(See also <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap11.html">General Terminal Interface</a>)
</p><p>A session contains a number of process groups, and a process group
contains a number of processes, and a process contains a number
of threads.
of processes. With a shell that does not know about job control,
like <code>ash</code>, each of its children will be in the same session
and have the same process group as the shell. With a shell that knows
-about job control, like <code>bash</code>, the processes of one pipeline. like
+about job control, like <code>bash</code>, the processes of one pipeline, like
</p><blockquote>
<pre>% cat paper | ideal | pic | tbl | eqn | ditroff > out
</pre>
larger than 1 that is not a process group ID.
</p><p>A process can set the foreground process group in its session
using <code>tcsetpgrp(fd,pgrp)</code>, where <code>fd</code> refers to its
-controlling tty, and <code>pgrp</code> is a process group in the
+controlling tty, and <code>pgrp</code> is a process group in
its session, and this session still is associated to the controlling
tty of the calling process.
</p><p>How does one get <code>fd</code>? By definition, <code>/dev/tty</code>
Again, if TOSTOP is set but the background process ignores or blocks
the SIGTTOU signal, or if its process group is orphaned (see below),
then the write() returns an EIO error, and no signal is sent.
+[vda: correction. SUS says that if SIGTTOU is blocked/ignored, write succeeds. ]
<p>
</p><h3>Orphaned process groups</h3>