1.Linux下常用的开发工具
1.1Linux下程序开发利器-VIM
1.1.1程序开发常用IDE
(1)常见的IDE(Integrated Development Environment )集成开发环境
- visual studio
- IntelliJ IDEA
- Code::Blocks
(2)IDE的组成
- 编辑工具:类似文本编辑器,编辑出源码文本
- 编译、链接工具:把一个源程序编译构建成为一个可执行程序
- 调试工具:能对执行程序进行源码或汇编级调试 软件工程
- 管理工具:用于协助多人开发或大型软件项目的管理,如 make、CVS、Subvision、git
(3)Linux下各部分的分解
- 编辑工具:Vim
- 编译工具:gcc
- 调试工具:gdb
- 软件工程管理工具:makefile git
1.2vim
- Vim是从vi发展出来的一个文本编辑器
- 与Emacs并列,是类Unix系统用户最喜欢的编辑器
- 在开放源代码方式下发行的自由软件
1.2.1使用
1.2.3程序的构建
- 预处理:对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析
- 编译:就是把C/C++代码“翻译”成汇编代码
- 汇编:将第二步输出的汇编代码翻译成符合一定格式的机器代码,生成通常以.o为后缀的目标文件
- 链接:将上步生成的目标文件和系统库的目标文件和库文件链接起来,最终生成了可以在特定平台运行的可执行文件
1.2.4make的运行
1.2.5准备工作
包含多个源文件的项目的编译链接过程
1.3gcc
1.3.1定义与用法
-
GCC(GNU Compiler Collection,GNU编译器套装)
- 是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发布的自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑Mac OS X 操作系统的标准编译器
- 支持C/C++、java、go等语言
- 用法: gcc [option] filename [ -l libname]
1.4makefile工作原理
1.4.1简介
-
make和makefile简介
-
makefile是一个配置文件,可以对程序编译进行管理,其优点是:
- 避免复杂命令行编译语句
- 减少编译所需时间
- 让编译自动运行
- make是解释makefile文件中指令的命令工具
-
makefile是一个配置文件,可以对程序编译进行管理,其优点是:
-
make 是什么
- make是一种自动化工程管理工具。
-
Makefile 是什么
- 配合 make,用于描述构建工程过程中所管理的对象以及如何构造工程的过程。
-
make 如何找到 Makefile
- 隐式查找:当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件
- 显式查找:-f
1.4.2多文件的自动编译
1.4.3MakeFile 的构成
- Makefile 由一条或者多条规则(rule)组成
-
每条规则由三要素构成
- target:目标,可以是 obj 文件也可以是可执行文件
- prerequisites: 生成 target 所需要的依赖
- command:为了生成 target 需要执行的命令,可以有多条
- Makefile 中的其他元素介绍
- 注释: 行注释,以“#”开头
1.4.3Makefile的规则格式
1.4.4makefile的操作规则
- 如果工程没有编译过,所有的C文件都要编译并被链接。
- 如果工程的某几个文件被修改,只需要编译被修改的这几个文件,并重新链接目标程序
- 如果工程的头文件被修改了,那么所有包含此头文件的源文件都要重新编译,并重新连接目标程序
1.4.5使用变量
- makefile中可以使用变量
- 变量类似于C语言的宏,但值可修改
- 变量名大小写敏感
- 变量名不应该包含:#=或空格
- 变量使用时用$(var)形式
- 环境变量
- 自动化变量
- 预定义变量
1.5C语言常见错误
1.5.1C语法错误
- 错误信息∶文件source.c中第n行有语法错误(syntex errror)
- 有些情况下,一个很简单的语法错误,gcc会给出一大堆错误。如: line 1: syntax error: unexpected “(”
1.5.2头文件错误
- 错误信息∶找不到头文件head.h(Can not find include file head.h)。
- 这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。
1.5.3档案库错误
- 错误信息∶链接程序找不到所需的函数库(ld: -lm: No such file or directory )。
- 这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。
1.5.4未定义符号
- 错误信息∶有未定义的符号(Undefined symbol)。
- 这类错误是在链接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改gcc连接选项中的-l和-L项。
1.6编码中的调试技巧
1.6.1日志
-
使用printf输出到终端或者使用fprintf输出到文件
-
-
优点:简单,不用借助其他工具
-
缺点:性能不是很好,效果有时不理想
-
插入的位置、粒度等都需要调试者去权衡,如果插入过多,则频繁的IO操作会使程序运行变慢,线程行为改变,有些bug甚至不会再出现
-
系统调用syslog (man syslog)
-
自行封装
-
-
第三方日志库 zlog 、log4c
1.6.2断言
宏的形式(assert(expression))定义在<assert.h>文件中。 assert 将通过检查表达式 expression 的值来决定是否需要终止执行程序。也就是说,如果表达式 expression 的值为假(即为 0),那么它将首先向标准错误流 stderr 打印一条出错信息,然后再通过调用 abort 函数终止程序运行;否则,assert 无任何作用。
1.6.3内存错误
-
从OS角度看内存错误的原因
- 访问不存在的内存地址
- 访问系统保护的内存地址
- 访问只读的内存地址
- 栈溢出
-
从码农角度看内存错误的原因
- 内存分配未成功却使用
- 内存分配成功未初始化就使用
- 内存的操作越界,如数组越界
- 释放了内存却继续使用
1.6.4GDB调试的基本命令
- list:显示源码
- Break num 设置断点
- Run 运行可执行文档
- Next: 单步执行 不进入函数
- Step:单步执行(进入函数)
- Bt:显示调用栈
- Info register eip显示某寄存器内容

2.shell命令及脚本
2.1shell及shell脚本的作用
2.1.1Shell简介
- Shell是用户与系统 沟通的桥梁
-
一种脚本编程语言
- 包含变量、循环、函数等常见编程语言的元素
- 通过解释器读入程序的代码,解释执行,无需编译
-
命令解释器
- Shell提供了用户与操作系统交互所需的交互界面
- 能够解释执行shell脚本编写的程序
-
Shell的种类
- 不止一种shell解释器
- /bin/sh (已经被/bin/bash 所取代)
- /bin/bash (Linux 预设 shell) /bin/ksh (Kornshell 由 AT&T Bell lab.开发,兼容 bash)
- /bin/zsh (基于ksh 开发,功能更强的 shell)
- /bin/csh (已经被/bin/tcsh 所取代)
- /bin/tcsh (整合 C Shell ,提供更多的功能)
-
如何看自己目前的shell?
- echo $SHELL(查看当前运行的Shell)
- cat /etc/shells(查看系统支持的Shell)
- /etc/shells文件登记了本系统上合法的shell解释器
-
Shell的选择
- FreeBSD default shell ->csh/tcsh Linux default shell->sh/bash
- 此讲以bash为主
2.1.2Shell脚本编程优点
-
简单性
- Shell作为一个高级脚本语言,可以简单地表达复杂的操作
-
可移植性
- 基于POSIX(Portable Operating System Interface)标准所定义的功能开发,脚本无需修改就可以在不同的Linux发行版上运行
- 开发相对容易 可以在短时间内开发出功能强大的脚本工具
2.1.3如何使用命令帮助
- 只记得部分命令关键字:man -k;
- 某个命令的简要说明:whatis;
- 某个命令的详细介绍:info;
- 查看命令的位置:which;
- 命令的具体参数及使用方法:man
2.2Linux Shell基础知识
2.2.1Linux目录结构
- / 根目录,一般根目录下只存放目录,不存放文件
- /home 系统默认的用户宿主目录
- /usr/bin 该目录为命令文件目录,也称为二进制目录
- /usr/sbin 放置系统管理员使用的可执行命令
- /etc 系统配置文件的所在地,一些服务器的配置文件也在这里;
- /var 经常变动的目录,/var下有/var/log 是用来存放系统日志的目录
- /tmp 临时文件目录,有时用户运行程序的时候,会产生临时文件
- /dev 设备文件存储目录,比如声卡、磁盘… …
2.2.2绝对/相对路径
-
绝对路径:一定由根目录 / 写起
-
写shell最好用绝对路径
-
如何查绝对路径:which command? pwd
-
-
相对路径:不是由 / 写起,指相对于当前工作目录的路径 .
-
#当前目录 ..
-
#上一层目录 ~
-
#home目录
-
2.2.3命令
-
单一指令
-
ls
-
ps –aux
-
netstat –an
-
-
连续指令
-
mkdir /backup;cp /.* /backup/; ls
-
-
条件指令
-
逻辑与(&&) grep google sampleCom.txt && more sampleCom.txt
-
逻辑或(||) cc prog.c|| echo ‘compile error’
-
-
内建命令
-
是由shell本身所执行的命令
-
解析内建命令shell不需要创建子进程
-
比如:exit,history,cd,echo等
-
-
外部命令
-
在bash之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin……等等,比如:ls、vi等。
-
存在于文件系统中某个目录下的单独的程序
-
-
如何辨别内建命令和外部命令?
-
使用type可以查看是否是内建命令
-
2.2.4命令补全
- 输入目录名或文件名或命令名的开头部分,Linux根据输入的字母自动补全剩余部分。
- 方法: 按tab键
2.3Shell中的特殊符号
2.3.1特殊字符
- 一般通配符
- 引号
- 输入/输出重定向
- 注释、管道操作符、作业管理符号
2.3.2一般通配符
- 星号(*) 匹配任意字符的出现。
- 问号(?) 匹配任意一个字符。
- 方括号([ ]) 匹配括号内所限定的任何一个字符
2.3.3引号
shell提供了一系列字符来消除特殊字符的特殊含义。 例如:< > “ ‘ $ ? & | \ *
-
1.双引号 双引号中,除 $ 、 ’ 、 \
- 这三个以外的任意元字符都是普通字符。
- 双引号保留空白字符(空格、制表符、换行符)
- 无法消除双引号自身的特殊含义
-
单引号
- 一对单引号中除单引号自身以外的任何字符按该字符字面解释。
- 用反斜杠消除单引号的特殊含义
- 单引号也同样保留空白符。
- 比较:echo “`pwd`”和echo ‘`pwd`’ echo “$HOME”和echo ‘$HOME’
-
倒引号
- 也称为命令替换符
- 将命令的输出插入到命令行的相应位置上。
2.3.4反斜线
- 反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。
- 例4: [Ubuntu@ubuntu]echo “Filename is N0\$\*” Filename is N0$*
- 注意:在单引号括起来的字符串中,反斜线也成为普通字符,而失去转义字符功能。
2.3.5注释
- shell将#看作注释符号,忽略#后的字符
- 说明 shell脚本中第一行: #!/bin/bash 表示后面所跟的字符串是所使用shell的绝对路径。
2.3.6输入/输出重定向
-
输出重定向
- > : 输出重定向
- >> :将命令执行结果追加到指定的文件中
-
举例:
- # ls ./ > result.txt
- #资料夹中的子资料夹存到 result.txt中
- # echo “appending text”>> result.txt
- #追加appending text到result.txt中
-
输入重定向
-
<:从文件到命令
- WC [选项] [文件名]
- -c 统计字节数
- -w 统计单词数
- -l 统计行数
-
<:从文件到命令
2.3.7管道
-
管道:
- 改变标准输入的源或者是标准输出的目的地
- command1 | command2
-
举例
- # ls |wc –w #计算字数
- # cat /etc/passwd | sort #将/etc/passwd排序
- # history | less #查看history中的历史
2.3.8作业管理符号
-
后台服务符号“&” :
- 使Shell在后台执行该任务,用户可以立即看到一个提示符,并继续其它工作。
- command &
-
举例
- #d & e & f #在后台执行任务d和e,而在前台执行任务f
- #(a , b)& c & #在后台先后执行命令a和b,与此同时还在后台执行c。这里注意任务a和b是相继启动的,而不是同时运行的
-
jobs:列出作业
- 内置命令jobs将列出所有后台作业。
-
挂起作业:
- 按下挂起键(通常是CONTROL+Z)会立即挂起前台的作业,并显示一条包含Stopped的消息
-
举例
- [2]+ Stopped find /usr –name ace -print >findout
-
bg:
- 将作业移到后台运行 将一个前台作业转移到后台执行之前,必须首先按下挂起键将作业挂起(暂时停止运行),然后使用内置命令bg将该任务放在后台继续执行
-
举例
- $bg [2]+ find /usr –name ace -print >findout &
2.4linux的基本命令
2.4.1linux基本命令
- echo 可待双引号或不带双引号,双引号可进行特殊字符 参数 -n 不换行 -e 解析输出内容中的转义字符 \a \t \n \c
- Read 从键盘读入信息赋给变量 遇到回车或文件结束符为止 例子 read name surname 回车 输入John tom 则 name 为 john surname 为tom
- Cat 用来显示文件内容或控制字符
2.4.2输入输出重定向
- 标准输入文件 STDIN 代号0
- 标准输出文件STDOUT 代号1
- 标准错误输出文件 STDERR 代号为2
- 输入输出重定向 < << > >>
2.4.3管道命令 | ls | grep file
- sort 对不同的数据类型进行排序 参数 -u -r -n 例子:num.txt
- Split 进行文件分割 spilt -2 num.txt ff
2.4.4系统管理命令
- 目录操作命令 pwd、cd 、 ls、 mkdir、rmdir
- 文件操作命令 touch、file、 cp、rm、mv、find、grep、tar、ln
2.4.5权限管理命令
- 用户 /etc/passwd /etc/shadow 文件 useradd、userdel、passwd、
- 用户组:查看文件/etc/group /etc/gshadow 、groupadd、groupdel
- 文件权限归属:chmod、chown、chgrp
- 用户切换 su、sudo、login
2.4.6作业管理
&、 bg、fg
2.4.7关闭系统
exit、reboot、init 0、shutdown、halt、poweroff