91〓引言
在上一章我们已了解到进程之间具有关系。首先,每个进程有一个父进程。当子进
程终止时
,父进程会得到通知并能取得子进程退出状态。在86节说明waitpicl函数时,我
们也提到
了进程组,以及如何等待进程组中的任一个进程终止。
本章的更详细地说明进程组以及POSIX1引进的对话期新概念。我们也将介绍log
in shell(
是我们登录时为我们调用的)和所有从login shell起动的进程之间的关系。
在说明这些关系时不可能不谈及信号,而谈论信号又需要很多本章介绍的概念。如
果你不熟
悉Unix信号,则可能先要浏览一下第十章。
92〓终端登录
先看一看登录到Unix系统时所执行的各个程序。在早期的Unix系统中,例如Versi
on7,用户
用哑终端(通过RS-232连到主机)进行登录。终端或者是在地的(直接连接)或者是远
程的(通
过调制解调器连接)。在这两种情况下,login都经由系统核中的终端设备驱动程序
。例如,
在PDP-11上常用的设备是DH-11和DZ-11。因为连到主机上的终端设备数已经确定,
所以同时
的
login数也就有了已知的上限。下面说明的登录过程适用于使用一个RS-232终端登
录到Unix
系统中。
43 BSD终端登录
登录过程在过去十五年中并没有多少改变。系统管理者创建一个通常名为/etc/
thys的文
件
,其中,每个终端设备有一行。每一行说明设备名和传到getty程序的参数。这些
参数说明
了终端的波特率等。当系统自举时,系统核创建进程ID1,也就是init进程。init
进程供系
统进入多用户状态。init读文件/etc/ttys,对每一个允许登录的终端设备,ini
t拥有一次
fork,它所生成的子进程则执行(exec)程序getty。这种情况示于图91中。
图91 init生成进程使终端可用于login
图91中,各个进程的实际用户ID和有效用户ID都是0(也就是它们都具有超级用户
特权)。i
nit以空环境exec getty程序。
getty对终端设备调用open画数。以读、写方式将终端打开。如果设备是调制解调
器,则Ope
n可能会在设备驱动程序中滞留,直到用户拨号调制解调器,并且线路被接通。一
旦设备被
打开,则文件描述符0,1,2就被设置到该设备。然后getty输出login之类的信息
,并等待
用户键入用户名。如果终端支持多种速度,则getty可以测试特殊字符以便适当地
更改终端
速度(波特率)。关于getty程序以及有关数据文件的细节,请参改Unix手册。
当用户键入了用户名后,getty就完成了。然后它以类似于下列的方式调用login程
序:
execle("/usr/bin/login","login""-p",username,(char*)O,enup);(在getty
tab文件
中可能会有一
些选择项使其调用其它程序,但系统默认是login程序。)init以一个空环境调用g
etty。get
ty以终端名(例如TERM=foo,其中终端foo的类型取自gettytab文件)和在gettytab中
的环境字
符串为login创建一个环境(enup参数)。-p标志通知login保留传给它的环境,也可
将其它环
境字符串加到该环境中,但是不要代换它。图92显示了在login刚被调用后这些
进程的状
态。
图92 login刚被调用后各进程的状态
因为init进程具有超级用户优先权,所以图92中的所有进程都有超级用户优先权
。图92
中底部三椎是一个进程,它们的进程ID和父进程ID都不会因执行exec而改变。
login的工作主要是:因为它得到了用户名,所以就能调用getpwnam取得相应用户
的口令字
文
件登记项。然后调用getpass(3)以显示提示Password;接着读用户键入的口令字(
自然,禁
止回适用户键入的口令字)。它调用crypt(3)将用户键入的口令字转换成密码,并
与该用户
口令字文件中的登记项的pw 迹茫模*常病絧asswd字段相比较。
$False$
如果用户几次键入
的口令字
都无效,则lo
gin以参数1调用exit表示登录过程失败。父进程(init)了解到子进程的终止情况后
,将再次
调用fork,其后又跟随着exec getty,对此终端重复上述过程。
如果用户正确登录,login就将当前工作目录更改为该用户的起始目录(chdir)。它
也调用ch
own改变该终端的属主关系,使该用户成为属主和组属主。将对该终端设备的存取
许可权改
变成:用户读、写和组写。调用setgid及initgroups设置进程的组ID。然后用leg
in所得到
的所有信息初始化环境:起始目录(HOME)、shell(SHELL)、用户名(USER和LOGNAM
E)、以及
一个系统默认路径(PATH)。最后,login进程改变为登录用户的用户ID(setuid)并
调用该用
户的登录shell,其方式类似于:
execl("/bin/sh","-sh",(char *)o);
argv[o]的第一个字符'-'是一个标志,表示该shell被调用为登录shell。shel
l可以查
看此字符,并相应地修改其起动过程。
login所做的比上面说的要多。它可选地打印message-of-the-day文件,检查新邮
件以及其
它一些功能。但是考虑到本市的内容,我们主要关心上面所说的功能。
回忆在810节中对setuid函数的讨论,因为setuid是由超级用户调用的,它更改
所有三个
用户ID:实际、有效和保存的用户ID。login在较早时间调用的setgid对所有三个
组ID也有
同样效果。
到此为止,登录用户的login shell开始运行。其父进程ID是init进程ID(进程ID1
),所以当
此login shell终止时,init会得到通知(接到SIGCHLD信号),它会对该终端重复全
部上述过
程。登录shell的文件描述符0,1和2设置为终端设备。图93显示了这种安排。
图93终端登录结束后的有关进位
现在,login shell读其启动文件(Bourne shell和Korn shell是profile,C shell
是Cshrc和login)。这些启动文件通常改变某些环境变量,加上一些环境变量。例
如,很多用户设置他们自己的PATH,常常提示实际终端类型(TERM)。当执行完启
动文件后,用户最后得到shell的
提示符,并能键入命令。
SVR4终端登录
SVR4支持两种形成的终端登录:(a)getty方式,这与上面对43+BSD所说明的一
样,(b)tt
ymon登录,这是SVR4的一种新功能。通常,getty用于控制台,ttymon则用于其它
终端的登
录。
ttymon是名为SAF(Service Access Facility,服务存取设施)的一部分。按照本市
的目的,
我们只简单说明从init到login shell之间工作过程,最后结果与图93中所示相
似。init
是sac(服务存取控制器)的文进程,sac调用fork,然后其子进程exec ttymon程序
,此时系
统
进入多用户状态。ttymon监视列于配置文件中的所有终端端口,当用户键入login
名时,它
调用一次fork。在此之后该子进程又exec登录用户的login shell,于是到达了图
93中所
示的位置。一个区别是login shell的父进程现在是ttymon,而getty login中,l
ogin shel
l的父进程是init。
93〓网终登录
43+BSD网络登录
在上节所述的终端登录中,init知道哪些终端设备可用来进行登录,并为每个设备
生成一个g
etty进程。但是,对网络登录则情况有所不同,所有登录都绎由系统核的网络界面
驱动程序
(例如:以太网驱动程序),事先并不知道将会有多少这样的登录。不是使一个进程
等待每一
个可能的登录,而是必须等待一个网络连接请求的到达。在43+BSD中,有一
个称为in
etd的进程(有时称为Internet superserver),它等待大多数网络连接。在本市中
,我们将
说明43 BSD的网络登录中所涉及的进程序列)。欢迎光临学网,点击这里查看更多文章教程 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
关于这些进程的网络程序设计方
面的细节
请参阅Sterens[1990]。
作为系统起动的一部分,init调用一个shell执行shell脚本etc/rc。由此shell脚
本起动一
个精灵进程inetd。一旦此shell脚本终止,inetd的父进程就变成init。inetd等待
TCP/IP
连
接请求到达主机,而当一个连接请求到达时,它fork-子进程,然后该子进程exec
适当的程
序。
我们假定到达了一个对于TELNET服务器的一个TCP连接请求。TELNET是使用TCP协议
的远程登
录应用程序。在另一个主机(它通过某种形成的网络,连接到服务器主机上)上的用
户,或在
同一个主机上的一个用户籍起动TELNET客户进程(client)起动登录过程:
telnet hostnaml
该客户打开一个到名为hostname的主机的TCP连接,在hostname主机上起动的程序被
称为TELN
ET服务器。然后,客户进程和服务器进程之间使用TELNET应用协议通过TCP连接交
换数据。
所发生的是起动的用户现在登录到了服务器进程的主机(自然,用户需要在服务器
进程主机
上有一个有效的账号。)图94显示了在执行TELNET服务器进程(称为telnetd)中所
涉及的进
程序列。
然后,telnetd进程打开一个伪终端设备,并用fork生成一个子进程(在十九章中将
详细说明
伪终端。)父进程处理通过网络连接的通信,子进程则exec login程序。父子进程
通过伪终
端
相连接。在调用exec之前,子进程使其文件描述符0,1,2与伪终端相连。如果登
录正确,l
ogin就执行在92节中所述的同样步骤-更改当前工作目录为起始目录,设置登录
用户的组I
D和用户ID,以及登录用户的初始环境。然后login用exec将其自身代换为登录用户
![]() 清爽风格非主流签名制作:淡淡的幸福 | ![]() [非主流照片教程]PS制作May风格 | ![]() 可爱非主流x-liu风格 | ![]() 非主流照片制作教程:单色个性篇 |
![]() 非主流照片教程:P出非主流风格效果 | ![]() 非主流照片教程:PS制作Sener非主流效果 | ![]() 简单的非主流浅黑白色调效果 | ![]() 非主流照片教程:baby kiss非主流效果 |