Linux什么叫终端登录,linux:终端(Terminal)基本概念&终端登录过程详解

ForeWord

本文主要介绍了终端的基本概念和终端在系统中登录的过程。

Key Point:

基本概念及访问终端的方法(Code)

终端登录过程详解

……Expand - Knowledge……

处理终端设备的模块:硬件驱动程序&线路规程(Line Discipline)

~tips:全文阅读需要3min~

Terminal

在UNIX/LINUX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端就成为Shell进程的控制终端(ControllingTerminal)。

同时,进程的PCB中同样也保存着对应终端的信息。由于子进程会继承父进程的PCB信息,所以Shell的控制终端自然也是它启动的其它进程的控制终端。

linux下一切皆文件,所以终端本质上也是一个文件。

因此我们可以通过访问文件的方式来查看进程对应的控制终端。⼀个进程要访问它的控制终端主要有以下2种方式:

1. 通过特殊设备文件/dev/tty访问控制终端

2. 调用ttyname函数直接访问控制终端所对应的设备文件

1. 通过/dev/tty访问进程控制终端:

如果当前进程有控制终端的话,/dev/tty就是当前进程控制终端的特殊设备文件,使用ps -ax命令查看进程与哪个控制终端相连:

d2f6358f1cb30f64f87786e79c0fd6bc.png

以上编写了一个死循环程序,在另一终端使用ps -ax查看其对应的控制终端设备文件。

对于shell而言,/dev/tty就是其对应的控制终端,使用“tty”命令可以查看它具体对应的实际终端设备:

c471545015574325cc2ee6d0461ffb1a.png

2. 调用ttyname函数来查看终端对应的设备:

ttyname函数:由文件描述符查出对应的文件名,该文件描述符指向一个终端设备。

aa41fd85fa6e0a63820161b5b244150e.png

返回值如下:

23ffa244840c8a2b6c27a595ef2d3259.png

下面我们调用ttyname函数来查看终端对应的设备,先编写源代码:

52e991c272fa16aa36bb7ac2beaa7580.png

接着运行程序:

2745cffd3ed1fead8b8c31862c7d8c25.png

如果我们打开更多终端,运行程序就可以看到终端文件的变化:

207c2232ae1b34c411212af76ef287d3.png

8c658412f7b586fd15621a767eed9f1f.png

因此每个终端设备都对应一个不同的设备文件。换句话来说:进程与终端相关联。

还可以通过改变进程关联的终端设备文件,使某终端的进程运行在另一个终端:

155e945605aeda811c6476db6c9a7c0e.png

Terminal Log in …

在Linux中, 终端登录的过程实际上就是从系统刚开启到登录成功的过程

具体登录过程如下:

Step1:系统启动时,init进程根据配置文件/etc/inittab确定需要打开哪些终端

配置文件某行功能举例:

af946f4ee0962c2cf14fc5d0a126395f.png

Step2:getty完成任务

getty根据命令行参数打开终端设备作为它的控制终端,把文件描述符0、1、2都指向控制终端,然后提示用户输入帐号。用户输入帐号之后,getty的任务就完成了,

它再执行login程序:

execle("/bin/login", "login", "-p", username, NULL, envp);

Step3:login程序运行

login程序提示用户输入密码,且在输入密码期间关闭终端的回显,因此我们在linux下输入密码时是看不到的,然后验证帐号密码的正确性。

如果密码不正确,login进程终止。init会重新fork/exec一个getty进程。如果密码正确,login程序设置⼀些环境变量,设置当前工作⽬录为该⽤户的主目录,然后执行Shell:

execl("/bin/bash", "-bash", NULL);

注意argv[0]参数的程序名前面加了⼀个‘-’,这样bash就知道自己是作为登录Shell启动的。然后执行登录Shell的启动脚本。

总结:

整个登陆过程可以总结为下图:

de3b4499e8fc72c2af5fcc32bf276af0.png

从getty开始exec到login,然后exec到bash,其实都是同一个进程,因此控制终端没变。文件描述符0、1、2也仍然指向控制终端。由于fork会复制PCB信息,所以由Shell启动的其它进程也自动打开这些文件描述符。

……Expand - Knowledge……

同样从键盘输入ctrl+c和ab,前者识别为信号,后者则可以正确的显示到显示器上,为什么:

这正是内核当中线路规程的作用(Line Discipline)。

实际上,内核中处理终端设备的模块包括硬件驱动程序和线路规程,示意图如下:

e99378d9ad368ed4621cb89b0b5d9ccb.png

其中, 硬件驱动程序负责读写实际的硬件设备,比如从键盘读入字符和把字符输出到显示器;

线路规程则像一个过滤器,对于某些特殊字符并不是让它直接通过,而是做特殊处理:比如在键盘上按下Ctrl+C,对应的字符并不会被用户程序的read读到,而是被线路规程截获,解释成SIGINT信号发给前台进程,使该进程停止。

线路规程应该过滤哪些字符和做哪些特殊处理是可以配置的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值