Linux 产业现状 国内Linux 市场普及度越来越高 银行、证券、电信、邮政、税务、航空等对稳定性、安全性要求颇高的领域应用广(服务器端) 手机软件也用到了 Linux 嵌入式开发平台 桌面市场不成熟
21.
Linux 人才现状 Linux在中国前景光明,但缺少这方面的人才已成为其发展的瓶颈 国内熟练的 Linux 开发人员只有 3000 人左右,而且有很大一部分都是自由软件的爱好者,并没有经过专业的课程培训 根据 EvansData 发表的有关 Linux 开发状况的调查结果,目前 Linux 应用软件开发人员中,有 52% 是从 Windows 应用软件开发领域转行过来的,另外还有 30% 曾经从事过 UNIX 的应用开发
Linux 终端使用基础 Linux 终端也称为虚拟控制台 . 一台计算机的输入输出设备就是一个物理的控制台 . 如果在一台计算机上用软件的方法实现了多个互不干扰独立工作的控制台界面,就是实现了多个虚拟控制台。 Linux 终端的工作方式是字符命令行方式,用户通过键盘输入命令进行操作,可以通过 Linux 终端对系统进行控制。
38.
什么是 shell Shell是一个作为用户与 linux 系统间接口的程序,它允许用户向操作系统输入需要执行的命令 在 linux 中可有多种 shell Linux 是高度模块化的 可用多个 shell 内核 csh bash xwindow 其他程序
39.
shell 的基本形式 shell 的种类 : ash :是贝尔实验室开发的 shell , bsh 是对 ash 的符号链接。 bash :是 GNU 的 Bourne Again shell ,是 GNU 操作系统上默认的 shell 。 sh 以及 bash2 都是对它的符号链接。 tcsh :是 Berkeley UNIX C shell 。 csh 是对它的符号链接
更改 Linux 文件属性命令 u g o a +( 加入 ) -( 除去 ) =( 设定 ) r w x 文件或目录 chmod r=4,w=2,x=1 # chmod 770 test owner = rwx = 4+2+1 = 7 group = rwx = 4+2+1 = 7 others = --- = 0+0+0 = 0
69.
练习 系统中有用户 user1和 user2 ,同属于 users 组。在 user1 用户目录下有一文件 file1 ,它拥有 644 的权限,如果 user2 用户想修改 user1 用户目录下的 file1 文件,应拥有 权限。 A 744 B 664 C 646 D 746
70.
Linux 上的 XWindow 系统 整个 X Window 由三个部分组成: X Server :是控制输出及输入设备并维护相关资源的程序,它接收输入设备的信息,并将其传给 X Client ,而将 X Client 传来的信息输出到屏幕上( 在屏幕上构造方块(窗口),然后画出里面的元素 )。 X Client :是应用程序的核心部分,它与硬件无关,每个应用程序就是一个 X Client 。 X Client 可以是终端仿真器( Xterm )或图形界面程序,它不直接对显示器绘制或者操作图形,而是与 X Server 通信,由 X Server 控制显示。 X protocol : X Client 与 X Server 之间的通信协议。
71.
X 服务程序响应 X客户程序的请求,直接与图形设备通信,负责打开和关闭窗口,控制字体和颜色等底层的具体操作。每一个显示设备只有一个惟一的 X 服务程序。
X Window 的特点 良好的网络支持: X Window 采用了 C/S 网络结构, X Client 和 X Server 可以通过网络来通信,而且有良好的网络透明性。 个性化的窗口界面: X Window 并未对窗口界面作统一的规范,程序员可以根据需求自行设计,其中最有名的就是后面将要介绍的 GNOME 与 KDE 。 不内嵌于操作系统: X Window 只定义了一个标准,而不属于某个操作系统,因此可在不同的操作系统上运行相同的 X Window 软件
74.
在 Mac OS和 Windows ,构件图形界面的功能都做在了操作系统里面,你只能使用那些。这个方法很简单,但是却不灵活。 Unix 和类 Unix 的操作系统没有内建这个功能,要使用 GUI 你就不得不使用窗口系统( X Window )。
75.
GNOME : GNOME项目有两个目标:提供一个完整的、易学易用的桌面环境 -GNOME 桌面环境,为程序设计人员提供强大的应用程序开发环境- GNOME 开发平台,用于建立桌面上的应用。 KDE :其目的是在 X Window 上建立一个与 MacOS 或者微软的 Windows 类似的完整易用的桌面环境,从而使 UNIX 更接近广大普通用户。 KDE 不仅提供了一个方便易用的超级桌面环境,而且还提供了一套免费的计算开发平台。
76.
总结几个概念 DE (Destop Environment ):桌面环境 GNOME 、 KDE (必须在 X Winodw 上运行) 窗口管理器(必须在 X Winodw 上运行) GNOME 的 Enlightenment KDE 的 KVM TWM : Tab Window Manager for the X Window System
77.
注意 X Winodw里的 X Server 只负责显示窗口画面 窗口管理器负责选择在哪里放置窗口、移动、改变大小、最大化、最小化等
GNOME 桌面环境 GNOME 是 GNU 网络对象模型环境( GNU Network Object Model Environment )的缩写,它是 GNU 项目的一部分 GNOME 操作界面由 GNOME 面板( Panel )和桌面组成
80.
GNOME 面板的组成 主菜单:主菜单是系统中所有应用程序的起点。程序启动器:是 Linux 应用程序的启动链接,如同 Windows 中的快捷方式。 工作区切换器: 可以将 GNOME 的桌面分为相互独立的工作区,每个工作区是桌面的一部分 . 窗口列表:窗口列表显示了当前工作区上运行着的应用程序的名称。 通知区域: Red Hat 网络更新通知工具是通知区域的一部分。它提供了一种简捷的系统更新方式,确保系统时刻使用 Red Hat 的最新勘误和错误修正来更新。 插件小程序( Applets ):插件小程序是完成特定任务的小程序。 GNOME 有很多十分有用并且非常有趣的插件小程序,例如,电子邮件检查器、时钟日历、 CPU 和内存情况查看器等。
KDE 桌面环境 KDE 从外表上看同 GNOME 几乎相同,也是由面板和桌面组成 KDE 是遵守 GNU 的自由软件。在 LGPL 下所有 KDE 库都允许开发 KDE 桌面的程序,所 有 KDE 应用程序得到 GPL 许可, KDE 使用 Qt C++ 跨平台工具包 , 有各自的授权。 Qt 的授权允许你免费使用 Qt 来开发 X Windows 下的软件,只要你的原始代码也自由地 被使用。
93.
KDE 桌面环境 如果你希望你的原始代码不允许修改,你必须获得Qt 的商业授权 Qt 是建造使用者接口的 C++ 基类库。它提供大多数 widgets 、菜单、按钮、 sliders 等 等。 Qt 是一个跨平台库,写的代码可在 Unix 编译,也可在 Windows 编译。
vi help h,j,k,l 移动 yy 复制 dd 刪除 p 黏贴 o,i,a 插入 R,r 取代 u 回复 / 查询 :%s/x/y/g 自 动 取代 :w 保存 :q 退出 :wq! 保存 強制 退出
104.
账号 Linux系统的账号分为用户账号和组账号两类: 用户账号:通常一个操作者拥有一个用户账号,每个用户账号有唯一的识别号 UID ( User ID )和自己所属组的识别号 GID ( Group ID )。 Linux 系统中可以有两类用户账号: root 用户和普通用户。 组账号:是一组用户账号的集合。通过使用组账号,可以设置使一组用户对文件具有相同的权限。
存储设备 计算机系统中,所有的存储设备都是以目录树的形式对文件进行管理的 . 在 Linux 系统中,所有的文件都是在以“ /” 目录为根的一棵“大”目录树中进行管理。 如果要使用 USB 存储设备、光盘或软盘等存储设备,必须将这些设备中的“小”目录树像嫁接一样挂载( mount )到 Linux 系统的“大”目录树中。
显卡 首先找到显卡支持 Linux的驱动程序,绝大多数的 3D 显卡都已有了支持 Linux 的驱动程序,用户可以从各显卡厂商的网站或 Linux 的相关站点上去寻找。 如果用户能够进入 X Window ,但是无法使用显卡的特殊功能,那么可以通过图形界面的配置工具配置显卡。 选择【主菜单 / 系统配置 / 显示】,弹出显示设置窗口 。
Web 服务器 Apache 和邮件服务器 Sendmail 、域名服务器 Bind 应用独立守护进程模式启动。 因为这些负载很大服务器上,预先创子服务器,可以通过客户的服务速度。
193.
Xinetd 模式 从守护进程的概念可以看出,对于系统所要通过的每一种服务,都必须运行一个监听某个端口连接所发生的守护进程,这通常意味着资源浪费。为了解决这个问题, Linux 引进了“网络守护进程服务程序”的概念。 Redhat Linux 9.0 使用的网络守护进程是 xinted ( eXtended InterNET daemon )。和 stand - alone 模式相比 xinted 模式也称 Internet Super - Server (超级服务器)。 xinetd 能够同时监听多个指定的端口,在接受用户请求时,他能够根据用户请求的端口不同,启动不同的网络服务进程来处理这些用户请求。 可以把 xinetd 看做一个管理启动服务的管理服务器,它决定把一个客户请求交给那个程序处理,然后启动相应的守护进程。
DNS DNS (Domain Name System )是一个分布式数据库,本地负责控制整个分布式数据库的部分段,每一段中的数据通过客户 / 服务器模式在整个网络上均可存取,通过采用复制技术和缓存技术,在保证整个数据库可靠的同时,又拥有良好的性能。 DNS 的数据库的结构是一个倒立的树状结构,根的名字用空字符串“”来表示,但在文本中用“ .” 来书写。树的每一个节点都表示整个分布式数据库中的一个分区(域),每个域可再进一步划分成子分区(域),每个域都有一个标签( LABEL ),标明了它与父域的关系。在 DNS 中,完整域名是一个从该域到根之间路径上的标签序列,以“ .” 分隔这些标签。
212.
域名解析的工作原理主要由以下几步实现: 客户机将域名查询请求发送到本地 DNS服务器,服务器在本地数据库中查找客户机要求的映射。 如果不能在本地找到客户机查询的信息,将客户机请求发送到根域名服务器。根域名服务器负责解析客户机请求的根域部分,它将包含下一级域名信息的服务器的地址返回给客户机的 DNS 服务器。 客户机的 DNS 服务器利用根域名服务器解析的地址访问下一级 DNS 服务器,得到维护再下一级域名的 DNS 服务器的地址。 按照上述方法递归地逐级接近查找目标,最后在维护目标域名的 DNS 服务器上找到相应的 IP 地址信息。 客户机的本地 DNS 服务器将查询结果返回客户机。 客户机利用从本地 DNS 服务器查询得到的 IP 地址访问目标主机。
演示 $ IFS=‘’$ set foo bar bam $ echo “$@” foo bar bam $ echo “$*” foobarbam $ unset IFS $ echo “$*” foo bar bam
243.
演示 #!bin/sh sa="Hello"echo $sa echo "the program $0 is now running" echo "the second parameter was $2" echo "the first parameter was $1" echo "the parameter list was $*" echo "the user's home directory is $HOME" echo "please enter a new word" reas sa echo $sa echo "the script is now complete" exit 0
for 循环 格式说明: “ 列表”为存储了一系列值的列表,随着循环的进行,变量从列表中的第一个值依次取到最后一个值; do 和 done 之间的命令通常为根据变量进行处理的一系列命令,这些命令每次循环都执行一次; 如果中括号中的部分省略掉, Bash 则认为是“ in $@” ,即执行该程序时通过命令行传给程序的所有参数的列表。 for 变量 [in 列表 ] do 命令(通常用到循环变量) done
while 循环与 until循环 格式: 说明: while 循环中,只要条件为真,就执行 do 和 done 之间的循环命令; until 循环中,只要条件不为真,就执行 do 和 done 之间的循环命令,或者说,在 until 循环中,一直执行 do 和 done 之间的循环命令,直到条件为真; 避免生成死循环。 while/until 条件 do 命令 done
函数对变量的访问示例 即变为下一个变量 变量左移,$1 变为原来 $1 的右侧的变量 变量计数加 1 输出第一个变量 访问变量 $1, 即第一个变量 函数开始 ...... } done shift let count=$count+1 echo "Parameters(\$$count) is:$1" do while [ -n "$1" ] ...... { function demo_fun() 利用 shift 访问参数变量
271.
实验任务一 设计一个菜单驱动程序。如下:Use one of the following options: P: To display current directory S: To display the name of running file D: To display today’s date and present time L: To see the listing of files in your present working directory W: To see who is logged in Q: To quit this program Enter your option and hit : 菜单程序将根据用户输入的选择项给出相应信息。要求对用户的输入忽略大小写,对于无效选项的输入给出相应提示。 要求使用 case 语句实现以上功能,输入响应的字母后应该执行响应的命令完成每项功能,如输入 P 或 p ,就执行 pwd 命令。
格式 crontab [ - u user ] 文件 crontab [ - u user ] { - l | - r | - e } 主要参数 - e :执行文字编辑器来设定时程表,内定的文字编辑器是 vi - r :删除目前的时程表 - l :列出目前的时程表 和 at 命令相比, crontab 命令适合完成固定周期的任务
282.
Crontab 举例 以某一用户终端,输入crontab - e 此时系统会打开一个 vi 编辑器 在该编辑器中输入 35 17 * * 5 wall "Tomorrow is Saturday I will go CS"
\< 锚定单词的开始,如:'\<grep' 匹配包含以 grep 开头的单词的行。 \> 锚定单词的结束,如 'grep\>' 匹配包含以 grep 结尾的单词的行。 x\{m\} 重复字符 x , m 次,如: '0\{5\}' 匹配包含 5 个 o 的行。 x\{m,\} 重复字符 x, 至少 m 次,如: 'o\{5,\}' 匹配至少有 5 个 o 的行。 x\{m,n\} 重复字符 x ,至少 m 次,不多于 n 次,如: 'o\{5,10\}' 匹配 5--10 个 o 的行。 \w 匹配文字和数字字符,也就是 [A-Za-z0-9] ,如: 'G\w*p' 匹配以 G 后跟零个或多个文字或数字字符,然后是 p 。 \W \w 的反置形式,匹配一个或多个非单词字符,如点号句号等。 \b 单词锁定符,如 : '\bgrep\b' 只匹配 grep 。
299.
$ ls -l| grep '^a' 通过管道过滤 ls -l 输出的内容,只显示以 a 开头的行。 $ grep 'test' d* 显示所有以 d 开头的文件中包含 test 的行。 $ grep 'test' aa bb cc 显示在 aa , bb , cc 文件中匹配 test 的行。 $ grep '[a-z]\{5\}' aa 显示所有包含每个字符串至少有 5 个连续小写字符的字符串的行
主要内容 gcc 简介功能 命令 利用 gcc 编译 c 程序 利用 make 工具简化编译过程 make 简介 Makefile 基本格式 调试 静态调试 动态调试 gdb 调试工具的使用
306.
gcc 简介 名称:G NU project C and C ++ C ompiler G NU C ompiler C ollection 管理与维护 GNU 项目 对 C/C++ 编译的控制 预处理( Preprocessing ) 编译( Compilation ) 汇编( Assembly ) 链接( Linking )
调试举例 错误信息: 错误记录格式:文件名:行好:错误描述 my_app.c: In function `main': my_app.c:6: `n' undeclared (first use in this function) my_app.c:6: (Each undeclared identifier is reported only once my_app.c:6: for each function it appears in.) my_app.c:9: parse error before "greeting" my_app.c:6: warning: unused variable `name'
326.
静态调试举例 分析、定位错误(警告): my_app.c的第 6 行: 描述含义: n 是一个没有声明的变量; 分析: 声明数字 name 时用到了变量 n ,但变量 n 在之前没有声明; 改正: 声明一个新变量 n ; 或者 将 n 改为宏 N 这里取第 2 种改正方法;
327.
静态调试举例 my_app.c 的第9 行: 描述含义: 在“ greeting” 之前出现解析错误; 分析: c 中每行程序以;结束,第 9 行 greeting 之前的程序行没有以;结束; 改正: 第 8 行末尾增加“;” 重新编译 错误信息: my_app.c: In function `main': my_app.c:11: warning: control reaches end of non-void function
328.
静态调试举例 分析、定位错误(警告): 警告:my_app.c 的 11 行 描述含义: 控制以非空函数结束; 分析: main 函数返回类型为 int ,源程序没有以 return 整数 形式结束; 改正: 将 main 改为返回 void 类型; 或者: 在 main 程序后增加 return 返回语句; 采用第 2 种解决方式; 重新编译,无错误或警告信息,完成静态调试
动态调试举例 对静态调试中的例子继续进行动态调试 工具:gdb 启动 gdb $gdb GNU gdb Red Hat Linux (5.3post-0.20021129.18rh) Copyright 2003 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux-gnu". (gdb) 启动命令 启动提示 启动完毕
333.
动态调试举例 调试指定程序( ./my_app) 问题: 期望的输出和实际输出不一致 (gdb) file ./my_app Reading symbols from ./my_app...done (gdb) run Starting program: /home/tom/shell_script/cpp/my_app/my_app Your Name,Please: tom Hello ! Program exited normally. (gdb) 加载调试程序 启动调试程序 程序输出 提示信息
X 窗口 X服务器 运行在用户的本地机器上,在屏幕上完成低层的绘图操作 X 客户端 是以 X 窗口系统作为 GUI 的任何程序,它等候 X 服务器传送的用户事件,然后通过给 X 服务器发送重绘消息来响应 X 协议 X 服务器和 X 客户端之间的通讯协议 Xlib 库 是 X 客户端间接用于产生 X 协议消息的库,它提供一个非常底层的 API 、允许客户端在 X 服务器上绘出非常基本的元素
344.
X 工具包 X工具是一个 GUI 库, X 客户端用它极大地简化了窗口、菜单、按钮等的创建 其他平台无关的窗口 API JAVA 语言使用 swing 和 AWT API 来支持 GUI 程序设计 Tcl/Tk 脚本语言
345.
Gtk +的作用 Gtk+工具包在 XWindows 中的作用 是 Xlib 之上更高层的开发工具包,它们将底层的 Xlib 的 API 进行封装,提供更高级的接口,达到降低开发难度,提高开发效率的目的。 网络协议 X 客户端(应用程序) X 工具包、 Gtk+,Qt XLib X 客户端(应用程序) X 工具包、 Gtk+,Qt XLib X 服务器 设备驱动程序
#include <time.h> #include<stdio.h> #include <unistd.h> int main() { int i; time_t thetime; for (i=1;i<=10;i++) { thetime=time((time_t *)0); printf("the time is %ld \n",thetime); sleep(2); } exit(0); }
392.
gmtime 函数 structtm *gmtime(const time_t timeval) tm 的结构 Int tm_sec Int tm_min Int tm_hour Int tm_mday Int tm_mon Int tm_year Int tm_wday 星期几 Int tm_yday Int tm_isdst 是否夏令时
393.
#include <time.h> #include<stdio.h> int main() { struct tm *tm_ptr; time_t thetime; (void)time(&thetime); tm_ptr=gmtime(&thetime); printf("raw time is %ld \n",thetime); printf("gmtime gives:\n"); printf("date: %02d/%02d/%02d\n",tm_ptr->tm_year,tm_ptr->tm_mon+1,tm_ptr->tm_mday); printf("time: %02d:%02d:%02d\n",tm_ptr->tm_hour,tm_ptr->tm_min,tm_ptr->tm_sec); exit(0); }