Unix操作系统的两个组成部分:内核和壳.学习操作系统的一个重要的任务是命令集,Unix的帮助文档-man。
整个Unix是以几个简单并有点抽象的概念为核心的。Unix的成功在于对一组精心挑选出来的成熟的思想的充分的实现,并证明这些思想是实现一个小而强大的系统的关键技术。
将内核和壳之间的任务分工,内核负责与机器的硬件打交道,shell则负责与用户打交道。
内核是操作系统的核心程序,是一组用C语言写成的例程,系统启动时被载入到内存里,直接对硬件设备进行控制.需要访问硬件设备的应用程序需要利用内核提供的服务,间接的访问硬件设备。函数调用请求内核服务。
除了为用户提供服务外,内核还要处理大量的日常事务(内存管理,进程管理,设备管理等等)。计算机本身不能理解用户输入的命令,需要一个命令解释器.一个系统只能有一内核在运行,可以有多个shell程序同时运行.
Unix系统的两大支柱:文件和进程,文件是空间,进程是生命.
文件是字节序列,可以包含几乎任何内容,作为层次结构的一部分,它与另一文件有关联.定位文件时,需要选择莫事先定义好的位置作为参考点,Unix不在乎文件的类型,一切都是文件,最重要的一类文件是文本文件—系统的运行方式在很大程度上由这类文件决定.
进程是指内存中运行的程序,进程是可执行文件的”时间镜像”,与文件一样,进程也是一个层级结构里的成员.进程是一个有机体,有双亲,孩子和子孙,会在某个时间出生,在某个时间死亡.系统为我们提供了控制进程的工具.
Unix系统是由内核,shell和应用程序三个部分组成的,他们都是使用C编写的.虽然整个系统包含了一千多个命令,但是他们通过为数不多的几个函数调用与内核进行通信,这些函数调用为系统调用.各种不同类型的Unix系统的共同的特点是:他们的系统调用完全一样,都遵循POSIX规范。
多用户多任务,管道+过滤器-->小即使美,Unix工具包,模式匹配,编程工具(shell以及其他的各种脚本)
Unix系统提供了全双工式的终端,shell将来自键盘的输入暂存到内核中的一个临时缓冲区,在当前命令执行执行完成后,内核再将命令传递到shell,让它进行解释.
man命令总是和某个特地的分页程序一起使用,Unix中的分页程序:
more:由Berkeley提供的分页程序,比AT&T公司的pg命令性能优越.
less:Linux系统的标准分页程序,模仿vi编辑器,功能比more强,使用vi导航和搜索的大部分功能.
导航和搜索:for b,搜索:'/'
小节 |
专题(SVR4) |
名称(Linux) |
说明 |
1 |
用户程序 |
用户命令 |
可由普通用户启动的命令 |
2 |
内核系统调用 |
系统调用 |
内核系统的函数 |
3 |
库函数 |
库函数 |
C 语言函数的库中的函数 |
4 |
管理文件格式 |
特殊文件和驱动 |
/dev目录中的特殊文件 |
5 |
其他 |
文件格式 |
如/etc/passwd等文件格式 |
6 |
游戏 |
游戏 |
系统提供的游戏,屏幕保护程序 |
7 |
特殊文件(/dev) |
杂项和约定 |
标准文件系统的布局和手册页结构等杂项 |
8 |
管理命令 |
系统管理工具 |
只能由root启动的系统命令 |
一个man文档是有很多的部分组成,其中的一部分是公共的,另一部分是可有可无的.钱三个部分是NAME(使用一行介绍命令的功能),SYNOPSIS(概要,介绍命令的用法),DESCRIPTION(提供命令的详细内容).man-k,apropos,whatis,Linux的—help可选项
终端和键盘的行为是不可预知的,一些终端设置将直接影响到键盘的操作,需要检查TERM变量值,下面使用一些常见的处理方法。
组合键或命令 |
功能 |
Ctrl+h |
删除字符(删除键) |
Ctrl+c|Delete |
终端命令(终端键) |
Ctrl+d |
终止登录会话过程或终止等待键盘输入的程序(EOF标识) |
Ctrl+s |
停止屏幕翻页,锁住键盘 |
Ctrl+q |
恢复屏幕翻页,键盘解锁--不明白有什么作用 |
Ctrl+u |
取消命令行,不执行命令(命令行终止键) |
Ctrl+\ |
终止正在运行的命令,但是生成一个核心文件保存程序在内存里的映像(quit) |
Ctrl+z |
挂起进程,返回到shell提示标识,用fg可唤醒进程(挂起键) |
Ctrl+j |
同Enter |
Ctrl+m |
同上 |
sttysane |
恢复终端的正常状态(Unix命令) |
Unix的命令的分类:1.常用的附件工具(计算器和邮件处理工具)2.显示系统的当前状态或者改变它的设置
为了可移植,POSIX规范建议使用printf;使用script命令记录一个会话过程的所有击键操作;基于图形的处理程序和基于字符的邮件处理程序的优点.mailbox和mbox在电子邮件系统中的作用。
工具命令:cal,date,echo|printf.
script—会话过程记录命令,可以把一个会话过程记录到一个文件中,这个命令没有包含到POSIX规范中,但是他可以记录所有的击键操作,所有输出结果和错误信息。在处理非常重要的任务时,可以使用这个命令.
Unix系统往往很多用户同时使用,用户之间通信自然必不可少,电子邮件(email)很重要.
电子邮件寻址方式:寻址方式直接用主机名作为邮件的地址-->用户名@主机名
邮件处理工具:mailx,Linux使用mail来代替,
passwd,who,uname,tty(获取终端名称的命令),显示和设置终端特性的命令—stty
stty可以用过来修改终端的设置,echoe-能否删除字符,修改中断键(intr),修改文件结尾符(eof),默认设置(sane)
MIT的毕业生最先提出Xwindows,X windows已经被所有的Unix系统制造商接受为标准的窗口系统。Xwindows属于X基金会,由两部分组成:X服务器和X客户端程序。X系统和其他的系统的据别和联系.
要求:X系统的结构,服务器与客户端程序的作用,窗口管理器
客户端和服务器程序,客户-服务模式,X系统保留了C/S架构,将显示程序放在服务器端,应用程序兼作客户端程序-->X程序的移植性好.
要在一类的终端上运行一个X系统的客户端程序,设计者需要做的是为这类的终端编写一个X系统的服务端程序.
X服务器程序不仅能处理应用程序的输出,而且还能处理应用程序的输入。X系统的显示系统由多个显示器的显示屏幕组成,X客户端将他们的结果输出到显示器的各个窗口上(这些窗口没有框架,不能移动,也不能改变大小).一个专用的客户端程序来管理这些窗口.
X系统主要是为了在网络上运行,在一个机器上运行一个X系统的客户端程序,在另一个机器上输出其结果,这个就是X系统的最重要的特点。
窗口管理器
X系统不提供任何窗口管理功能来管理客户端程序创建的窗口.MIT的X系统包含了按钮和滚动条,但是外观平淡无奇,没有边框,也没有菜单,既不能移动和改变大小,也不能改变在窗口栈中的位置。X程序觉提外观不取决于X服务程序,而是取决GUI。GUI是一个自成体系的产品(另一个客户端程序,在X系统中,GUI被称之为窗口管理器)。
窗口管理器:OpenLook – Motif(mwm) – GTK/GTK+| Qt.
X系统启动需要经历复杂的过程:需要读取一个或者多个启动脚本,启动脚本决定调用哪个窗口管理器.Alt+Tab切换活跃的窗口。
Motif曾经是标准窗口管理器,X window系统的具体发行版本的窗口管理器各不相同。
IBM,HP,SUN,Novell-->CommonOpen Software Environment(COSE)--Common Desktop Enviroment(CDE)
Linux-KDE,GNOME(GNU)
Unix系统将按某个运行级启动,这个运行级在系统安装时就确定了。X系统的启动的运行级可能是3或者5.系统按这个级别启动需要调用xdm(X显示管理器)显示图形界面.可以通过startx来手动的启动X系统。
startx—xinit命令(常用工具,读取.xinitrc脚本文件)
终端仿真程序以窗口的形式运行一个shell程序,用户可以在这个窗口中执行所有的Unix命令.xterm是所有的Unix系统最原始的终端仿真程序
终端仿真程序可能是用户使用的最频繁的客户端程序,MIT将xterm和X系统一起发布。
GNOME(gnome-terminal),KDE(konsole)
为了实现“cut-plaste”功能,X客户端程序提供了Edit菜单,鼠标操作,xclipboard客户端程序。
Ubuntu系统已经有了相应的剪切版。
X系统主要的是为了在网络上运行,在单用户系统里,服务程序和客户端程序运行在同一个机器上,用户不必考虑对显示的控制.
xhost命令可以实现将其他的计算机的输出结果在本地显示
使用重定向功能把客户端程序运行结果输出到另一个终端屏幕上,设置DISPLAY变量或者在客户端程序里使用-display可选项来实现
DISPLAY是一个shell变量,X系统利用它把一个X客户段程序的运行结果输出到其他机器上。赋予DISPLAY的值采用的是“主机名:服务器号.屏幕号”,如果是Tcp/ip网络,主机名存放在/etc/hosts或者从DNS中获取。如果没有主机名,必须使用IP地址。本地计算程序xcalc
大多数的X系统的的客户程序都使用很多的可选项,其中的很多的命令是通用的
Options |
Function |
---|---|
-foreground |
窗口的前景颜色(-fg) |
-background |
窗口的背景颜色(-bg) |
-display |
指定显示客户端程序输出的主机屏幕 |
-geometry |
窗口的大小和位置(-g) |
-iconic |
按最小化模式启动客户端程序 |
-title |
出现在标题栏里的窗口标题 |
-name |
应用程序名 |
-xrm |
资源设置,它可以使资源文件里的设置无效 |
-reverse |
背景颜色和前景颜色互换 |
MIT发行了50多个客户端程序—桌面辅助工具,字体和图形工具。一些标准的MIT客户端程序.
文件管理器(dtfile)-nautilus xclock-时钟模拟器xcalc-计算器xbiff-邮件通知显示
xload-显示系统负载 xkill—图形化杀死进程
X客户端程序是由许多对象组成的,如滚动条,按钮等,每类对象及其实例都有相应的属性(可以设置)。Xrdb-装载资源命令。
小结:X系统将应用程序分解为两个部分---客户端和服务器端,服务器端控制监视器,鼠标和键盘;应用程序本身以客户端程序的形式运行
TCP/IPUnix .常用工具telnet和ftp。加密技术—secureshell,电子邮件服务和web服务工作机制—MIME协议。
TCP/IP和Internet都是基于客户机-服务器模式,守护进程一直监视特定的端口的请求。
主机文件:/etc/hosts.应用程序根据主机名可以在这个文件里查找相应的IP地址,或者更具IP地址查找相应的主机名,维护网络上的所有机器生成的/etc/hosts文件--->DNS系统.
最初的TCP/IP是由一组程序发展而来的,这组程序称为DARPA集(telnet和ftp—登录-口令的方式登录服务器),Berkeley小组开发了一套软件工具:r工具集(rlogin,rcp,rsh---采用了免口令的授权方式).DARPA和Berkeley的r工具集都是使用的明文的形式传递数据。介绍SSH(secureshell),可以使用它来对整个通信过程进行加密。
ping,telnet,ftp(可以使用pwd,ls,cd,mkdir,rmdir和chmod)
ftp传输文件:注意文件的分类,所有的可执行文件,图形文件,子处理文件和多媒体文件都属于二进制文件,在传输这些文件时要先设定binary模式。
上传文件(put,mput),下载文件(get,mget,reget)
密码学是一门关于信息安全的科学,它采用数学方法把信息转换成一种不容易理解的形式。密码学需要解决三个问题:认证,保密,完整。
很多的算法用来对数据进行加密和解密,这些算法决定了密钥生成的方式,同常分为两大类:
使用单一密钥的对称密钥法
使用两个密钥的非对称密钥法
密文的模式取决于密钥,因此数据的安全性取决于算法的健壮性和密钥的长度。
对称密钥和非对称密钥各有优缺点,SSH利用这两个技术在两端点之间建立了一个完全加密的会话过程.
对称密钥算法指得是在加密和解密过程中使用同一个密钥。消息的发送者和接受者都必须知道这个密钥。对称密钥算法用于加密和解密的速度都非常的快,广泛用于大量数据加密。如果用户需要传递大量的数据,那么最好使用对称密钥保护数据。最常使用的对称算法是DES,3DES,Blowfish,IDES.
对称算法存在一个问题,那就是如何传递密钥,用户很多的时候,密钥的交换很成。
非对称密钥算法—公钥/私钥。一个公钥,一个私钥.其中一个用来加密,另一个用来解密.
公钥是发给所有人的,私钥是保留在用户自己机器的。
非对称密钥的速度非常的慢,比对称的慢1000倍。SSH使用对称算法加密数据,使用非对称算法发送密钥。SSH采用的RSA,DSA和Diffie-Hellman作为公钥系统。
telnet和ftp的安全性是一个很严重的问题。SSH可以解决所有的这些问题,它用一个对称密钥把整个会话过程加密,使用公钥/私钥机制认证主机和用户的身份。目前在使用的主要有两类的SSH协议---SSH-1和SSH-2.在技术细节上有差别。OpenSSH程序(Berkeley)实现了SSH-2协议。
slogin用于远程登录
ssh用于远程登录和命令执行
scp和sftp用于文件传输
APPANET使用集中式的主机来维护主机文件,规模的扩展使得维护这个文件是一件极其痛苦的事情。Berkeley的加入,DomainName System,一个分布式的系统,容易升级,三个重要的概念:
域名的层级结构
分布式数据库用于“域名-IP地址”映射
层级结构里的各级授权
编译(.c-->.s文件)–汇编(.s– >.o目标码扩展名)–链接(链接器或者装配器:目标码和库-a.out)
cc(gcc)将源代码编译生成.s文件,然后调用as命令生成.o文件,然后调用ld生成可执行文件.可以直接调用ld命令,但是不好使,还是通过cc编译器比较好用,cc默认会删除.o文件,-c命令只生成目标文件.
cc-c a.c b.c c.c
cc-o foo a.o b.o c.o
大型应用程序由多个文件组成,这些文件包括了源程序和主程序所调用所需的函数的目标码,也包括了函数原型的说明的头文件,把任务分解成函数的好处:
函数代表模块,函数使程序更容易理解,因而更容易调试
函数可重用,同一个函数可以供多个程序使用
提示:是否将一段代码定义为函数:是否至少被使用过两次,或者至少被另一个程序使用。有时设计函数是为了功能分解。
.o文件才能生成可执行文件
可以根据最后修改时间来决定是否重新编译。
可以将一组.o问将合并成一个库文件,这样生成可执行文件时不需要说明全部的目标文件名,而只需要说明一个库文件。创建库文件由ar命令实现。
大型程序要用到十几个文件,使用make工具可以方便的管理这些文件之间的依赖关系。
make在当前目录下读取一个命令makefile或者Makefile文件,makefile中规则形式为:
target:dependency_list
command_list //Tabat beginning of line
make把#看成是注释行,用\符号把一行内容拆分为两行,每条规则之间有一个空行(newline)。Make递归的作用。最小立异原则。
Make的推断:
如果目标对象和从属对象具有相同的主文件名,无需说明命令列表。
如果从属文件中省略了源文件,则make认为源文件的主文件名就是目标文件名。
make的其他功能:文件清理和备份
make clean ---> make ---> make install
make支持宏。宏为变量,用来定义反复使用的字符串,格式:macroname=value,一般放在makefile文件的开头部分,宏调用的格式是$(macroname)或者${macroname}
除了CC(编译器选项)外,make还有两个内置宏,CFLAGS-在编译中额外使用的可选项列表,LDFLAGS-连接器使用的可选项。
在实际的项目开发中要将makefile文件说明所有的目标文件,将是一件非常麻烦的事情,使用ar命令把他们集中到一个库文件中,则会提供很多的方便。ar命令处理归档文件的方式和tar命令一样。ar命令生成的归档文件的扩展名为.a。ar(-crv)命令的可选项:
-r:如果归档文件中没有这个文件,则把它加入到归档文件中,如果已有,则覆盖它
-q:把一个文件添加到归档文件末尾
-x:从归档文件中解压出某个文件
-d:从归档文件中删除某个文件
-t:显示档案文件清单
-v:详细信息显示
使用库文件编译:
cc-o calc_reposit.clibcalc.a -lm
cccalc_deposit.c -lcalc -L"."-lm (由于库文件名字很有规律lib+xxx+.a,可以使用-lxxx,-L说明库文件所在的位置)
-lxxx-表示libxxx.a或者libxxx.so
编译器在/lib和/usr/lib目录中搜索库文件,用户自定义的库需要使用-L说明其位置。
提示:如果创建了很多的库,最好建立一个目录存放。
Make命令可以维护库文件,详细参考makefile3文件。
创建的是一个静态链接库,当程序编译后连接到一个静态链接库,静态库的目标代码插到可执行文件中,多个程序调用同一个文件,引起可执行文件的代码长度急剧增大。
C支持动态链接库,执行时加载,扩展名为.so。其支持程序运行较慢,但是可执行文件小。
5.6版本控制工具–SCCS和RCS
SourceCode Control System(SCCS),Revision ControlSystem(RCS):ci(签入),co(签出),rcs.
UNIX系统专为程序员设计的操作系统:make命令,版本控制系统,调试器(dbx和gdb)。 一些理论就是上面的这些,下一节介绍系统调用。我的学习笔记其实就是抄书打字,别具个人特色的土方法。
参考资料
[1] Unix 原理与应用(第四版),印 Sumitabba Das著 ,吴文国译,清华大学出版社, 2008.1