1.2. 终端登录过程

一台PC通常只有一套键盘和显示器,也就是只有一套终端设备,但是可以通过Ctrl-Alt-F1~Ctrl-Alt-F6切换到6个字符终端,相当于有6套虚拟的终端设备,它们共用同一套物理终端设备,对应的设备文件分别是/dev/tty1~/dev/tty6,所以称为虚拟终端(Virtual Terminal)。设备文件/dev/tty0表示当前虚拟终端,比如切换到Ctrl-Alt-F1的字符终端时/dev/tty0就表示/dev/tty1,切换到Ctrl-Alt-F2的字符终端时/dev/tty0就表示/dev/tty2,就像/dev/tty一样也是一个通用的接口,但它不能表示图形终端窗口所对应的终端。

再举个例子,做嵌入式开发时经常会用到串口终端,目标板的每个串口对应一个终端设备,比如/dev/ttyS0、/dev/ttyS1等,将主机和目标板用串口线连起来,就可以在主机上通过Linux的minicom或Windows的超级终端工具登录到目标板的系统。

内核中处理终端设备的模块包括硬件驱动程序和线路规程(Line Discipline)。

图 34.1. 终端设备模块

硬件驱动程序负责读写实际的硬件设备,比如从键盘读入字符和把字符输出到显示器,线路规程像一个过滤器,对于某些特殊字符并不是让它直接通过,而是做特殊处理,比如在键盘上按下Ctrl-Z,对应的字符并不会被用户程序的read读到,而是被线路规程截获,解释成SIGTSTP信号发给前台进程,通常会使该进程停止。线路规程应该过滤哪些字符和做哪些特殊处理是可以配置的。

终端设备有输入和输出队列缓冲区,如下图所示。

图 34.2. 终端缓冲

以输入队列为例,从键盘输入的字符经线路规程过滤后进入输入队列,用户程序以先进先出的顺序从队列中读取字符,一般情况下,当输入队列满的时候再输入字符会丢失,同时系统会响铃警报。终端可以配置成回显(Echo)模式,在这种模式下,输入队列中的每个字符既送给用户程序也送给输出队列,因此我们在命令行键入字符时,该字符不仅可以被程序读取,我们也可以同时在屏幕上看到该字符的回显。

现在我们来看终端登录的过程:

1、系统启动时,init进程根据配置文件/etc/inittab确定需要打开哪些终端。例如配置文件中有这样一行:1:2345:respawn:/sbin/getty 9600 tty1

和/etc/passwd类似,每个字段用:号隔开。开头的1是这一行配置的id,通常要和tty的后缀一致,配置tty2的那一行id就应该是2。第二个字段2345表示运行级别2~5都执行这个配置。最后一个字段/sbin/getty 9600 tty1是init进程要fork/exec的命令,打开终端/dev/tty1,波特率是9600(波特率只对串口和Modem终端有意义),然后提示用户输入帐号。中间的respawn字段表示init进程会监视getty进程的运行状态,一旦该进程终止,init会再次fork/exec这个命令,所以我们从终端退出登录后会再次提示输入帐号。

有些新的Linux发行版已经不用/etc/inittab这个配置文件了,例如Ubuntu用/etc/event.d目录下的配置文件来配置init。

2、getty根据命令行参数打开终端设备作为它的控制终端,把文件描述符0、1、2都指向控制终端,然后提示用户输入帐号。用户输入帐号之后,getty的任务就完成了,它再执行login程序:execle("/bin/login", "login", "-p", username, NULL, envp);

3、login程序提示用户输入密码(输入密码期间关闭终端的回显),然后验证帐号密码的正确性。如果密码不正确,login进程终止,init会重新fork/exec一个getty进程。如果密码正确,login程序设置一些环境变量,设置当前工作目录为该用户的主目录,然后执行Shell:execl("/bin/bash", "-bash", NULL);

注意argv[0]参数的程序名前面加了一个-,这样bash就知道自己是作为登录Shell启动的,执行登录Shell的启动脚本。从getty开始exec到login,再exec到bash,其实都是同一个进程,因此控制终端没变,文件描述符0、1、2也仍然指向控制终端。由于fork会复制PCB信息,所以由Shell启动的其它进程也都是如此。

c语言tty,1. 终端_C语言_C语言入门-Linux C编程一站式学习相关推荐

  1. 位运算 c语言 头文件 linux,1. 位运算_C语言_C语言入门-Linux C编程一站式学习...

    1.2. 移位运算 移位运算符(Bitwise Shift)包括左移<>.左移将一个整数的各二进制位全部左移若干位,例如0xcfffffff3<<2得到0x3fffffcc: ...

  2. linux终端和执行进程的关系,Linux系统编程第04期:打通进程与终端的任督二脉

    本课程是<嵌入式工程师自我修养>自学教程六步走中的第3步:Linux系统编程第04期. 进程,是Linux系统中任务调度运行的基本单元:一个程序的运行,都要被操作系统包装成"进程 ...

  3. c4dR19材质编辑器语言中文,C4D R19小白成长记(入门篇) 零基础学习Cinema 4d R19中文教程...

    开篇介绍为:本套教程共32集,由UTV章老师为零基础的学员量身打造,帮助初学者系统了解C4D的界面布局,建模.材质.灯光.运动图形.动力学.布料模拟.毛发模拟.运动跟踪.插件.渲染等基础知识点,并结合 ...

  4. C语言系列必读技术书单推荐从入门到进阶+技术书阅读方法论

    前言:技术书阅读方法论 一.速读一遍(最好在1~2天内完成) 人的大脑记忆力有限,在一天内快速看完一本书会在大脑里留下深刻印象,对于之后复习以及总结都会有特别好的作用. 对于每一章的知识,先阅读标题, ...

  5. linux 进程 控制终端,linux系统编程之进程(五):终端、作业控制与守护进程

    #include#define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); } while(0) int setup_daemon(int, int ...

  6. vc 运行c语言步骤,第1章_C语言概述(vc++环境如何运行c语言程序)[精选].ppt

    第1章_C语言概述(vc环境如何运行c语言程序)[精选] C语言程序设计 授课对象:电子商务06 时间安排: 理论课(1-9周): 星期一 5-6节 9407D 星期三 5-6节 9410D 实验课( ...

  7. c语言中调整颜色的函数_C语言中的输入输出函数

    点击上方"学士科技",选择"设为星标" 技术干货第一时间送达! 01 字符数据输入输出 字符数据输出函数putchar() C语言中字符数据输出使用的是putc ...

  8. c语言 方程改main的值_c语言main函数里的参数argv和argc解析

    前言 一般我们平时写main函数的话,一般都是写不带参数的比较多,而且也习惯了这样写:其实标准的形式写法,main函数是带两个参数的,这两个参数分别是:argc和argv,那么这两个参数是表示什么意思 ...

  9. c语言exit在哪个头文件_C语言函数执行成功时,返回1和返回0,究竟哪个好?

    基本上,没有人会将大段的C语言代码全部塞入 main() 函数,更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数.C语言代码的组合千变万化,因此函数的功能可能会 ...

最新文章

  1. 新概念英语(1-47)A cup of coffee
  2. outlook自定义邮件提示声音以及设置接收邮件的间隔时间
  3. 3Sum探讨(Java)
  4. textview多行ellipsize=end不显示省略号的解决方法(一)
  5. python print格式化输出类型_第一讲:Python print() 格式化输出
  6. Paypal Rest Api自定义物流地址(跳过填写物流地址)
  7. mysql可以装到其他端口吗_linux下怎么在另一个端口安装高版本mysql
  8. Struts到JSF/Tapestry
  9. 控制工程基础学习笔记-第1章 概述
  10. coreos mysql_CoreOS 实战:在 UOS上体验CoreOS 操作全记录
  11. 格力董明珠和小米雷军的10亿赌局 --- 当年的理念谁赢谁输
  12. 2019大裁员!年关将至,最高裁员比例竟达90%?
  13. 新版标准日本语中级_第三十二课
  14. Java中识别二维码并且提高二维码的识别率
  15. 一页纸说清楚“什么是深度学习?”
  16. AtCoder Regular Contest 071 C - 怪文書 / Dubious Document
  17. python调用woff_GitHub - zergtant/python-maoyan-spider: woff-xml解码 “猫眼网反爬虫机制” 的爬虫。...
  18. QTransform(图形平移旋转剪切变换)
  19. 千兆以太网测试仪什么牌子好
  20. 专题:求解我国冷链物流

热门文章

  1. NoSQL技术入门简介
  2. 搜索算法-三个简单的小问题
  3. 【论文】Awesome Relation Extraction Paper(关系抽取)(PART III)
  4. 苹果怎么给软件加密码_用了2年苹果手机,才知道有这几个功能,钱没花冤枉,好用!!...
  5. 经典排序算法总结与Python实现(上)
  6. asp.net core 系列之允许跨域访问2之测试跨域(Enable Cross-Origin Requests:CORS)
  7. C# Property机制
  8. Android 如何添加一个新的时区
  9. python接口自动化(二十三)--unittest断言——上(详解)
  10. 【四】Jmeter:逻辑控制器