UNIX Program Generic Issue 3, otherwise known as PG-1C300, is a version of the UNIX operating system issued by the UNIX Support Group in March of 1977. The Program Generic line was used as a standard, supported UNIX base on which to base other projects and supply a computing environment to a larger group of users than the Research group could support. PG 3 would go on to serve as the base of the real-time MERT Release 0 system.
One particular change is the adoption of a new runlevel-based init system, an ancestor of the inittab-driven systems found in later UNIX branches. Issue 3 also sees the adoption of SCCS from the PWB project as well as half-duplex terminal support, allowing for the use of various Dataspeed (Teletype) Model 40 terminals.
On April 25th, 2026 it was announced that a copy of Program Generic Issue 3 had been successfully archived, preserved, and resurrected in SimH's PDP-11 emulator. More can be found here.
-
The db(I) and cdb(I) debuggers are retired in favor of adb(I).
The PWB/SCCS Release 3 is added. This version is the prior release described in the PWB/SCCS Release 4.0 PIB
here.
as(I) and ld(I) allow specification of the output file name.
cat(I) gains the -u (unbuffered) option.
cc(I) will pass “.s” files to the assembler.
The -E, -D, -I, and -C options are added to cc(I). In particular, the -C option is used to specify a “compool” directory for include searches. The default directory is “/compool/”. Additionally an -h option is provided to include the CWD (as opposed to the directory of a source file) in the search path for local includes.
cd is added as an alias for chdir(I).
Support for the sticky bit is added.
The chroot(I) command is added.
The cp(I) command gains a -t option to report the number of blocks copied.
The cpall(I) and mvall(I) commands are added to bulk-transfer filesystem objects.
utmp and wtmp are moved into /etc
dd(I) loses the sync conversion flag
diff(I) takes on the more familiar e and f options, dropping 1 and 2.
diff(I) adds the b option for ignoring whitespace.
diff3(I) is added.
ed(I) regular expressions add '-' ranges.
ed(I) adds subsequent matching of prior subexpressions.
ed(I) adds the Q and E commands to override warnings on q and e.
ed(I) adds a u command to undo the last s command.
Typesetting utilities troff(I), eqn(I), neqn(I), and tbl(VI) are added.
ld(I) adds -e and -b options for defining the entry point and memory base respectively.
The lines(V)-based init(VIII) is added, resulting in changes to getty(VIII) as well as the retirement of many tty-flavored utilities and pages in favor of line-flavored utilities. This init system resembles CB/System V init much moreso than Research init.
The ps(I) command adds PPID, CPU, NICE, LNE, and TIME for the parent process-id, CPU process magic number, process penalty, line number, and user/system time respectively.
The sed(I) command is added.
Kill and erase reassignment are added to stty(I).
The tail(I) and tee(I) text filters are added.
The wall(I) command is added.
Character count is added to wc(I).
The who(I) command is greatly expanded with regards to the lines(V)-based init and accounting.
Errno 14 has been reassigned EFAULT for “Memory fault”.
Errnos 33-37 have been assigned ETABLE, EFUNC, ENOMSG, ENOALOC, and EBIOCTL.
The mdate(II) syscall is dropped.
The access, acct, ioctl, ptrace, and tell syscalls are added.
The chroot(II) syscall is added, later showing up in 1980's Release 3.0.
The call(II) syscall is added as a combined fork-exec.
The errlog(II) syscall is added for error logging to an error daemon.
The msg(II) IPC primitive is added (more
here)
The getppid syscall is added to support IPC.
The lock(II) semaphore interface is greatly expanded.
The signal(II) syscall adds 15 (catchable kill) and 18 (death of a child) signals.
TTY 1200 baud support is more clearly stated.
The times(II) syscall now returns a struct of longs.
The itol(III) and ltoi(III) subroutines are added for packing/unpacking between longs and ints.
The lseek(III) subroutine is added for using longs with seeks.
The %D, %O, and %X format specifiers for printf(III) are added for specifying decimal, octal, or hexadecimal *long* integers respectively.
A %u specifier is added for unsigned integers in printf(III).
The cm(IV) minitape interface is added.
Line disciplines are supported in the tty(IV) driver via ioctl(II).
The dp(IV) Dataphone interface timeout is doubled from 5 to 10 seconds.
The suggested hp(IV) disk geometry has changed.
The a.out(V) magic number 405 is added as an “overlay” file.
A recsize field is added to the header structure of a dump(V).
The reform(VI) utility is added.
The accton(VIII) utility is added.
The dcheck(VIII) and ncheck(VIII) disk utilities are added.
The dump(VIII) and restor(VIII) command adds options for 800/1600 bpi switching.
The errdemon(VIII) and errpt(VIII) error reporting mechanism is added.
The iostat(VIII) I/O statistics utility is added.
The load(VIII), mkconf(VIII) and mkpt(VIII) system generation utilities are documented.