深圳嵌云预科讲义
Linux系统概述和安装
1.1UNIX操作系统发展历程
UNIX操作系统,是美国AT&T公司于1971年在PDP-11上运行的操作系统。具有多用户、多任务的特点,支持多种处理器架构,最早由肯·汤普逊(Kenneth Lane Thompson)、丹尼斯·里奇(Dennis MacAlistair Ritchie)于1969年在AT&T的贝尔实验室开发。
1965年时,贝尔实验室(Bell Labs)加入一项由通用电气(General Electric)和麻省理工学院(MIT)合作的计划;该计划要建立一套多使用者、多任务、多层次(multi-user、multi-processor、multi-level)的MULTICS操作系统。直到1969年,因MULTICS计划的工作进度太慢,该计划被停了下来。
1970年,UNIX元年。
1971年,UNIX第一版。
1972年,UNIX第二版。
1973年,UNIX第三版。此时,Dennis Ritchie改良B(Basic Combined Programming Language)语言,就是今天的C语言。Ken Thompson与Dennis Ritchie成功地用C语言重写了UNIX的第三版内核。Ken Thompson被称为UNIX之父。
1979年UNIX的版本V7开始,UNIX的许可证开始禁止大学使用UNIX 的源码,包括在授课中学习。
UNIX的商标权由国际开放标准组织(The Open Group)所拥有,只有符
合单一UNIX规范的UNIX系统才能使用UNIX这个名称,否则只能称为类UNIX(UNIX-like)。
1.2Linux历史
1.2.1GNU组织
GNU是“GNU's Not Unix”的递归缩写。GNU计划,是由Richard Stallman 在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。
为保证GNU软件可以自由地“使用、复制、修改和发布”,所有GNU软件都有一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款,GNU通用公共许可证(GNU General Public License,GPL)。即“反版权”(或称Copyleft)概念。
1985年Richard Stallman又创立了自由软件基金会(Free Software Foundation)来为GNU计划提供技术、法律以及财政支持。
到了1990年,GNU计划已经开发出的软件包括了一个功能强大的文字编辑器Emacs[1]。GCC(GNU Compiler Collection,GNU编译器集合),是一套由GNU开发的编程语言编译器。以及大部分UNIX系统的程序库和工具。唯一依然没有完成的重要组件就是操作系统的内核(称为HURD)。
1991年Linus Torvalds编写出了与UNIX兼容的Linux操作系统内核并在GPL条款下发布。Linux之后在网上广泛流传,许多程序员参与了开发与修改。1992年Linux与其他GNU软件结合,完全自由的操作系统正式诞生。
该操作系统往往被称为“GNU/Linux”或简称Linux。
1.2.2Linux诞生
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于
POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
1991年10月5日是第一次正式向外公布的时间,也是Linux的诞生日。
1.3Linux系统安装
1.3.1VMware Workstation虚拟机安装
上课演示。
1.3.2Ubuntu Linux安装
上课演示。
1.3.3GNOME桌面环境介绍
上课演示。
Linux常用命令
2.1命令行格式
在Linux操作系统中,一个命令通常由命令名、命令选项和命令参数3部分内容组成,中间以空格或制表符等空白符隔开。命令形式如下:
命令名[命令选项][命令参数]
例如:ls-a/home或ls/home-a
Tips:命令选项通常是以“-”开始的单个字符。以“--”为起始标志的命令是GNU选项。
2.2命令历史
Linux下shell均支持命令历史机制。
#fc-l1020
#fc-e vim1020
#fc-s100
#history10
#history-c
2.3重复执行之前的命令
#ls-l
#!l
2.4命令行补全
#hist->[tab]
2.5命令别名
#alias c=’clear’
#unalias c//取消别名
2.6命令查询
1.which命令
#which ls
2.whereis命令
#whereis ls
3.apropos命令
#apropos ls
4.what命令
#what ls
2.7常用命令
ls列出文件名
rm删除文件
cd转换目录
cat显示文本文件
cp复制文件
mv移动文件
mkdir创建目录
rmdir删除目录
file查看文件类型
echo显示文本
date显示时间和日期
tar归档和展开文件
pwd显示当前工作目录的绝对路径
软件管理和samba服务器安装
3.1Linux软件管理
利用apt-get管理软件包
Ubuntu下载软件的地址存放在:/etc/apt/sources.list文件里面。
软件索引文件存放在:/var/lib/apt/lists
索引文件获取命令:apt-get upgrade和apt-get
dist-upgrade
下载的deb包存放目录:/var/cache/apt/archives
常用的APT命令参数
apt-cache search package搜索包
apt-cache show package获取包的相关信息,如说明、大小、版本等
sudo apt-get install package安装包
sudo apt-get install package--reinstall重新安装包
sudo apt-get-f install修复安装"-f=--fix-missing"
sudo apt-get remove package删除包
sudo apt-get remove package--purge删除包,包括删除配置文件等
sudo apt-get update更新源
sudo apt-get upgrade更新已安装的包
sudo apt-get dist-upgrade升级系统
sudo apt-get dselect-upgrade使用dselect升级
apt-cache depends package了解使用依赖
apt-cache rdepends package是查看该包被哪些包依赖
sudo apt-get build-dep package安装相关的编译环境
apt-get source package下载该包的源代码
sudo apt-get clean&&sudo apt-get autoclean清理无用的包
sudo apt-get check检查是否有损坏的依赖
3.2文件的压缩和解压
Linux下压缩解压命令是tar,用法如下:
归档:
$tar cvf example.tar a.c b.c abc.txt dir/
$tar-tf example.tar
$tar xvf example.tar
$tar xvf example.tar-C/opt/
压缩:
$tar czvf example.tar.gz a.c b.c apple.txt dir/
$tar xzvf example.tar.gz
$tar xzvf example.tar.gz-C test/
$tar cjvf example.tar.bz2 a.c b.c apple.txt dir/ $tar xjvf example.tar.bz2
$tar xjvf example.tar.bz2-C test/
3.3samba简介
SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。通过设置“NetBIOS over
TCP/IP”使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源。
3.4安装
$sudo apt-get install samba
$sudo apt-get install samba-common
$sudo apt-get install samba-common-bin
$sudo apt-get install system-config-samba
3.5配置
$sudo system-config-samba
3.6启动
$sudo smbd start
$sudo/etc/init.d/smbd restart
3.7卸载
$sudo apt-get remove samba-common
$sudo apt-get remove samba
$sudo apt-get remove smbclient
C语言基础
3.1C语言起源
1960年出现了一种面向问题的高级语言ALGOL60。
1963年英国剑桥大学推出了CPL(Combined Programming Language)语言,后来经简化为BCPL语言。
1970年美国贝尔(Bell)实验室的K.Thompson以BCPL语言
为基础,设计了一种类似于BCPL的语言,取其第一字母B,称为B语言。
1972年美国贝尔实验室的Dennis.M.Ritchie为克服B语言的诸多不足,在B语言的基础上重新设计了一种语言,取其第二字母C,故称为C语言。
1980年贝尔实验室的Bjarne Stroustrup对C语言进行了扩充,推出了“带类的C”,多次修改后起名为C++。以后又经过不断的改进,发展成为今天的C++。
1983年,美国国家标准协会(ANSI)为C制订的工业标准,称之为ANSI C。
关于ISO C89和ISO C99
1990年和1999年,国际标准化组织(ISO)两次为C语言制订的标准。
POSIX标准
UNIX世界中最流行的API是基于POSIX标准的,POSIX是LINUX前进的灯塔,glibc库是遵循POSIX标准的典型代表。GNU C
LINUX内核开发者使用的C语言涵盖了ISO C99标准和GNU C 扩展特性,GNU C扩展特性包括内联函数、内联汇编、分支声明等。
标准C库
库函数是对系统调用的进一步封装,旨在为应用层程序提供
一致的编程接口,也就是通常所说的API。
3.2C语言概述
3.2.1C语言的一个简单实例
#include
int main(void)/*一个简单的C程序*/
{
int num;/*定义一个名为num的变量*/
num=1;/*为num赋一个值*/
printf(“num=%d\n”,num);/*使用printf()函数*/
return0;
}
3.2.2实例说明
一.LINUX C编程风格
1、适当的空行和空格,空行一般可以出现在逻辑块之间。
2、一定要有缩进,代码块中的代码一定要缩进,无论是函数体、循环体、switch多路分支和普通复合语句。(注意,C语言是一种“自由体”语言,程序中的所有空白符都与逻辑无关,只起排版作用,因此空行缩进等格式对语法来说不是必须的)
3、适当的注释,程序具有一定逻辑和算法复杂度的时候,在关键的地方做好注释。写注释是一种修养。(注意,注释要写代码的功能,而不是其原理)
4、LINUX C风格中的函数名和变量名一般用小写字母加下划线,比如变量apple_tree,而不是像在其他平台中会用到诸如AppleTtree这样的变量名或者函数名。(当然常量通常用大写字母表示)
最好按照规范写代码,代码不仅自己将来要看,而且经常是要给别人看的,不要自成一体。
二.关于主函数
int main(void){…}good
int main(int argc,char**argv){…}good
main(){…}bad
void main(){…}bad
三.头文件
#include
头文件的作用相当于您在文件中该行所在位置键入了文件stdio.h的完整内容。#include语句是C预处理指令的一个例子。
四.声明
int num;
程序中的这一行叫做声明语句(declaration statement),这个句话做了两件事情:
1.在函数中声明了一个叫做i的变量,在恰当的位置我们
就可以使用它;
2.int说明了这个变量是一个整数。编译器使用这个信息
为变量i在内存中分配一个合适的存储空间。
变量规范:
只能以字母或下划线开头,变量里面可以有数字。
参见下表:
正确的字错误的字
wiggles$Z]**
cat22cat
Hot_Tub Hot-Tub
taxRate tax rate
_kcab don’t
五.赋值
num=1;
这行程序是一个赋值语句(assignment statement)。赋值语句的复制顺序是从右到左的。
六.函数
printf(“num=%d\n”,num);
printf是C语言的一个标准函数,其后面紧跟着的一对圆括号()表明printf是一个函数名,括号里的内容是从main 函数传到函数printf的信息,这些信息称之为参数(arguments)。
换行符‘\n’是转义字符(escape sequence)的一个例子,转义字符通常用于代表难于表达的或是无法键入的字符。比如\t表示制表符,\b表示退格键等等。
七.return
return语句是程序的最后一个语句。在int main(void)中int表示main函数返回值应该是一个整数。C标准要求main
函数这么做。
return语句出现在普通函数中时,表示返回其调用者处,return语句出现在main函数中时,表示退出整个进程。
八.关键字和保留字
auto enum restrict unsigned
break extern return void
case float short volatile
char for signed while
const goto sizeof_Bool
continue if static_Complex
default inline struct_Imageinary
do int switch
double long typedef
else register union
3.3gcc编译器的使用
1.写一个c程序
2.分步编译链接
生成预编译文件:
$gcc–E example.c–o example.i
生成汇编文件
$gcc–S example.i–o example.s
生成目标代码
$gcc–c example.s–o example.o
链接
$gcc example.o-o example–lc
3.4头文件
1.使用尖括号:编译的时候会直接到系统的标准路径(/usr/include)下找你要的那个文件。
2.使用双引号:编译的时候会先在当前目录下找你要的那个文件,如果找不到,那么再到系统的标准路径(/usr/include)下找你要的那个文件。