1. 4.3+BSD终端登录
系统管理员创建一个通常名为/etc/ttys的文件,其中,每个终端设备有一行,每一行说明设备名和传到getty程序的参数,这些参数说明了终端的波特率。当系统bootstrap时内核创建进程ID 1,也就是init进程。init进程使系统进入多用户状态。init读文件/etc/ttys,对每一个允许登录的终端设备,init调用一次fork,它所生成的子进程则执行程序getty。这种情况见下图:

图中每个进程的实际用户ID和有效用户ID都是0(即都有root权限)。init以空环境执行getty程序。
getty对终端设备调用open函数,以读、写方式将终端打开。如果设备是调制解调器,则open可能会在设备驱动程序中滞留,直到用户拨号调制解调器,并且线路被接通。一旦设备被打开,则文件描述符0、1、2就被设置到该设备。然后getty输出"login:"之类的信息,并等待用户键入用户名。如果终端支持多种速度,则getty可以测试特殊字符以便适当地更改终端速度(波特率)。
当用户键入用户名后,getty就完成了,然后它以类似于下列的方式调用login程序:
execle("/usr/bin/login", "login", "-p" username, (char *) 0, envp); (在gettytab文件中可能会有一些选择使其调用其他程序,但系统默认是login程序)。init以一个空环境调用getty。getty以终端名(例如TERM=foo,其中终端foo的类型取自gettytab文件)和在gettytab中的环境字符串为login创建一个环境(envp参数)。-p标志通知login保留传给它的环境,也可以将其他环境字符串加到该环境中,但是不要替换它。下图显示了login刚被调用后这些进程的状态。

因为最初的init进程具有root权限,所以图中所有进程都有root权限。图中底部三个进程的进程ID相同,因为进程ID不会因执行exec而改变。并且除了最初的init进程,所有的进程均有一个父进程ID。
login能处理多项工作。因为它得到了用户名,所以能调用getpwnam取得相应用户的口令文件登陆项。然后调用getpass以显示提示"Password:"接着读用户键入的口令。它调用crypt将用户键入的口令加密,并与该用户口令文件中登陆项的pw_passwd字段相比较。如果用户几次键入的口令都无效,则login以参数1调用exit表示登录过程失败。父进程(init)了解到子进程的终止情况后,将再次调用fork,其后又跟着执行getty,对此终端重复上述过程。
如果用户正确登录,login就将当前工作目录更改为用户的home目录。它也调用chown改变该终端的所有权,使该用户成为所有者和组所有

