Linux系统编程(25)——终端
在Linux系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端。控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是读用户的键盘输入,进程往标准输出或标准错误输出写也就是输出到显示器上。
在控制终端输入一些特殊的控制键可以给前台进程发信号,例如Ctrl-C表示SIGINT,Ctrl-\表示SIGQUIT。
每个进程都可以通过一个特殊的设备文件/dev/tty访问它的控制终端。事实上每个终端设备都对应一个不同的设备文件,/dev/tty提供了一个通用的接口,一个进程要访问它的控制终端既可以通过/dev/tty也可以通过该终端设备所对应的设备文件来访问。ttyname函数可以由文件描述符查出对应的文件名,该文件描述符必须指向一个终端设备而不能是任意文件。下面我们通过实验看一下各种不同的终端所对应的设备文件名。
查看终端对应的设备文件名
#include <unistd.h>
#include <stdio.h> int main()
{
printf("fd 0: %s\n", ttyname(0));
printf("fd 1: %s\n", ttyname(1));
printf("fd 2: %s\n", ttyname(2));
return 0;
}
在图形终端窗口下运行这个程序,可能会得到
fd 0: /dev/pts/0
fd 1: /dev/pts/0
fd 2: /dev/pts/0
一台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的超级终端工具登录到目标板的系统。
内核中处理终端设备的模块包括硬件驱动程序和线路规程
aaarticlea/png;base64,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" alt="" />
硬件驱动程序负责读写实际的硬件设备,比如从键盘读入字符和把字符输出到显示器,线路规程像一个过滤器,对于某些特殊字符并不是让它直接通过,而是做特殊处理,比如在键盘上按下Ctrl-Z,对应的字符并不会被用户程序的read读到,而是被线路规程截获,解释成SIGTSTP信号发给前台进程,通常会使该进程停止。线路规程应该过滤哪些字符和做哪些特殊处理是可以配置的。
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgkAAAC2CAYAAABTYR5xAAAgAElEQVR4Ae3dB5xdRfUH8IFQJKEFpLcA0qQnSJeudEVAREClCSj8Ffgj/FUEFLAgYkGk9yIBJKGESA+9txAgCRBC771X/+87cZa3j91kd9lk37535vPZfe/dO3fuzO/ec+Z3zpyZmeo/lZQiBQKBQCAQCAQCgUAgUIPA1DW/42cg0PAIvPrqq+n5559v+HZGAwOBQGDiCLzwwguJPojUPgJBEtrHJs70MgQ+/vjjSdb4kUceST//+c/TqaeeOsm83ZGBo+6TTz7pjqKijEAgEOggAh3RBbfddlvaZ5990pVXXpmmhEO9t+qCIAkdfOkiW30jcNZZZ6VzzjlnkpVccMEF0wwzzJCeeeaZSebtjgwXXHBBOvHEE7ujqCgjEAgEOoDAUUcdlUaMGDHJjn/RRRdNH330UXrppZc6UOrnz/LXv/41XX755ZOs1+e/U/eWME33FhelBQIdR4CAPvbYY/mC119/Pd15551pwIABacMNN0xTTTVVeuutt9L999+f3YELLbRQ+tKXvpSFbLbZZktrrrlmevfdd9M999yTVl999XT77ben6aefPl/Tr1+/fH2pCe/Bvffem9588820+eabp/nnnz+NHz8+3XLLLemuu+7K1w8cODBnv/vuu9ODDz6YWCJbbrllmnHGGdO4cePyb/V56qmn0te//vWc54EHHsjXfOtb38r5/Lj11lvzuXnmmSdtvPHGaeTIkenll19OH374YZp22mnTs88+m89/8MEHadVVV01f+MIXcvnu8/DDD+c2fPWrX83lxr9AoFkQIMt0AQL/+OOPZxkhk2REevHFF9NDDz2UZXjZZZdNM800U7rqqqvSUkstlZZZZpnc0ZOf1VZbLV177bWJDvBdeXRJSfQA+Z5mmmnS+uuvn+add95c5nXXXZeP0z3Iw3vvvZf10dixY9Mss8ySvvnNb2ZCoY5k9oknnshFrrzyyjnfmDFj0hxzzJE222yz1KdPnyzv119/fW6T+spHR/EmfO1rX8v3p5f8TTfddLmu77//fi63f//+WS8ttthiaemlly5V77HPPodUUo/dPW7c1AjoiM8777z0u9/9LhEkpOHYY49NOliCetJJJ2UBIkSOO0Y4f//732cBv/HGG9Mrr7yS5p577pxXB/7FL34x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" alt="" />
以输入队列为例,从键盘输入的字符经线路规程过滤后进入输入队列,用户程序以先进先出的顺序从队列中读取字符,一般情况下,当输入队列满的时候再输入字符会丢失,同时系统会响铃警报。终端可以配置成回显(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启动的其它进程也都是如此。
Linux系统编程(25)——终端的更多相关文章
- Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号
Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...
- Linux系统编程@进程通信(一)
进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...
- 读书笔记之Linux系统编程与深入理解Linux内核
前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...
- linux系统编程(一)概述
glibc库封装了linux系统调用,并提供c语言接口 所以学习linux系统编程,主要参考glibc库系统调用相关api 一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 ...
- Linux 系统编程 学习:01-进程的有关概念 与 创建、回收
Linux 系统编程 学习:01-进程的有关概念 与 创建.回收 背景 上一讲介绍了有关系统编程的概念.这一讲,我们针对 进程 开展学习. 概念 进程的身份证(PID) 每一个进程都有一个唯一的身份证 ...
- Linux系统编程【3.1】——编写ls命令
ls命令简介 老规矩,直接在终端输入:man ls (有关于man命令的简介可以参考笔者前期博客:Linux系统编程[1]--编写more命令) 可以看到,ls命令的作用是显示目录中的文件名,它带有可 ...
- Linux系统编程【2】——编写who命令
学到的知识点 通过实现who命令,学到了: 1.使用man命令寻找相关信息 2.基于文件编程 3.体会到c库函数与系统调用的不同 4.加深对缓冲技术的理解 who命令的作用 who命令的使用 在控制终 ...
- Linux系统编程【3.2】——ls命令优化版和ls -l实现
前情提要 在笔者的上一篇博客Linux系统编程[3.1]--编写ls命令中,实现了初级版的ls命令,但是与原版ls命令相比,还存在着显示格式和无颜色标记的不同.经过笔者近两天的学习,基本解决了这两个问 ...
- Linux系统编程温故知新系列 --- 01
1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数 ...
- linux系统编程之错误处理
在linux系统编程中,当系统调用出现错误时,有一个整型变量会被设置,这个整型变量就是errno,这个变量的定义在/usr/include/errno.h文件中 #ifndef _ERRNO_H /* ...
随机推荐
- uva 317 - Hexagon(规律推导)
题目连接:317 - Hexagon 题目大意:在一个19个六边形组成的图形上玩一个游戏,给出9个数字, 分成3组, 分别可以填在左上角, 上, 有上角,因为对于小六边形来说, 对边的数是相同的, 然 ...
- C#量转换为汉字表达
/* 创造者:菜刀打好博客 * 创建日期: 2014年09一个月04号码 * 特征:Money类型转换 * */ namespace Net.String.ConsoleApplication ...
- java图片处理工具类
直接上代码: package com.zxd.tool; /** * Created by zhang on 14-3-1. * 图片的常用操作类 */ import java.awt.AlphaCo ...
- Activity内部Handler引起内存泄露的原因分析
有时在Activity中使用Handler时会提示一个内存泄漏的警告,代码通常如下: public class MainActivity extends Activity { private Text ...
- NYOJ-1070诡异的电梯【Ⅰ】
这道题是个dp,主要考虑两种情况,刚开始我把状态转移方程写成了dp[i] = min(dp[i-1] + a, dp[i + 1] +b); 后来想想当推到dp[i]的时候,那个dp[i + 1]还没 ...
- 01-资料管理器(Directory/DirectoryInfo操作文件夹类)
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Loa ...
- 一条insert语句批量插入多条记录
一条insert语句批量插入多条记录 常见的insert语句,向数据库中,一条语句只能插入一条数据: insert into persons (id_p, lastname , firstName, ...
- SQL从入门到基础 - 02 SQLServer的使用
一.SQLServer的管理 服务器名称:ICECOA-81DEA7A2.\SQLEXPRESS 1. 数据库->表->字段->主键 2. 编辑表 二.数据类型 1. bit:相当于 ...
- UI基本之UITextField相关方法属性
//初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(, , , )]; // ...
- JQuery 解析xml
JQuery 可以通过 $.get() 或 $.post() 方法来加载 xml. JQuery 解析 XML 与解析 DOM 一样, 可以使用 find(), children() 等函数来 ...