大三上chap1linux操作系统基础_第1页
大三上chap1linux操作系统基础_第2页
大三上chap1linux操作系统基础_第3页
大三上chap1linux操作系统基础_第4页
大三上chap1linux操作系统基础_第5页
已阅读5页,还剩262页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章Linux操作系统基础戴瑾南大金陵学院信息科学与工程系主要内容2Linux系统概况Linux系统安装Linux系统环境Linux用户管理命令Linux文件操作命令Linux网络管理命令Linux系统信息命令初识Linux3类Unix(Unix-like)操作系统其他类UNIX系统包括Solaris、Mac

OS等基于GPL(GNU

Public

License)的自由操作系统第一个版本发行于1991年主要用C语言编写,部分代码用汇编语言编写“Linux”在不同语境下的内涵不同Linux内核、Linux系统、Linux开发套件等严格来说,Linux指由LinuxTorvalds维护(及通过主要镜像网站发布)的内核Linux简介初识Linux4一个系统多个桌面GNOME,KDE等主要发行版本Red

Hat

EnterpriseFedoraSUSEUbantuRed

FlagLinux系统概况Linux发展史51991年11月,芬兰赫尔辛基大学的Linus

Torvalds编写了一个小程序(取名为Linux),发布在互联网上希望借此实现一个操作系统“内核”1993年一批高水平网络黑客参与,诞生Linux

1.0

版1994年Linux的第一个商业版Slackware问世1996年美国国家标准技术局计算机系统实验室确认Linux版本1.2.13符合POSIX标准2001年Linux2.4版内核发布2003年Linux2.6版内核发布2011年Linux3.0版内核发布Linux简介Linux精髓

LINUX应用系统6Linux代表一种开源文化免费软件,开放源代码自由软件,你可以在原有程序基础上开发自己的程序GNU/LinuxLinux仅指Linux内核Linux系统的大部分应用都建立在GNU软件之上促进了软件的发展核心结构LINUX内核LINUX

SHELLLINUX文件系统Linux系统概况Linux的内核版本Linux内核版本指由Linux开发小组(LinusTorvalds总协调)开发出系统内核的版本号Linux内核采用双树系统一棵是稳定树,主要用于发行另一棵是非稳定树(开发树),用于产品开发和改进Linux内核版本号由3位数字组成r.x.y第1位数字r为主版本号第2位数字x为说明版本类型的次版本号:偶数表示产品化版本第3位数字y为修改号,表示错误修补的次数奇数表示实验版本7Linux简介Linux的内核特点Linux是单内核、多模块系统Linux内核运行在单独的内核地址空间所有操作系统功能作为一个模块实现在其内核中模块均运行在内核态,直接调用函数,无需消息传递具备模块化设计、抢占式内核(Linux

2.6支持,Linux

2.4用户级抢占)、支持内核线程及动态装载内核模块的能力与Unix主要区别Linux汲取了微内核设计思想(基于模块定制内核)Unix也是单内核系统Windows

NT和Mach是微内核系统只提供基础功能,其他功能通过服务实现微内核功能被划分为多个独立过程,每个过程称为服务器Linux简介Linux单内核结构用户态标准函数库系统调用(POSIX标准)接口模块内核(进程管理、存储管理、文件管理、设备管理、网络

管理)设备驱动计算机硬件核心态单内核模块接口驱动接口应用程序Linux9简介主流的Linux发行版本Linux简介10Linux与Windows的区别11文件系统Linux需要一个挂载根目录/的ext分区和一个作为虚拟内存的swap分区Linux没有盘符,可通过设备名挂载,挂在信息在/dev/fstab,如mount

-t

ntfs

/dev/sda1

/mnt/win_cLinux将所有设备都映射成/dev目录下的一个文件用户管理系统管理员是root,使用su命令切换Linux简介Linux特点12多用户多任务图形用户接口硬件支持网络连接网络服务器应用支持Linux系统概况Linux操作系统特征13符合POSIX标准规范的操作系统Portable

Operation

System

Interface

of

Unix:可移植的操作系统接口由IEEE开发,ANSI和ISO标准化具备现代操作系统的基本功能抢占式多任务处理,支持多用户图形用户接口异构硬件支持支持SMP支持TCP/IP多体系结构支持,支持32/64位CPU主要发行版本RedHat

Enterprise、Fedora、Ubuntu、Red

FlagLinux系统概况Linux的常用软件14办公软件浏览器FireFox即时通讯GaimQQ使用LumaQQ或Eva播放音乐XMMS若需支持MP3,需加插件文本编辑geditFTP下载gftpLinux系统概况Linux下开发工具15命令行界面vi编辑器命令模式和插入模式,通过a、i、Esc切换插入模式可以输入文件内容命令模式可以使用命令来操纵文件Linux系统概况vi编辑器命令状态下的光标移动命令16方向键:移动光标w:移动光标到下一个单词b:移动光标到前一个单词0或^:移动光标到行首$:移动光标到行尾H:移动光标到屏幕左上角M:移动光标到屏幕中间行第一个字符L:移动光标到屏幕左下角G:移到最后一样gg或1G:移到第一行Linux系统概况vi编辑器命令状态下的文本编辑命令17x:删除光标所在位置字符X:删除光标前一位置字符dw:删除到单词尾d$:删除到行尾d0:从行首删除之当前位置dd:删除当前行Linux系统概况vi编辑器命令状态下的文件保存命令18Zz或:wq:保存当前文件,退出vi:w:保存当前文件,继续编辑:q:当文件未做改动时,退出:q!:退出而不保存Linux系统概况Linux的编程工具19编辑工具vi,

emacs编译、链接gcc,

g++make命令调试gdb版本控制工具CVS等Linux系统概况Linux中的shell20与Windows下的cmd类似提供了一个运行程序、管理文件系统、编译程序代码、管理计算机的途径Shell比GUI功能强大得多常用的ShellKornBourneCBash(缺省值)普通用户提示符$,root提示符#Linux系统概况Linux用户管理21Linux是一个多用户的操作系统注册用户要使用Linux系统资源,首先必须登录系统使用完系统后,必须退出系统Linux将用户分为普通用户和超级用户超级用户(root)一般使用超级用户帐号完成一些系统管理的工作普通用户一般的Linux使用者均为普通用户Linux系统概况程序设计角度的Linux结构Linux22系统概况主要内容23Linux系统概况Linux系统安装Linux系统环境Linux用户管理命令Linux文件操作命令Linux网络管理命令Linux系统信息命令Linux的安装流程24选择语言、键盘及鼠标类型创建分区设置启动顺序配置网络配置用户及验证信息选择安装软件包配置X窗口安装软件包创建启动盘Linux系统安装Linux安装过程—语言选择Linux25系统安装Linux安装过程—键盘配置Linux26系统安装Linux安装过程—鼠标配置Linux27系统安装Linux安装过程—安装方式Linux28系统安装Linux安装过程—安装类型Linux29系统安装Linux安装过程—磁盘分区方式Linux30系统安装Linux安装过程—为系统分区Linux31系统安装Linux安装过程—添加分区Linux32系统安装Linux安装过程—分区基本原则Linux33系统安装Linux安装过程—分区基本要求34至少创建两个分区根分区(/):至少750MB,推荐1.5G或以上交换分区(Swap):推荐大小为内存的两倍推荐创建/boot分区:16MB可选分区/usr,

/usr/local,

/var,

/tmp,

/opt,

/home分区工具默认工具:fdisk各发行版还可有自己的分区程序Linux系统安装Linux安装过程—引导程序Linux35系统安装Linux安装过程—启动装载器36启动装载器加载Linux内核可将启动参数(如设备信息)传递到Linux内核可选择加载一个初始化根盘可以启动其操作系统常用启动装载器LILO:

Linux

LoaderGRUB:

Grand

Unified

Boot

LoaderLinux系统安装Linux安装过程—启动装载器(续)LILO根据配置文件配置MBR语法:lilo[-v][-v][-Cconfig-file][-t]配置文件:/etc/lilo.confGRUB存储在MBR

和/boot/grub中的程序了解文件系统结构不必与LILO一样来激活某个配置文件配置文件位于/boot/grub/grub.conf通过grub-install

安装到MBRLinux37系统安装Linux安装过程—MBR主引导记录,硬盘的第一扇区,长度为512字节第一部分为引导区,占446个字节第二部分为分区表(64个字节),记录硬盘的分区信息Linux38系统安装Linux安装过程—启动过程Linux39系统安装Linux安装过程—启动过程说明打开PC的电源BIOS开机自检按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序

lilo或grub开始引导Linux内核的引导执行init程序启动getty,打开了终端供用户登录系统用户登录成功后进入了ShellLinux40系统安装Linux安装过程—网络配置Linux41系统安装Linux安装过程—防火墙Linux42系统安装Linux安装过程—附加语言支持Linux43系统安装Linux安装过程—时区选择Linux44系统安装Linux安装过程—设置根口令Linux45系统安装Linux安装过程—选择软件包组Linux46系统安装Linux安装过程—准备安装47此时,应该看到一个安装RedHatLinux做准备的屏幕。当重新引导系统后,一份完整的安装日志可在/root/install.log

中找到,以备今后参考要取消安装进程,按计算机的重新启动按钮,或者使用[Control]-[Alt]-[Delete]

组合键来重启计算机Linux系统安装Linux安装过程—安装软件包Linux48系统安装Linux安装过程—创建引导盘Linux49系统安装Linux安装过程—配置显示器Linux50系统安装Linux安装过程—定制图形化界面Linux51系统安装主要内容52Linux系统概况Linux系统安装Linux系统环境Linux用户管理命令Linux文件操作命令Linux网络管理命令Linux系统信息命令Linux系统的文件系统结构/:文件系统结构的起始点/home:用户主目录/bin:标准指令和工具程序/usr

:系统使用文件和指令/usr/bin:用户命令和工具程序/usr/sbin:系统管理员命令/usr/lib:编程语言库/usr/doc:Linux文档/usr/man:在线联机帮助手册/usr/spool:假脱机文件/sbin:管理员开启系统的命令/var:时变文件,例如邮箱文件/dev:设备文件接口/etc:系统配置文件及其它系统文件53Linux系统环境文件系统的概念54文件系统磁盘上有特定格式的一片区域文件文件系统中存储数据的一个命名的对象目录其中包含许多文件项目的一类特殊文件子目录被包含在另一个目录中的目录,包含子目录的目录称为父目录文件名用来标识文件的字符串,保存在一个目录文件项中路径名“/”字符结合在一起的一个或多个文件名的集合。它指定一个文件在文件系统中的位置Linux系统环境文件结构55无论文件是一个程序、一个文档、一个数据库、或是一个目录,操作系统都会赋予它下面的结构索引节点(I节点)包含有关相应文件信息(文件权限、文件主、文件大小等)的一个记录数据文件的实际内容Linux系统环境文件名命名规则56包含大写键、小写键、数字、#、@、_不包含空格不包含以下字符:*

?

>

<

/ ;

$

\ ‘

“不能以“+”或者“-”开头区分大小写最长文件名:255Linux系统环境文件类型57普通文件:包含各种长度的字符串文本文件:由ASCII字符构成数据文件:由来自应用程序的数字型和文本型数据构成,如电子表格、数据库等可执行的二进制程序:由机器指令和数据构成目录文件:由成对的“I节点号/文件名”构成

I节点号是检索I节点表的下标,I节点存放所有文件的状态信息文件名是给一个文件分配的文本形式的字符串,用来标识文件设备文件:/dev/tty1连接文件:存放文件系统中通向文件的路径file文件名Linux系统环境用户登录系统58系统启动后,输入用户名并键入回车键。如:login:

root输入用户口令,输入的口令不会在屏幕上显示出来。如果输入的口令有误,屏幕提示下列信息:login

incorrectlogin:执行上述两步后,如果屏幕显示系统提示符,如:[root@loclhost

root]

#说明已经成功登录到系统中,可以进行操作Linux系统环境远程登录系统59用户远程登录机群普通用户通过telnet从机群外部登录到机群结点,首先要通过机群系统管理员建立帐户管理员通过rlogin登录通过ssh命令在机群内部由于每个普通用户帐户都是一个全局NFS帐户,可以通过rsh在机群内部进行访问举例telnet

VIP(VIP为机群系统对外的IP地址,由用户设定该IP)Login:

team01Password:******rsh

node161(通过rsh访问机群内部的其他结点,node161为机群内结点的主机名)Linux系统环境退出系统60用户使用Linux系统之后,要退出系统的过程称为

“注销”方法有三种键入:exit按:Ctrl+D(相当于执行exit)logoutLinux系统环境关闭系统61必须由超级用户在shell提示符下,键入关闭命令系统将完整地执行关闭所有进程释放占用资源,停止运行切断电源关闭系统的命令[root@loclhost

/root]

#

shutdown

–h

now[root@loclhost

/root]

#

halt[root@loclhost

/root]

#

init0[root@loclhost

/root]

#

poweroffLinux系统环境关闭系统注意事项62Linux系统有一个磁盘缓存区这个缓存区不是立即将所有数据写入磁盘的而是隔段时间后,再将数据写入磁盘随手关掉电源可能会导致缓存没有回写,磁盘上的文件系统不完整Linux的多任务系统可能有许多程序正置于后台运行只有通过正确的关机顺序,才可以保证所有的后台进程都能保存自己的数据Linux系统环境关闭系统63重启系统reboot

命令shutdown-r

<time>

命令组合键Ctrl+Alt+Del(只适用于控制台下)shutdown命令语法:shutdown

[flag]

<time>

[warning

message]flag:-r

重启-h

关机-k

不关机,只发消息time:绝对时间:hh:mm相对时间:+mm(分钟)立刻关机:now(=+0)Linux系统环境Linux系统的用户视图文件子系统用户硬件控制硬

件内核Shell用户用户用户高级语言和实用程序系统调用进程

管理

子系统进程间通信存储管理调度程序字符设备块设备设备驱动程序高速缓存核外程序Linux64编程环境C程序员的系统视图Linux65编程环境系统调用与函数库66系统调用Linux内核的对外接口用户程序和内核之间唯一的接口函数库依赖于系统调用标准函数库建立在系统调用的上层,提供的功能比系统调用强,使用也比较方便静态库(.a文件)动态库/共享库(.so文件)Linux编程环境Linux支持的编程语言67高级编程语言C/C++,

Java,

Fortran…ELF二进制格式Executable

and

Linkable

Format工具接口标准委员会(TIS)选择ELF体系作为不同操作系统之间可移植的二进制文件格式脚本Shell:

sh/bash,

csh,

kshPerl,

Python,

tcl/tk,

sed,

awk…Linux编程环境文件名后缀68.c必须被预处理的C源代码.i无需预处理的C源代码.cc

.cp

.cpp.CPP.c++

.C

.cxx必须被预处理的C++源代码.ii无需预处理的C++源代码.h必须转换成预编译头文件的C

/C++头文件.H

.hh必须转换成预编译头文件的C++头文件.s汇编代码.S必须被预处理的汇编代码.o目标文件.a静态库文件(归档文件).so动态库文件(动态对象)Linux编程环境集成环境69集成开发环境IDEEmacs/xemacsKdevelopEclipse命令行开发环境编辑器vi/vim/gvim,

emacs/xemacs,

pico代码阅读器source

navigator,vi/emacs+

ctags/etags配置工具automake,

autoconf,

…Linux编程环境GNU开发工具70GCCGNU

C编译器Binutils辅助GCC的主要软件GDBGNU调试工具gdb调试命令二进制代码工具as,

ld,

ar,

ldd…MakeCVS版本控制Linux编程环境GCC71GCC不只是一个C编译器GCC

=

GNU

Compiler

CollectionGCC支持多种高级语言的编译C、C++ADAObject

CJAVAFortranPASCALLinux编程环境GCC工具72cpp预处理器GNU

C编译器在编译前自动使用cpp对程序进行预处理gcc符合ISO等标准的C编译器g++基本符合ISO标准的C++编译器gcjGCC的java前端gnatGCC的GNU

ADA

95前端Linux编程环境GNU工具—gcc73是一个强大的工具集合,包含预处理器、编译器、汇编器、链接器等组件由输入文件类型和传递的参数决定gcc具体调用的组件为开发者提供足够多的参数,可让开发者全面控制代码的生成gcc下的C程序编译过程预处理编译成汇编代码汇编成目标代码链接Linux编程环境gcc使用举例源程序Linux74编程环境gcc使用举例编译和运行参数-o:指定目标名称(缺省gcc编译出来的文件是a.out)参数-ansi:关闭GNU

C中与ANSI

C不兼容特性,激活

ANSI

C专有特性包括禁止一些asm

inline

typeof关键字,以及UNIX,vax等预处理宏编译运行Linux75编程环境gcc的工作过程使用-v选项,可看到许多被隐藏的信息Linux76编程环境预处理使用-E参数激活预处理,输出文件的后缀为“.cpp”gcc

–E

–o

gcctest.cpp

gcctest.c使用wc命令比较预处理后的文件与源文件,可以看到两个文件的差异77Linux编程环境行数单词数字节数预编译wc命令示例78Linux编程环境编译成汇编代码79预处理文件汇编代码使用-x参数说明根据指定的步骤进行工作cpp-output指明从预处理得到的文件开始编译使用-S说明生成汇编代码后停止工作gcc

–x

cpp-output

–S

–o

gcctest.s

gcctest.cpp也可以直接编译到汇编代码gcc

–S

gcctest.cLinux编程环境编译成汇编代码直接编译到汇编代码80Linux编程环境预处理文件汇编代码编译成目标代码汇编代码目标代码gcc

–x

assembler

–c

gcctest.s--c:只编译不链接汇编代码目标代码81Linux编程环境编译成目标代码直接编译成目标代码gcc

–c

gcctest.c使用汇编器生成目标代码as

–o

gcctest.o

gcctest.s直接编译成目标代码使用汇编器82Linux编程环境编译成执行代码目标代码执行代码gcc

–o

gcctest

gcctest.o直接生成执行代码gcc

–o

gcctest

gcctest.cLinux83编程环境gcc的高级选项-Wall:打开所有的警告信息Linux84编程环境根据警告信息检查源程序main函数的返回值为int在函数的末尾应当返回一个值85Linux编程环境修改源程序Linux86编程环境gcc优化编译87优化编译选项-O0:缺省情况,不优化-O1:第一级优化优化取决于目标处理器通常包括线程跳转(减少跳转次数)、延迟退栈(在嵌套函数调用时推迟退栈时间,直到递归结束)-O2:包括O1级优化调整处理器指令执行时序,优化处理器在等待其他指令结果或数据延迟时可执行其他不相关指令-O3包括O2级优化使内嵌函数、循环展开执行与特定处理器特性相关的优化Linux编程环境gcc优化编译举例不同的优化编译选项Linux88编程环境gcc优化编译举例(续)使用time命令统计程序的运行Linux89编程环境90GNUgdb91gdb

=

GNU

debuger设置断点监视、修改变量单步执行显示/修改寄存器的值查看堆栈远程调试Linux编程环境gdb常用命令不退出gdb就执行makemake不退出gdb就执行shell命令shell中止正在调试的程序kill执行当前调试的程序run退出gdbquit临时显示表达式的值print显示表达式的值display打开要调试的文件file执行一条语句,是函数则进入函数内部step执行一条语句但不进入函数内部next列出源代码的一部分list设置断点,可以是行号、函数名及地址(以*开头);tbreak:设置临时断点break/tbreakLinux92编程环境gdb使用举例源代码如下编译:gcc

–o

bug

bug.c93Linux编程环境gdb使用举例编译并运行????编译Linux94编程环境使用gdb调试bug运行bug输入字符串hello显示出错位置能不能看到源代码呢?Linux95编程环境使用gcc的-g参数gcc

–g

–o

bug

bug.c-g:在可执行程序中包含标准调试信息重新调试列出源代码96Linux编程环境使用gcc的-g参数?怎么修改前面的源代码呢?设置断点97Linux编程环境98使用GNU

make管理项目99GNUmake是一种代码维护工具,在使用GNU编译器开发大型应用时,往往要使用make管理项目。如果不使用make管理项目,就必须重复使用多个复杂的命令行维护项目和生成目标代码。Make通过将命令行保存到makefile中简化了编译工作。Make的主要任务是根据makefile中定义的规则和步骤,根据各个模块的更新情况,自动完成整个软件项目的维护和代码生成工作。Linux编程环境使用GNU

make管理项目100Make可以识别出makefile中哪些文件已经被修改,并且在再次编译的时候只编译这些文件,从而提高编译的效率Make会检查文件的修改和生成时间戳,如果目标文件的修改或者生成时间戳比它的任意一个依赖文件旧,则

make就执行makefile文件中描述的相应命令,以便更新目的文件只更新那些需要更新的文件,而不重新处理那些并不过时的文件Linux编程环境使用GNU

make管理项目101特点适合于支持多文件构成的大中型软件项目的编译,链接,清除中间文件等管理工作提供和识别多种默认规则,方便对大型软件项目的管理支持对多目录的软件项目进行递归管理对软件项目具有很好的可维护性和扩展性Linux编程环境Makefile102Makefile告诉make该做什么、怎么做Makefile主要定义了依赖关系即有关哪些文件的最新版本是依赖于哪些别的文件产生或者组成的需要用什么命令来产生目标文件的最新版本以及一些其他的功能Linux编程环境Makefile的规则规则内容要创建的目标(文件)创建目标(文件)所依赖的文件列表通过依赖文件创建目标文件的命令组规则一般形式target

...

:

prerequisites

...<tab>command<tab>...<tab>...例如test:test.cgcc

–O

–o

test

test.cLinux103编程环境一个简单的Makefileedit

:

main.o

kbd.o

command.o

display.o

insert.o

search.o

files.o

utils.o cc

-o

edit

main.o

kbd.o

command.o

display.o

insert.o

\

search.o

files.o

utils.omain.o

:

main.c

defs.hcc

-c

main.ckbd.o

:

kbd.c

defs.h

command.hcc

-c

kbd.ccommand.o

:

command.c

defs.h

command.hcc

-c

command.cdisplay.o:

display.c

defs.h

buffer.hcc

-c

display.c

insert.o

:

insert.c

defs.h

buffer.hcc

-c

insert.c

search.o

:

search.c

defs.h

buffer.hcc

-c

search.cfiles.o

:

files.c

defs.h

buffer.h

command.hcc

-c

files.c

utils.o

:

utils.c

defs.hcc

-c

utils.c

clean

:

rm

edit

main.o

kbd.o

command.o

display.o

insert.o

\

search.o

files.o

utils.oLinux编程环境104Make的工作过程105default

goal在缺省的情况下,make从makefile中的第一个目标开始执行Make的工作过程类似一次深度优先遍历过程Linux编程环境Makefile举例sum

(exe)sum.omain.osum.csum.hsum.hmain.csum:

main.o

sum.ogcc

–o

sum

main.o

sum.omain.o:

main.c

sum.hgcc

–c

main.csum.o:

sum.c

sum.hgcc

–c

sum.c106Linux编程环境Makefile举例规则说明main.o:

main.c

sum.hgcc

–c

main.ctabdependencyactionRule107Linux编程环境默认依赖规则说明108.o依赖于相应的.c文件sum:

main.o

sum.ogcc

–o

sum

main.o

sum.omain.o:

main.c

sum.hgcc

–c

main.csum.o:

sum.c

sum.hgcc

–c

sum.cLinux编程环境109Makefile中的变量110使用变量可以降低错误风险简化Makefile例:objects变量($(objects))objects

=main.o

kbd.ocommand.o

\display.o

insert.o

search.o

files.o

utils.oedit:$(objects)cc

-o

edit$(objects)有点像环境变量环境变量在make过程中被解释成make的变量可以被用来贮存一个文件名列表贮存可执行文件名。如用变量代替编译器名贮存编译器FLAGLinux编程环境预定义变量111Make使用了许多预定义的变量,如AR:归档维护程序的名称,默认值为arARFLAGS:归档维护程序的选项AS:汇编程序的名称,默认值为asASFLAGS:汇编程序的选项CC:C

编译器的名称,默认值为ccCFLAGS:C

编译器的选项CXX:C++编译器的名称,默认值为g++CPPFLAGS:C

预编译的选项……Linux编程环境简化后的Makefile文件objects

=

main.o

kbd.o

command.o

display.o

\insert.o

search.o

files.o

utils.oedit

:

$(objects)cc

-o

edit

$(objects)main.o

:

defs.hkbd.o

:

defs.h

command.hcommand.o

:

defs.h

command.hdisplay.o

:

defs.h

buffer.hinsert.o

:

defs.h

buffer.hsearch.o

:

defs.h

buffer.hfiles.o

:

defs.h

buffer.h

command.hutils.o

:

defs.h.PHONY

:

cleanclean

:rm

edit

$(objects)112Linux编程环境内部变量113$@:目标文件的完整名称。$*:不包含扩展名的目标文件名称。$<:依赖列表中的第一个依赖文件。$+:所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。$^:整个依赖列表(除去所有重复的文件名)。$?:所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。$%:如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为mytarget.so(image.o),则$@

为mytarget.so,而$%为image.o。不需要括号括住例如:CC

=gccCFLAGS

=

-Wall

-O

-gfoo.o

:foo.c

foo.hbar.h$(CC)

$(CFLAGS)

-c

$<

-o

$@Linux编程环境隐含规则(Implicit

Rules)114内置的规则告诉make当没有给出某些命令的时候,应该怎么办。用户可以使用预定义的变量改变隐含规则的工作方式,如一个C编译的具体命令将会是:$(CC)

$(CFLAGS)

$(CPPFLAGS)

$(TARGET_ARCH)

-c

$<

-o

$@Linux编程环境设定目标(Phony

Targets)115设定目标目标不是一个文件其目的是为了让一些命令得以执行使用PHONY显式声明设定目标.PHONY:

clean使用设定目标实现多个目的all:

prog1

prog2Linux编程环境典型的设定目标116设定目标也可以用来描述一些其他的动作。例如,想把中间文件和可执行文件删除,可以在makefile里设立这样一个规则:clean:$rm

*.o

exec_file前提是没有其它的规则依靠这个‘clean’目的,它将永远不会被执行。但是,如果明确的使用命令‘make

clean’

,make

会把这个目的做为它的主要目标,执行那些rm

命令Linux编程环境Makefile中的函数(Functions)117用来计算出要操作的文件、目标或者要执行的命令使用方法$(function

arguments)典型的函数$(subst

from,to,text):替换字符串$(subst

ee,

EE,

feet

on

the

street)相当于`fEEt

on

the

strEEt'$(patsubst

pattern,

replacement,

text)$(patsubst

%.c,%.o,

x.c.c

bar.c)相当于`x.c.o

bar.o‘$(wildcard

pattern)$(wildcard

*.c)objects

:=

$(wildcard

*.o)Linux编程环境Makefile中的条件语句118conditional-directivetext-if-trueendiforconditional-directivetext-if-trueelsetext-if-falseendifLinux编程环境四种条件语句119ifeq...else...endififneq…else…endififdef…else…endififndef...else…endifLinux编程环境带条件的makefile举例120sum:

main.o

sum.ogcc

–o

sum

main.o

sum.omain.o:

main.c

sum.hgcc

–c

main.c#deciding

which

file

to

compile

to

create

sum.oifeq

($(USE_SUM),

1)sum.o:

sum1.c

sum.hgcc

–c

sum1.c

–o

$@elsesum.o:

sum2.c

sum.hgcc

–c

sum2.c

–o

$@endifLinux编程环境作业:分析makefile#

Makefile

to

compare

sorting

routinesBASE

=

/home/blufox/baseCC

=

gccCFLAGS

= -O

–Wall= $(BASE)

pare_sorts= -I$(LOC)/include= $(LOC)/lib/g_lib.a

\$(LOC)/lib/h_lib.aEFILEINCLSLIBSLOC=

/usr/localOBJS

=

main.o

another_qsort.o chk_order.o

\compare.o

quicksort.o$(EFILE):

$(OBJS)@echo

“linking

…”@$(CC)

$(CFLAGS)

–o

$@

$(OBJS)

$(LIBS)$(OBJS):

compare_sorts.h$(CC)

$(CFLAGS)

$(INCLS)

–c

$*.c#

Clean

intermediate

filesclean:rm

*~

$(OBJS)Linux编程环境121122shell命令123options

arguments命令格式command说明在shell提示符下,输入命令,然后按下Enter键shell识别大小写如果找不到你输入的命令,会显示反馈信息:

“Command

not

Found”如果命令太长,要在第一行行尾键入“\”字符和按下Enter键,在下一行的“>”后接着输入Linux系统环境键盘快捷方式124<ctrl-c>停止命令<ctrl-d>结束传输或者文件<ctrl-s>临时停止输出<ctrl-q>恢复输出<ctrl-u>擦除整行<backspace>纠正错误Linux系统环境shell命令补齐功能125命令补齐指当键入的字符足以确定目录中一个唯一的文件时,只须按Tab键就可以自动补齐该文件名的剩下部分举例[root

@redflag

/root]#hist【Tab】系统将会自动帮助用户完成命令[root

@redflag

/root]#historyLinux系统环境特殊bash变量126HISTFILE用于贮存历史命令的文件HISTSIZE历史命令列表的大小HOME当前用户的用户目录OLDPWD前一个工作目录PATHbash寻找可执行文件的搜索路径PS1命令行的一级提示符PS2命令行的二级提示符PWD当前工作目录SECONDS当前shell开始后所流逝的秒数Linux系统环境历史记录127bash

保留一定数目的已在shell

里输入过的命令这个数目取决于HISTSIZE的变量使用历史记录列表最简单的方法是用上方向键另一个使用命令历史文件的方法是用bash

的内部命令history

和fc(fix

命令)命令来显示和编辑历史命令Linux系统环境history命令128history有两种不同的调用方法history

[n]当history

命令没有参数时,整个历史命令列表的内容将被显示出来使用n参数的作用是仅有最后n

个历史命令会被列出例如,history

5

显示最后5个命令history

[-r|w|a|n]

[filename]用于修改命令历史列表文件的内容-r:读命令历史列表文件的内容并把其当作当前的命令历史列表-w

:把当前的命令历史记录写入文件中并覆盖文件原来的内容-a

:把当前的命令历史记录追加到文件中-n

:将读取文件中的内容并加入到当前历史命令列表中如果filename

选项没有被指定,history

命令将用变量HISTFILE的值来代替Linux系统环境129alias命令功能命令别名通常是其他命令的缩写,用来减少键盘输入格式alias

[alias-name=’

mand’]alias-name是用户给命令取的别名mand是原来的命令和参数注意点bash以空格或回车来识别原命令,所以如果不使用引号就可能导致bash只截取第一个字,从而出现错误在定义别名时,等号两边不能有空格,否则shell将不能决定要做什么仅在命令中包含空格或特殊字符时才需要引号如果键入不带任何参数的alias命令,将显示所有已定义的别名Linux系统环境两级提示符130第一级提示符指在等待命令输入时的情况,默认值是$符号如果需要重新定义该提示符,只需修改PS1变量的值PS1=”输入一个命令:”第二级提示符是当Bash为执行某条命令需要用户输入更多信息时显示的,默认为“>”如果需要重新定义该提示符,只需修改PS2变量的值PS2=”更多信息:”用户也可以使用一些事先已经定义好的特殊字符这些特殊字符将使提示符中包含当前时间之类的信息Linux系统环境bash提示符常用特殊字符131特殊字符说明\!显示该命令的历史编号\#显示shell激活后,当前命令的历史编号\$显示一个$符号,如果当前用户是root则显示#符号\\显示一个反斜杠\d显示当前日期\h显示运行该shell的计算机主机名\n打印一个换行符,这将导致提示符跨行\s显示正在运行的Shell的名称\t显示当前时间\u显示当前用户的用户名\W显示当前工作目录基准名\w显示当前工作目录Linux系统环境举例Linux132系统环境用户变量133变量名:可以是由字母开头的任意字母、数字组成的序列定义用户变量形式:set

var=sting取消变量定义:unset

var显示变量值:echo示例set

int=5:要生成一个值为整数的变量执行操作set

var1=abcdset

var2=$var1efgh执行上面两条语句,变量var2的内容为:abcdefghecho

$var2

:显示上面var2的值则输出:abcdefghLinux系统环境操作环境设置技巧134引用常用的环境变量减少操作步骤常用环境变量HOME:用户主目录PATH:检索路径SHELL:当前所用shellTERM:终端类型cd$HOME与cd、cd~一样,将当前目录设置成自己的用户主目录使用仿真终端提供的功能如复制与粘贴可以减少键入的“笔误”命令不能退出、结果难于预料时,及时使用^C中断运行,一般不能采用关闭终端的办法使用BASH的“命令行编辑”功能,方便命令调试Linux系统环境通配符基础135基本通配符?:表示该位置可以是一个任意的单个字符*:表示该位置可以是若干个任意字符方括号[charset]:可替代charset集中的任何单个字符示例[cChH]:表示在文件的该位置中可出现任意单个的c或h字符的大小写形式[a-z]:代替任意小写字母[a-zA-Z]:可替代任意字母Linux系统环境通配符应用136在一条指令中用多个通配符rm

a*out*tmp?该命令可以删除一系列临时性的输出文件,如ab.out.tmp1、ab.out.temp1

等UNIX或Linux系统可将一定相关的文件看作一个集合的一部分,用户可以用该集合去匹配。如果需要显示nic-1.png,nic-2.png,nic-3.png,nic-4.png,nic-5.png,只须要在终端的命令提示符后输入ls

nic-[1-5].pngLinux系统环境shell命令的输入和输出137执行一个shell命令时通常会自动打开三个标准文件标准输入文件(stdin):通常对应终端键盘标准输出文件(stdout):对应终端屏幕标准错误输出文件(stderr):对应终端屏幕进程I/O处理过程从标准输入文件中得到输入数据将正常输出数据输出到标准输出文件将错误信息送到标准错误文件中Linux系统为输入、输出的传送引入另外两种机制输入/输出重定向管道Linux系统环境输入重定向138把命令的标准输入重定向到指定的文件中主要用于改变一个命令的输入源另一种输入重定向称为here文档告诉shell当前命令的标准输入来自命令行here文档的重定向操作符使用“<<”将分隔符(!…!)之间的正文重定向输入给命令由于大多数命令都以参数的形式在命令行上指定输入文件的文件名,所以输入重定向并不经常使用当要使用一个不接受文件名作为输入参数的命令,而需要的输入内容又存在一个文件里时,就能用输入重定向解决问题Linux系统环境输出重定向139把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中该命令的输出不显示在屏幕上,而是写入到指定文件中形式命令>文件名:覆盖原文件命令>>文件名:文件末追加信息Linux系统环境管道140将一个程序或命令的输出作为另一程序或命令的输入方法通过一个临时文件将两个命令或程序结合在一起Linux所提供的管道功能管道可以把一系列命令连接起来第一个命令的输出作为第二个命令的输入通过管道传给第二个命令第二个命令的输出又作为第三个命令的输入,以此类推显示在屏幕上的是管道行中最后一个命令的输出(如果命令行中未使用输出重定向)Linux系统环境命令替换141命令替换和重定向有些相似,但区别在于命令替换是将一个命令的输出作为另外一个命令的参数命令格式command1

`command2`command2的输出将作为command1的参数注意符号`,被括起来的内容将作为命令执行执行后的结果作为command1的参数示例$

cd

`pwd`该命令将pwd命令列出的目录作为cd命令的参数,结果仍然是停留在当前目录下Linux系统环境进程基本管理142分类前台进程:用户运行一个程序或执行一个命令就启动一个前台进程,进程不结束,终端就不出现系统提示符后台进程:用户在输入命令行后加上”&”字符就启动一个后台进程,shell不等待命令退出,立即重新显示提示符,让该命令进程在后台运行bg命令可以将进程放到后台运行fg命令可以将后台进程放到前台运行举例[jjpr@zzh

jjpr]$

sleep

10&[1]

467[jjpr@zzh

jjpr]$find

/

-name

myfile

-print

>

/root/test

&1为作业号,由shell分配。467为PID作业号不同于PID,在系统中不一定唯一Linux系统环境特殊进程143守护(daemon)进程与终端和用户无关,负责侦听用户请求或者定期执行,平时则处于睡眠状态孤儿进程父进程已经被删除或闲置的进程僵尸进程进程已经终止,但还没有撤消会影响系统效率Linux系统环境ps命令144功能查看系统中正在运行的进程语法ps

[-ef][-n

name][-t

ttys][-p

pids][-u

users][-groups]参数选项-f:产生某个进程的一个完整清单-u:显示进程的用户名和启动时间等信息-t

n:显示第n个终端的进程-e:显示所有的进程说明ps可查看后台进程、前台进程,当ps命令行没有选项时,只显示与控制终端相关进程的基本信息没有root权限,ps仅限以说明运行进程,报告用户的进程讯息Linux系统环境ps命令运行的命令进程占用CPU的百分比启动进程的终端号进程开始的时间和日期父进程号示例ps

–ef

输出用户ID

进程号进程已占用的时间Linux145系统环境kill命令功能给进程发送信号语法kill[参数]进程1的PID

进程2的PID…]参数-s

signal:signal是信号类别,如SIGKILLkill-l:显示kill命令所能发送的信号种类,每个信号都有一个数值对应如:编----号--------名-----字--------------------------------------含---义-------14612915SIGHUPSIGINTSIGKILLSIGTERM挂起中断

(对前台进程中断)

中止

(不可捕捉和忽略,强行消亡)从kill来的软件中断信号(默认)该信号将通知进程退出。如果进程不接受该信号,可以通过参数–9

强行结束进程。Linux系统环境top命令147功能实时监控进程状况top屏幕自动每5秒刷新一次,也可以用“top–d20”,使得top屏幕每20秒刷新一次Linux系统环境GNU

binutils简介149是一组二进制工具程序集addr2line将程序地址转换为文件名和行号在命令行中给出地址和可执行文件名,使用可执行文件的调试信息指出对应源文件以及行号ar建立、修改、提取归档文件归档文件结构保证可恢复原始文件内容asGNU汇编器,主要用来编译gcc输出的汇编文件将汇编代码转换成目标代码,并放到一个文件该目标文件将由连接器ld连接ld连接器,将目标和归档文件结合起来形成可执行文件通常,建立一个新编译程序的最后一步就是调用ldLinux编程环境GNU

binutils简介(续)150nm列出目标文件中的符号objcopy将一种类型目标文件转换成另一种类型的目标文件objdump显示一个或更多目标文件的信息使用选项来控制其显示的信息ranlib产生归档文件索引,并将其保存到这个归档文件中索引列出归档文件各成员所定义的可重分配目标文件readelf显示elf格式可执行文件的信息size列出目标文件每一段的大小以及总体的大小Linux编程环境ar151用于建立、修改、提取归档文件(archive)一个归档文件可包含多个文件(也可认为归档文件是一个库文件)归档文件保存被包含原始文件的内容、权限、时间戳、所有者等属性,在提取后可被还原Linux编程环境使用ar建立库文件源程序add.c和minus.cLinux152编程环境使用ar建立库文件(续)编译成目标文件将库文件拷贝到/usr/lib目录下ar的rv参数的说明:

r:将多个文件组成一个文件

v:输出信息Linux153编程环境调用ar建立的库文件代码中使用Add和Minus函数Linux154编程环境调用ar建立的库文件(续)在编译时指定库文件指明将libtest.a链接进来155运行结果Linux编程环境nm156列出目标文件中的符号程序员可定位和分析执行程序/目标文件中的符号信息及其属性显示的符号类型A:符号的值是绝对值,不会被将来的链接所改变B:符号位于未初始化数据部分(BSS段)C:符号是公共的公共符号是未初始化的数据在链接时,多个公共符号可能以相同的名字出现如果符号在其他地方被定义,则该文件中的这个符号会被当作引用来处理D:符号位于已初始化的数据部分(data段)T:符号位于代码部分(text段)U:符号未被定义?:符号类型未知或目标文件格式特殊Linux编程环境nm使用举例Linux157编程环境objcopy将一种格式文件生成另一种格式文件使用file命令查看文件类型生成srec格式的目标文件使用file命令查看新文件的类型Linux158编程环境Linux的可执行文件格式159a.out格式(assembler

and

link

editor

output)早期UNIX系统使用的可执行文件格式文件头部结构定义(include/asm-x86/a.out.h)现在基本被ELF文件格式代替COFF格式(Common

Object

File

Format)包括文件头、可选头部及一些节(section).text,

.data和.bss区段各有一个小节,还可包含其他区段一个可选头部,对不同操作系统作特定定义文件定义位置:include/linux/coff.hELF格式(Executable

and

Linking

Format)代码、链接和注释都以段存在,节点表(Section

HeaderTable)有一个表项与每个小节对应文件类型:.o目标文件、.so动态库文件、可执行文件ELF格式可以比COFF格式包含更多的调试信息SRECMOTOROLA

S-Recoder格式(S记录格式文件)Linux编程环境objdump160显示一个或多个目标文件的信息由相应选项控制显示哪些信息可通过该工具查看执行文件或库文件的信息objdump对编写编译工具、分析代码执行机制非常有用Linux编程环境objdump使用举例-f选项:显示文件头内容Linux161编程环境objdump使用举例(续)-d选项进行反汇编Linux162编程环境readelf显示一个或多个ELF格式的目标文件信息Linux163编程环境GNU

Package的典型安装cd

foo-1.0./configuremake(su)

make

installFAQ

0039

@

smth下载源代码包foo-1.0.tar.gztar

xvzf

foo-1.0.tar.gz问题1:配置脚本configure是怎么生成的?问题2:configure脚本怎么知道该如何生成Makefile幕后英雄——GNU

Auto

Tools:autoconf,

automake,libtool,

autoscan,autoheader……Linux编程环境编译与安装集成工具?GNUAutoTools是上个世纪90年代开始发展起来的一系列辅助开发、打安装包的自动化工具。各种工具分别开发,但是协同工作的很好。比如autoconf,

automake,

libtool等等。Linux编程环境Hello

World创建步骤1.

hello.c#include

<stdio.h>int

main()

{

printf(“Hello

World!\n”);

return

0;

}2.

Makefile.ambin_PROGRAMS

=

hellohello_SOURCES

=

hello.c3.

configure.inAC_INIT(hello.c)AM_INIT_AUTOMAKE(hello,

0.1)AC_PROG_CCAC_OUTPUT(Makefile)4.

aclocal:生成aclocal.m4文件5.

autoconf:生成configure文件6.

automake

--add-missing

--foreign7.

./configure8.make

(make

install

安装,make

dist

产生安装包)Linux编程环境处理过程autoscanconfigure.scanconfigure.inMakefile.amMakefile.inMakefileautomakeeditaclocal.m4aclocalconfigureautoconfSrc

codeLinux编程环境configure.in是configure脚本的输入文件解决在不同unix变种之间移植程序的问题库名可能不同应用程序名可能不同结构和常量的定义可能不同……configure脚本完成autoconf与automake的初始化工作,为不同的平台定义相应的宏,检测并指定适当的程序名、库名、结构和常量名等等,指定要为哪些目录输出Makefile文件。Linux编程环境configure.inconfigure.in内容基本初始化部分:包括AC_INIT(必须第一个出现),AM_INIT_AUTOMAKE(程序包名,版本号),AC_CONFIG_HEADER可选宏:如AC_ARG_ENABLE检测某些程序的存在性检查程序用到的库检查某些头文件是否存在检查Typedefs

and

structures检查Functions指定在哪些目录输出MakefileLinux编程环境Makefile.am一种比Makefile更高层次的规则指定要生成什么目标,它由什么源文件生成,要安装到什么目录。可执行文件bin_PROGRAMS

=

foofoo_SOURCES

=

foo1.c

foo1.h

foo2.cfoo_LDADD

=

foo3.o

-lm

foo4.afoo_LDFLAGS

=

-L<lib_path>foo_DEPENDENCIES

=Linux编程环境Makefile.am对静态库

lib_LIBRARIES=libfoo.a foo_a_SOURCES=

foo_a_LDADD=

foo_a_LIBADD=

foo_a_LDFLAGS=只在make时做静态连接用,不安装的库:noinst_LIBRARIES

=

libfoo.a对头文件include_HEADERS

=

foo.h对数据文件data_DATA

=

data1

data2Linux编程环境Makefile.am全局变量(对所有目标都适用) INCLUDES=-I/dir1-I/dir2 LDFLAGS=-L/dir1-L/dir2 LDADD=foo.o

foo.a-lfooEXTRA_DIST=file1

file2

源程序和一些默认的文件自动打入.tar.gz包,其它文件若要进入.tar.gz包可以用这种办法,比如配置文件,数据文件等等。SUBDIRS=dir1

dir2

在处理本目录之前要递归处理哪些子目录Linux编程环境Makef

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论