首先init守护进程会为每个终端fork一个子进程,然后每个子进程会exec一个叫getty的程序来真侦听每个终端等待用户登录,同时getty还会为终端调用open函数,已读写方式打开终端。
一旦收到用户请求getty会输出欢迎信息(/etc/issue中的内容)和login:以提示用户输入登录名
用户输入完成后getty便功成身退了,子进程就再exec login程序,它会根据用户输入的用户名从口令文件中获取相应的密码并以password:形式提示用户输入,输入完毕后login程序调用crypt加密用户输入的密码并与口令文件中的密码比较,若相同则成功,否则执行exit(1),init了解到它终止后便从头开始
登录成功后login需要做很多事情:
更改起始目录
当前终端所有权改为此用户 chown
终端设备访问权限变为读和写
设置进程的组ID setgid、initgroups
初始化环境,也就是一些环境变量的设置
login进程变为登录用户的用户id,并调用exexl启动用户的登录shell
...
登录shell开始运行后便会取其启动文件,bash的启动文件是bash_profile、.bash_login或.profile
参考书目:UNXI环境高级编程第二版
参考链接:
阅读(423) | 评论(0) | 转发(0) |