gcc编译过程
**预处理**
将c源文件编译程c文件
gcc -E test.c test.i
不做语法检查,只将头文件展开,注释去掉,宏替换掉。
**编译**
将c文件编译成汇编文件
gcc -S test.i test.s
**汇编**
将汇编文件编译成机器文件
test.i
gcc -c test.i test.o
**链接**
将所有机器文件连接成可执行文件
gcc *.o -o APP
动态内存管理
**堆区**
stdlib.h
**申请空间**
*malloc*
void *malloc(size_t,size)
*calloc*
void *calloc(size_t nmemb,size_t size)
会初始化空间值为‘\0’
**释放空间**
*free*
void free(void *ptr)
**空间扩容**
*realloc*
void *realloc(void *ptr,size_t size)
string.h
**重置一片空间(字符串)**
void **memset*(void *s,int c,size_t n)
结构体
A struct 结构体名
{
数据类型 变量名;
}B;
A:若在A处添加typedef,其含义为创建结构体并对其进行重命名。
B:若A处无typedef,则B处的名称为结构体变量的名称。
若A处有typedef,则B处的名称为重命名后的结构体类型名。
结构体的“字节对齐”
结构体分配大小讨论的数据类型,必须是基础的数据类型。
结构体分配内存空间大小时,按照其中所占字节数最大的数据类型来作为基准开辟空间。
在32os中因系统只能最多一次开辟4字节的空间,因此当出现4字节以上的数据类型时,仍按照最大4字节进行分配。反之,则按照结构体中最大的那个数据类型作为基准进行分配。
在64os中系统最多一次分配8字节。因此,一直按照结构体中的最大数据类型进行分配。
若出现结构体嵌套时,分配空间的计算要看**所有结构体内的最大类型,**不是最后一个结构体的最大类型。
结构体分配空间
结构体分配空间时,按照顺序依次分配,每个元素都有自己的专属空间;
同时,不论在32os或64os中,都需要保证存储的地址编号和该成员自身的数据类型大小成整数倍的关系,否则往后寻找下一个合适的地址空间进行存储。
联合体
其中的所有元素,**共用同一片空间**。因此,分配空间时,按照最大的数据类型作为空间分配的基准,但总数只需要能装下最大的那个元素即可。
枚举类型
将一系列的常量存放在同一集合中,需要使用时直接使用,增加程序可读性。
默认第一个值为0,往下依次递增1。
枚举类型需要放在函数头部,不然会无法使用。
函数指针类型的定义与重命名
指向函数首地址的指针
返回值类型(*指针名)(形参列表)
返回值类型 (*新类型名)(形参列表)
指针函数
返回值是指针的函数
main函数传参
int main(int argc,const chat argv[])
argc中存储的是传递的参数的个数,系统自动计数,可直接使用。
argv[]中存储的传递的参数的地址,const可省略。
makefile
工程管理工具,很多.c文件和.h文件进行统一管理
makefile编写格式:**
目标:依赖
命令表(语句)
make中的一些变量
自定义变量格式
变量名:=值
自动变量
<
∗
:
依赖中的第一个依赖
∗
<*:依赖中的第一个依赖 *
<∗:依赖中的第一个依赖∗^:所有依赖
$@:目标名
CC:编译器名称,默认cc,可以自己赋值:CC:=cc
CFLAGS:编译器选项,无默认值,用户可以自己赋值:CFLAGS:=-c -g -Wall
RM:删除,默认值为:rm -f,可自己赋值:RM:=-rf
export :添加一些指定的变量到系统函数中去
gdb调试
生成带有调试的可执行文件
gcc -g test.c -o APP
gdb APP 进入可执行文件
b 行数/函数名 设置断点设定调试开始地点
r 运行
n:不显示进入子函数,直接下一步
s:进入子函数,并显示执行
q:推出
大小端
大端
低字节处的内容存储在高地址处,
高字节处的内容存储在低地址处。
小端
低字节处的内容存储在低地址处,
高字节处的内容存储在高地址处。
递归函数
从哪里开始
从哪里结束
每一步干什么
多文件编译中头文件的书写
宏定义、结构体定义、取别名、全局变量的声明、函数的声明、枚举类型的声明
#ifndef _TEST_H_
#idfine _TEST_H_
宏定义
结构体定义
取别名
全局变量声明
函数的声明
枚举类型的声明
#endif
DNS服务器
域名解析服务器,将网址解析成为ip地址,若DNS错误或缺失会出现能上网但无法浏览网页
网关
一台主机通往另一台主机的IP地址
子网掩码
判断两台主机是外网通信还是子网通信
假如A想给B发消息:把A和B的IP地址均和A的子网掩码进行相与,查看网段是否一致,如果一致则代表可以直接通信即内网通信,否则需要外网通信(借助网关),反之亦然。
IP地址
IP地址由网络地址和主机地址构成
高位网络地址+地位主机地址
A类地址0.0.0.0~127.255.255.255
B类地址128.0.0.0~191.255.255.255
C类地址192.0.0.0~223.255.255.255
D类地址:目前用于组播
E类地址目前处于保留
0.0.0.0和.255一般不会分配用户因此实际用户地址应排除
linux发行版本
商业组织版本:RedHat
社区组织版本:Ubuntu
linux的体系结构
内核:核心组件,负责管理操作系统的执行。
进程管理
内存管理
网络管理
文件系统管理
驱动设备管理
shell:本质是一个命令行解释器,起到中间桥梁的作用,负责接收用户输入的命令,并简化翻译提交给内核,让内核作出回应。
最常用shell类型:bash
文件系统:数据在设备或者分区上组织文件的一种方法。分为:磁盘文件系统、虚拟文件系统、网络文件系统。
实用程序:每个独立系统,都会有一套配套的程序:编辑器、编译器、浏览器、办公套件、数据库等。
linux的软件包管理
软件包命名
软件包名_软件版本-修订版本_体系架构
Filename_Version-Reversion_Architecture.deb
下载软件
无网络
本地安装包,需要自己建立安装包的依赖关系。
dpkg相关命令
dpkg -i <package>安装本地的Debian
dpkg -r <package>移除一个安装包
dpkg -P <package>移除已安装软件包及配置文件
dpkg -L <package>列出安装的软件包清单
dpkg -s <package>列出安装包状态
dpkg-reconfigure <package>重新配置安装包
有网络
APT
apt-get subcommands [d|-f|-m|-q|--purge|--reinstall|-b|-s|-y|-u|-h|-v] pkg
**subcommands**
update 下载更新软件包信息
upgrade 将系统中所有软件升级到最新版本
install 下载所需安装包进行配置
remove 卸载软件包
autoremove 将不满足条件的软件包自动下载
source 下载源码包
bulid-dep 为源码包构建所需的编译环境
dist-upgrade 发布版升级
dselect-upgrade 根据dselect选择进行软件包升级
clean 删除缓冲区所有已下载的包文件
autoclean 删除缓冲区中老的版本包文件
check 检查系统中依赖关系的完整性
选项
-d仅下载软件包不进行下载
-f 修复系统中存在的的软件包依赖问题
-m 缺少关联包仍试图执行
-q 将输出作为日志保留,不获取命令执行进度
–purge 与remove一起使用,完全卸载软件包
–reinstall 与install一起用,重新安装软件包
-b 下载完源码包后,编译生成相应的软件包
-s 不进行操作,只模拟执行命令的结果
-y 对所有的询问都回答yes
-u获取已升级的软件包列表
-h获取帮助信息
-v获取apt-get版本号
代码关联文件
1、在总工程目录下创建tags文件 ctags -R
2、在tags文件路径下打开一个文件
3、光标在需要跳转的函数声名处输入ctrl+}
4、退出按下ctrl+T
检查是否有网
ping 网络ip或者网址,看是否有回应
linux下的shell命令
用户切换命令 su
su 用户名:将用户身份切换到指定用户
su - 用户名:不仅将用户切换到指定状态,也将用户之前的路径切换至指定家目录
用户管理命令
修改密码
sudo passwd 用户名
创建用户
sudo adduser 新用户名
删除用户
sudo deluser 用户名
想要彻底删除需要添加选项-remove-home
## 常见shell命令
env 打印环境变量对应值
echo 标准输出函数
1、打印一个指定的字符串
2、打印变量的值($变量值)
3、书写需要""引起来不发错
ln:创建链接文件
软连接
符号链接,是指向源文件的一条路径类似于快捷方式,创建时最好附带绝对路径,提高软连接的可移植性。
ln -s 源文件(带绝对路径) 软连接文件
硬链接
以物理编号inode创建文件,硬链接文件不依赖文件的路径
ln 源文件(相对/绝对路径) 硬链接文件
1、源文件与软连接和硬链接的影响是双向的。
2、当删除源文件时,软连接会立马失效,当恢复源文件时(无论与原来内容是否相同,只需要文件名相同)此时软链接恢复,并指向新的文件。
3、源文件与软连接是不同的空间,但源文件与硬链接是相同的空间。
4、当删除源文件时,硬链接不受影响,仍可以通过硬链接打开文件并修改。
chomd:修改文件的权限
新文件的权限是->rw-rw-r–即0664
八进制法修改权限:
chmod 0774 test.c
符号标记法修改权限:
用户:u
用户组:g
其他用户:o
所有用户:a
grep:查找文件中的内容
-c:查找所查找的字符所在的行数
-n:查找所在行的内容
-v:除了匹配行的其他行
find
查找文件
find 路径 选项(-name) 描述
wc
统计文件大小,行数和字数
shell里的特殊字符
shell下的通配符
*:匹配任意长度
?:匹配一个长度
[范围]:匹配范围内的一个长度
[^指定范围]:匹配除了指定范围之外的任意长度
管道
command 1|command 2|……|command N
将前一个的输出作为下一个的输入
xargs命令->会具备转换功能解决输入作为简单文本的问题。可以使输入作为参数。
命令置换
command1 command2
将command2的结果作为参数传入command1
重定向
">、>>"重定向的文件不存在,新建并存储正确的命令结果>会覆盖上一次而>>不会覆盖上一次结果
"2>、2>>"重定向文件不存在时,新建并存储错误的命令结果2>会覆盖上一次而2>>不会覆盖上次结果
"&>、&>>"重定向文件不存在时,新建并存储任何命令的结果&>会覆盖上一次而&>>不会覆盖上次结果
linux下的shell编程
shell:命令行解释器
shell命令:用户给内核发送的一种信号
shell脚本:多条shell命令的有序集合
格式
顶格书写:#! /bin/bash
1、新建一个.sh文件
2、修改文件权限,至少使自己可以执行
3、直接执行
变量
自定义变量
变量名=值
${变量名}
位置变量
$N传入的N个变量
系统预定义变量
$#统计命令行的有效参数个数
$@统计命令行中的有效参数
$*统计命令行中的有效参数
?
获取上一条命令的退出状态
∗
∗
环境变量
∗
∗
添加新变量:
e
x
p
o
r
t
变量名
=
值修改变量:
e
x
p
o
r
t
变量名
=
新值:
?获取上一条命令的退出状态 **环境变量** 添加新变量:export 变量名=值 修改变量:export 变量名=新值:
?获取上一条命令的退出状态∗∗环境变量∗∗添加新变量:export变量名=值修改变量:export变量名=新值:{变量名}
消除变量:unset 变量名
功能性语句
read
read 变量1 变量2
echo
" "双引号和不加双引号为软转义,保留shell特殊字符的含义
''单引号和\为硬转义,不会保留shell的特殊含义
expr
进行算术运算,expr和变量名之间至少保留一个空格,运算符和两个变量名之间也要存在空格
test
[ 对象1 测试条件 对象2 ]
test 对象1 测试条件 对象2
整型
-eq等于
-ne不等于
-lt -le小于或小于等于
-gt -ge大于或大于等于
字符串
str1 = str2 等于
str1 !=str2 不等于
-z str1/str2 字符串长度为0
-n str1/str2 字符串长度不为0
文件
-f是否普通文件
-d是否目录文件
-L是否链接文件
-r是否用于可读权限
-w是否具有可写权限
-x是否具有可执行权限
-s测试文件大小
f1 -nt f2测试f1是否比f2新
f1 -ot f2测试f1是否比f2旧
结构性语句
顺序结构
选择结构
if
if 测试语句
then 命令表
elif 测试语句
then 命令语句
else 测试语句
fi
case
case 变量值 in
模式1)
命令表
;;
……
*)
命令表
esac
循环结构
for
for 变量名 in 单词表/for 变量名 in seq范围1 范围2/for ((i=0;i<n;i++))
do
命令表
done
while
while 条件判断
do
命令表
done
脚本函数
function name()
{
命令表1
命令表2
……
命令表N
}
调用
变量名=`function name 参数1 参数2`
function name 参数1 参数2