Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1689116
  • 博文数量: 76
  • 博客积分: 2175
  • 博客等级: 大尉
  • 技术积分: 2481
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-20 20:49
个人简介

欢迎光临我的博客

文章分类

全部博文(76)

文章存档

2018年(4)

2017年(1)

2016年(2)

2015年(2)

2013年(5)

2012年(29)

2010年(33)

分类:

2010-09-08 12:02:14

本章第15.215.3节已经超出UNIX6版的范围,但鉴于它们现在应用的广泛性,并且它们综合体现了UNIX作为多用户分时操作系统和数据共享的特性,故在此做一介绍。

15.1  系统初始化过程

15.1.1  init进程

在第5章曾经提到过init进程,它是系统进程,进程号是1,在系统初始时创建,运行在用户空间,对应的可执行文件是/etc/init,其源码在/usr/source/s/s1/init.c中。这里对init进程再进行深入研究。

init进程作为调度进程的子进程,在内核初始化时被创建,并且永远不会退出。通过源码可以看出,它首先判断当前终端寄存器值,如果不是单用户(即reboot时),则创建一个shell子进程,然后等待其退出。再清除/etc/utmp文件,并且把用户名、~和当前时间写入到/usr/adm/wtmp文件中,如果该文件存在的话。init进程的该过程在整个系统初始化时只会运行一次,并且只在终端寄存器值不为单用户时。

这之后是init进程的主循环。它首先关闭所有文件。然后再次判断终端寄存器的值,如果为单用户,则终止所有子进程,然后创建子进程,等待其退出。子进程会打开终端/dev/tty8,并且运行shell。用户在此shell中应该根据需要编辑/etc/ttys文件,因为init进程此后会根据该文件内容来创建整个系统中所有的终端。

/etc/ttys文件的格式是:

flag line comn \n

flag2 line2 comn2 \n

… …

实际每列之间并没有空格,这里为了阅读的方便。每列只有1个字节。每行定义一个终端。

flag指示当前行是否生效,1生效,0不生效。

linetty编号。如果line等于1,则该行所对应的终端是/dev/tty1

comntty类型,可以是 ‘-’ ‘0’ ‘1’ ‘2’12

\n换行符作为结束。

init进程把从/etc/ttys中读出的每行数据按顺序存放在如下内部全局结构数组中,而第2行存放在最后,该数组的初值为0



struct tab

{

   int pid; //运行该终端的进程ID


   int line; //终端号,ttyx中的x


   int comn; //终端类型


} itab[tabsize];


tabsize的值为20,这样系统中最多可同时打开20个终端。如果/etc/ttys文件内容为空,则程序会跳转到终端寄存器的值为单用户情况时处理,打开shell让用户继续编辑/etc/ttys

否则,init进程结束系统中已有的其他用户进程。

 

15.1.3  login程序

login程序主要提供界面让用户输入用户名和密码,并进行认证。如果通过认证,则运行shell程序,打开终端供用户使用。在讲解代码之前,首先介绍一下UNIX的几个系统文件。

1utmp文件

utmp文件用来记录每个终端用户的登录情况,但只会保存最近一次登录的记录。在用户退出后,该记录被清除。每条记录是如下结构:


struct {
    charname[8];
    chartty;
    charifill;
    int    time[2];
    int    ufill;
} utmp;


name是用户名,如果用户名长度超过8,则只取前8个字符。

tty是终端设备号,从‘0’‘z’。也就是init进程中itab结构中的line

time是登录时间。

ifillufill用于填充,凑齐16字节。

utmp文件的一个示例如表15-1所示。

15-1  utmp文件的示例

文件偏移

0x0

Jerry   0 123456

0x10

Wly     1 128900

0x20

\0\0\0\0\0\0\0\0\0\0\0\0\0tty2终端用户已退出)

… …

0xA0

Youyou   a 105632

utmp文件在/etc目录下,全路径是/etc/utmp

2wtmp文件

wtmp文件和utmp文件很类似,也用于记录用户的登录的情况,并且每条记录和utmp相同。所不同的是:

1wtmp文件存储用户每次登录的记录,而不仅仅是最近一次。这导致wtmp文件不断增大,不像utmp文件大小固定。假如一共有n个终端设备,则utmp文件大小为n*16

2wtmp文件不仅存储用户登录的记录,还存储用户退出的记录;

3)各个终端用户记录在utmp文件中的位置都是固定的:从文件起始依次存储终端/dev/tty0/dev/tty1…/dev/ttyz的记录。而wtmp则不固定各终端用户的记录,每次新记录都会存到文件末,这样文件在不断增长。

wtmp文件的一个示例如表15-2所示。

15-2  wtmp文件的示例

文件偏移

0x0

Youyou   a 105632

0x10

\0\0\0\0\0\0\0\0     a 111000Hawk退出记录)

0x20

Jerry   0 123456

0x30

Wly     1 128900

 

\0\0\0\0\0\0\0\0     0 130000Jerry退出记录)

… …

可以看出,wtmp文件的记录是按时间排序的。

wtmp文件位于/usr/adm目录下,全路径是/usr/adm/wtmp

3/etc/motd文件

motdmessage of today的缩写,它是UNIX系统的一个公告文件,用户每次登录后,都会看到该文件的内容。它通常由系统管理员编辑,用于广播一些公共的事务,比如:

“Welcome you! The system’s hardware is PDP 11/40 , memory size is 256K”

4/etc/passwd文件

上一章   多线程的实现                              目录
阅读(12686) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-10 09:35:35

Download More than 1000 free IT eBooks: http://free-ebooks.appspot.com