ctrl +alt +t 打开新终端
sudo shutdown -h now 关机
-r +分钟数 重启
vi:
输入模式 i a
底行模式
命令模式
视图模式:v 进入视图模式
命令:
dd 剪切
yy 复制
p/P 粘贴
r: 修改光标上的字符
R: 修改后边的字符,直到命令结束
<b> 移动到当前单词的开始
<e> 移动到当前单词的结尾
db: 删除单词
dw: 删除单词
debain: deb
redhat: rpm
deb包的组成: 软件包名_版本号_体系架构.deb
deb包的管理机制:
1、本地管理(无法解决依赖关系) 需要sudo dpkg 命令
dpkg -i <package.deb> 安装一个在本地文件系统上存在的Debian软件包
dpkg -L <package> 列出安装的软件包清单
dpkg -r <package> 移除一个已经安装的软件包
dpkg -P <package> 移除已安装软件包及配置文件
dpkg -s <package> 显出软件包的安装状态(是否已经安装)
2、在线管理(可以解决软件包之间的依赖关系)
apt-get
apt-cache
安装包的镜象站点 /etc/apt/sources.list
本地软件包索引: /var/lib/apt/lists
sudo apt-get update 用来更新本地索引, 即更新 /var/lib/apt/lists
sudo apt-get install xxxx(软件包名, 不是全称) 安装软件包
sudo apt-get remove --purge xxx 彻底卸载软件包
安装包的自动下载目录: /var/cache/apt/archives/
sudo apt-get clean/autoclean 删除自动下载目录下的deb包
sudo apt-get --reinstall install xxxx 在不卸载的时,重新进行安装。
sudo apt-get source xxx 就是下载xxx的源码到当前目录下
sudo apt-get upgrade 升级软件包
sudo apt-cache
sudo apt-cache policy xxx 查看已经安装的软件包的状态
sudo apt-cache show xxx 列出软件包的详细信息
sudo apt-cache showpkg xxx
sudo apt-cache depends xxx 找到xxx所依赖的软件包
sudo apt-cache rdepends xxx 找到依赖于 xxxx的软件包
shell: Linux中的Shell就是Linux内核的一个外层保护工具,并负责完成用户与内核之间的交互
Shell是一个命令行解释器
ys@ys-ubuntu:/$
用户名称@主机名称:当前路径$(普通用户)
whoami 列出当前登录的用户名称
hostname 列出当前登录的主机名
命令的使用格式:
Command [-Options] Argument1 Argument2 …
命令 选项 参数
dpkg [-i] sl
一行运行多个命令:需要使用”;“作为分隔符
比如: ls ; cd /
如果一条命令不能在一行写完,在行尾使用反斜杠(\)标明该条命令未结束:
比如: ls \
/home/ys 表示列出/home/ys目录中的文件名
自动补全:
文件名: 一次tab键
命令补全: 两次tab键
history: 查询历史执行的命令
history 列出所允许的最大命令个数
history 10 列出最近操作的10个命令
echo $HISTSIZE 查看环境变量 HISTSIZE的值
彻底修改HISTSIZE的值: 修改 家目录中 /home/linux/.bashrc 中的 HISTSIZE的值即可
修改完成之后需要执行 source ./bashrc 重启配置文件
shell的通配符:
”*“ :表示匹配任意长度的字符串
”?“ :匹配任意一个字符
”[ ]": 匹配中括号中的一个字符。
比如 [0-9] 匹配0-9的数字
[a-z] 匹配a-z小写字母
[A-Z] 匹配A-Z大写字母
[0-9a-zA-Z] 匹配数字、字母
要想匹配多个,需要使用多个[]来完成
[^abc] :表示除了a b c 三个字符外都可以匹配
管道:管道可以把一系列命令连接起来,意味着第一个命令的输出将作为第二个命令的输入,通过管道传递给第二个命令,第二个命令的输出又将作为第三个命令的输入,以此类推。就像通过使用“|”符连成了一个管道。
wc 命令(文件操作):列出行、字符个数、 单词个数
wc -c 统计字符个数
wc -w 统计单词个数
wc -l(字母) 统计行数
输入输出重定向:
“>" :表示输出重定向 后边需要跟一个目标文件。
比如: ls > file 将ls的输出结果写到文件file中
file文件如果没有,就会被创建;如果已经存在就将原内容清空。
”>>" :表示输出重定向,将输出内容追加到目录文件中。
ls >> file 将内容追加到file文件中。
“<" :表示输入重定向
wc -w < file 将内容作为输入源传递给命令
”2> ": 表示错误输出重定向
gcc 的编译错误 2> file
如果是文件执行的结果重定向,那么“>" ,将正确输出定向到文件中,错误还是会显示到终端
如果是文件执行的结果重定向,那么“2>" 将错误输出定向到文件中, 正确的会显示到终端上。
”&>" :表示将所有的信息输出重定向到文件中。
命令置换:将一个命令的输出作为另一个命令的参数
pwd 命令:显示当前所在的绝对路径
命令格式: 命令1 `命令2`
将命令2的结果作为命令1的参数来使用
ls `pwd` 列出当前路径下的文件名
命令别名:alias
alias cc='gcc' 注意是单引号
相当于 为gcc 起别名叫cc
alias 新名字='原名字'
去除别名:unalias
unalias ll(要去除的别名)
shutdown 命令:
sudo shutdown -r +10 重启(10)
sudo shutdown -r now 立刻重启
sudo shutdown -h now 立刻关机
sudo shutdown -h +10 关机时间
sudo shutdown -c 立刻取消正在执行的shutdown操作
sudo shutdown -k +时间 发送一个广播告诉其他登录的用户要进行关机操作,但是不会真正关机。
sudo shutdown -f/-n 其他关机方式
修改密码:
passwd 修改自己的密码
sudo passwd user 要修改user用户的密码
比如给超级用户设置密码: sudo passwd root
su : 直接切换到超级用户
exit: 退出当前的用户
su 用户名: 表示切换到该用户
echo:输出命令, 自带换行符
echo "hello world" 就是原样输出字符串
echo hello world 就是将空白缩短到最小
echo -n xxxxx 输出语句不带换行符
获得系统时间:date
修改系统时间: sudo date -s "year -mon -day h:m:s"
修改时区: 需要将 /etc/localtime 文件替换为 /usr/share/zoneinfo/Asia/Shanghai
清楚终端上的显示:clear
ctrl + L ==== clear
df: 查看磁盘空间的使用情况
df -h 以合适的数据单位显示磁盘使用
df -T 显示文件系统的信息
df -Th 显示文件系统的信息,以合适的单位
df -a 显示所有物理文件系统的使用情况,包括虚拟文件系统,如/proc、/sys等
df -k 以kB为单位显示
df -aTh
du: 查看文件使用此磁盘的情况
du -mh file(文件) 以合适的单位显示文件占用磁盘情况
du -sh xxx(目录) 查看目录占用磁盘空间
用户管理:
/etc/passwd :记录系统用户的信息
ys :x :1000:1000: ys,,,: /home/ys :/bin/bash
用户名 密码 用户id 组id 个人信息 家目录 对应的shell解释器
/etc/shadow :存放着用户的密码
/etc/group :存放着用户组信息
ys: x :1000: 改组的成员
组名 组密码 组id
添加新用户:
sudo adduser 用户名
添加过程 从 /etc/skel 目录中复制文件到新用户的家目录下
su 用户名: 表示切换到该用户
exit 表示从当前登录的用户中退出
删除用户:
sudo deluser 要删除的用户名
彻底删除用户(包括家目录): sudo deluser --remove-home 用户名
小问题:要执行删除用户的操作, 必须要保证该用户不在登录状态(exit退出)。
在一个已经存在的用户组添加一个新用户:
sudo adduser 新用户名 --ingroup 组名
添加一个用户组:
sudo addgroup 组名
删除一个组:
sudo delgroup 组名
vipw: 直接打开/etc/passwd 文件
sudo vipw
usermod: 修改用户属性
sudo usermod -p xxx 用户
查看进程:
ps 查看正在运行的进程
ps -ajx 显示当前系统中的进程的详细信息
ps -aux 显示当前系统中的进程的详细信息
top:命令 ,动态显示系统当前的使用情况
pstree: 显示当前系统中的进程的树状图
kill 命令: 是用来发送信号的
kill -l(是字母) 列出当前系统所支持的信号类型
kill -9 pid 杀死pid的进程(发送一个杀死信号)
修改文件的属性:chmod chown chgrp
chown:修改文件的属主
修改文件所属于的用户:sudo chown 新用户 文件
同时修改文件的属主和组: sudo chown 用户:组 文件
chgrp: 修改文件所属于的组
sudo chgrp 新组名 文件
chmod:就是修改文件的权限。
文件权限?
ll 命令可以列出文件的权限 读、写、执行
rw- rw- r--
属主权限 属组的权限 其他人的权限
r: 表示该文件可读
w: 表示文件可写
-:表示什么没有
x: 表示可以执行(有执行权限)
chmod 664 file 表示将文件的权限修改为 rw- rw- r--
110 110 100
chmod 777 file 表示将文件的权限修改为 rwx rwx rwx
文件系统:就是对磁盘的访问和管理的一种机制
linux文件系统分类:
磁盘文件系统:针对真实的存储介质,
FAT16、FAT32、NTFS 、ext2、 ext3 、ext4
网络文件系统:是可以远程访问的文件系统
虚拟文件系统:存在于内存当中, 常见的有tmpfs proc sysfs
sudo usermod -G linux yys 关联yys用户和linux组,这样就可以在/etc/group中看到成员列表
文件系统:就是对磁盘的访问和管理的一种机制
linux文件系统分类:
磁盘文件系统:针对真实的存储介质,
FAT16、FAT32、NTFS 、ext2、 ext3 、ext4
网络文件系统:是可以远程访问的文件系统
虚拟文件系统:存在于内存当中, 常见的有tmpfs proc sysfs
系统上的硬盘:/proc/partitions文件查看
df -aTh
linux上一切皆文件(操作方式按照文件来操作)
分区:
linux的分区在目录中 / 20G
/home 10G
windows的目录在分区中
文件与目录的操作命令:
pwd 获得绝对路径
ls:
ls -a 列出当前目录下所有文件, 包括隐藏文件
. 当前目录
.. 代表上层目录
ls -l 列出文件的详细信息
ls -R 递归的显示当前目录中的所有文件
ll 列出文件详细信息
- rw------- 1 ys ys 5618 Jul 23 20:48 file
文件类型 权限 硬链接个数 用户 组 大小(字节) 最后修改时间 文件名
linux文件类型:有7种
b 属于块设备
c 字符设备
d 目录
- 普通文件
l 链接文件(软连接)
s 套接字(网络)
p 管道
cd: 改变工作目录的
cd 表示回到家目录
cd .. 进入上层目录
cd . 当前目录
cd ~ 表示回到家目录
cd /ect/init.d/xxxx/ 按照绝对路径进入某一个目录中
cd ../../../../ 进入上上层目录
cd dir 进入当前目录中的dir目录
cd ~/C/xx 进入家目录/C/xx目录中
cd - 进入上一次操作的目录
touch 1)创建一个新文件
2)更改文件时间戳
file: 命令功能用于判定一个文件的类型、格式、运行架构等
file xxxx(文件)
cp: 文件或者目录复制
文件操作:
cp file1 file2 将当前目录中的文件file1, 复制一份改名为file2
cp file1 /xx/xxx/ 将当前目录中的文件file1, 复制到绝对路径中名字不变
cp file1 /xxx/xxx/file2 将当前目录中的文件file1, 复制到绝对路径中名字变为file2
cp /xxx/xx/file1 .(必须有目的路径) 将绝对路径中的文件file1 复制到当前目录, 名字不变
cp /xxx/xxx/file1 /yyyy/yyy/ 将绝对路径中的file1复制到绝对路径中,名字不变
cp /xxx/xxx/file1 /yyyy/yyy/file2 将绝对路径中的file1复制到绝对路径中,名字变为file2
目录操作:
cp dir1 dir2 -a 复制当前的dir1目录,改名为dir2
-a: 拷贝所有的东西,包括软连接
-r: 递归拷贝,软连接会丢失
cp dir1 /xxx/xxx -a 将当前目录中dir1, 复制到绝对路径中名字不变
cp dir1 /xxx/xxx/dir2 -a 将当前目录中dir1, 复制到绝对路径中名字变为dir2
cp /xxxx/dir1 /yyy/ -a 将绝对路径中dir1 复制到绝对路径中目录, 名字不变
cp /xxx/dir1 /yyyy/dir2 -a 将绝对路径中dir1 复制到绝对路径中目录, 名字变为dir2
mv:
1)移动文件
2)重命名
mv file1 file2 将当前目录中的file1重命名为file2
mv dir1 dir2 将当前目录中的dir1重命名为dir2
mv file1 /xxx/xxx/ 将当前目录中的file1 移动到绝对路径中,名字不变
mv file1 /xxx/xxx/file2 将当前目录中的file1 移动到绝对路径中,名字变为file2
mv /xxx/file1 /yyy/ 将绝对路径中file1复制到绝对路径中目录, 名字不变
mv /xxx/file1 /yyy/file2 将绝对路径中file1复制到绝对路径中目录, 名字变为file2
mv /xxx/file1 /xxx/file2 修改绝对路径中的文件名字
rm: 删除命令(谨慎操作)
rm file 删除文件
rm file* 通配符删除
-r :递归删除,操作目录
-f: 忽略文件或者目录是否存在
rm -rf dir1 删除目录dir1
rm -rf /xxx/yy/dir1
rm 删除目录的特点:无论目录是否为空,都可以删除。
mkdir: 创建目录
mkdir xxx 在当前目录中创建一个目录xxx
mkdir /xxx/xxx/dir 在绝对路径中创建一个目录
mkdir -p /xxx/yyy/zzz 嵌套创建多级目录
rmdir 只能删除空目录
cat :查看文件内容
cat file 在终端上显示该文件的内容
cat -n 显示文件内容时,携带行号。
cat -vE file 在文件每一行的结尾添加一个$符号
cat xxx > file 重定向时使用
echo "helloworld" > file
head :从头查看文件的前几行内容
head -10 file 表示要查看file文件的前10行。
tail: 从文件结尾显示后几行内容
tail -10 表示显示后10行
head、tail配合使用:
head -xx file | tail -xxx
软链接:相当于快捷方式,源文件被删除时,链接文件就无法使用
硬链接: 多个链接指向的是同一个文件,只有硬链接的个数变为0时,才会从磁盘上删除。
ln命令:
创建软链接: ln -s 源文件名 链接文件名
源目录名字 链接目录的名字
如果链接文件的路径发生了变化,可能会导致之前的链接无法使用,除非链接是绝对路径。
比如: ln -s /xxx/xxx/file(源文件的绝对路径) link
创建硬链接 : ln 原文件名 链接文件名
目录无法创建硬链接
压缩命令:
gzip: gzip file 就是将file文件压缩为file.gz
源文件会消失
gunzip: gzip的解压命令
gunzip xxx.gz
gzip -l xxx.gz 查看文件压缩情况。
bzip2: bz2的压缩命令
bzip2 file
bunzip2 file.bz2 解压命令
zip :压缩文件、目录
压缩命令 zip -r xxx.zip dir 将目录dir压缩为xxx.zip
解压命令 unzip xxxx.zip
tar命令:
归档:tar -cvf 1.tar dir
-c 创建归档文件
-v 显示归档过程
-f(归档名之前) 指定归档后的文件名
归档并且压缩:
tar -cjvf 1.tar.bz2 dir
就是将dir目录归档压缩为bz2格式
-j :指定压缩方式为bzip2
-z :指定压缩方式为 gzip
-J :指定压缩方式为xz
解压命令:
tar -xvf xxx.tar.xx 解压压缩包
tar -tf xxx.tar 查看归档文件的组成
tar -uf xxx.tar file 就是将file文件添加到xxx.tar的归档包中
less/more 分屏显示文件内容, 按q退出
grep :用来进行字符串查找
grep -Rn "字符串“ 查找路径
-R :递归查找
-n: 显示字符串所在的文件的行号。
grep 支持shell的通配符、正则表达式等。
sort: 默认对文件内容进行升序排列
sort file -o file 表示将排序后的内容写入到源文件
sort -r file 按照降序排列
如果文件内容为字符‘0-9‘,会按照ascii比较
sort -n file 排序时按照数值大小进行
uniq: 在终端上显示去除文件中相邻重复行后的内容
uniq -c file : 表示统计文件中相邻重复的行数
diff: 比较文件的内容是否一致,会列出不一致的地方。
如果文件内容一致,那么没有任何提示。
which:查找实用命令
whereis: 查找命令或者程序
who: 显示当前登录的用户名
find : 递归查找文件
find 查找路径 -name 文件名(可以使用通配符) /按照文件名查找
find 查找路径 -perm 666 /按照文件权限查找
find 查找路径 -group 组名 /按照文件分组查找
配合管道使用: find . | grep "查找关键字”
cut: 进行域的分隔
cut -d "xx" -f xx, xxx
-d: 指定分隔符
-f: 指定要显示的域
比如:cut -d ":" -f 2,3 表示要显示以“:”作为分隔符的第2和第3个域的内容。
网络配置:相关文件 /etc/network/interfaces
/etc/resolv.conf
/etc/init.d/networking
ipv4 ip地址类型: A B C D E
ip地址组成: 网络id + 主机id
子网掩码: A 255.0.0.0
B 255.255.0.0
C 255.255.255.0
ifconfig: 查看和配置网络的命令
通过ifconfig命令临时修改网络连接:
ifconfig eth0 192.xxx.xxx.xx 修改eth0的ip地址
虚拟机网络:
1)共享主机网路
2)独立于主机(桥接模式)
通过配置文件修改网络:见文件
网络配置:
route 可以显示当前的路由表信息
ifconfig eth0 192.xxx.xxx.xx 修改eth0的ip地址
route add default gw 192.168.1.1
route add netmask 255.255.255.0
netstat :用于网络查看,配置等。
ping: 用于测试网络连接。
ping IP 测试本机和对应IP的连接状况。
ping -c 10 IP
-c: 指定ping的次数
nslookup: 查看对应的域名的详细信息。
nslookup www.baidu.com
shell编程:
shell脚本(是一系列命令的集合)
解释器: bash sh
编写shell脚本的步骤:
1、
#: 在shell中是注释的意思。
#!/bin/bash 声明脚本使用的解释器
2、脚本要执行必须要有执行权限:
1) chmod a+x test.sh
2) bash ./test.sh
变量的定义和使用:
value=1 定义和赋值:注意”=“左右不能添加空格。
echo $value 使用: 注意需要跟上“$"符号,表示取值的意思。
用户自定义变量 :比如value
位置变量、预定义变量即命令行参数 :
$0 与键入的命令行一样,包含脚本文件名
$1,$2,……$9 分别包含第一个到第九个命令行参数, 如果超过9个参数,需要${10} ${11}
“$"符号本身输出需要进行转义。
$# 包含命令行参数的个数
$@ 包含所有命令行参数:“$1,$2,……$9”
$? 包含前一个命令的退出状态
退出状态: 0, 表示正常退出
其他: 表示非正常退出。
$* 包含所有命令行参数:“$1,$2,……$9”
$$ 包含正在执行进程的ID号
环境变量
比如 PATH TERM LD_LIBRARY_PATH HOME(家目录)
read: 从终端上读入变量值。
read value
read value1 value2 value3 ,那么多余的输入全部赋值给最后一个变量
可以进行连续调用:read value1
read value2
expr: 实现简单的整数运算。
加 +
减 -
乘 \*
除 /
取余 %
"``" :表示取该命令的执行结果, 比如: sum=`expr a + b `
test: 测试, 也可以使用 [] 来代替
测试数值大小
测试字符串是否一致 test "hello" = "world" ,通过查看echo $?的值判断是否一致。
0表示为真, 非0表示为假
测试文件类型
测试退出状态
字符串的测试:
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0
文件类型:
-d name 测试name 是否为一个目录
-f name 测试name 是否为普通文件
-L name 测试name 是否为符号链接
-r name 测试name 文件是否存在且为可读
-w name 测试name 文件是否存在且为可写
-x name 测试name 文件是否存在且为可执行
-s name 测试name 文件是否存在且其长度不为0
-e xxx 判断xxx是否存在
-a xxx 判断xxx是否存在
f1 -nt f2 测试文件f1 是否比文件f2 更新
f1 -ot f2 测试文件f1 是否比文件f2 更旧
数值大小:
a -eq b 测试a 与b 是否相等
a -ne b 测试a 与b 是否不相等
a -gt b 测试a 是否大于b test $a -gt 10
a -ge b 测试a 是否大于等于b
a -lt b 测试a 是否小于b
a -le b 测试a 是否小于等于
结构性语句:
条件测试语句(两路分支)、多路分支语
句、循环语句、循环控制语句和后台执行语句等。
if结构:
if [ ] ##在[]的左右必须添加空格
then
条件为真时要执行的命令
fi
exit 数字 ##### 退出,不同的数字代表退出状态。
问题:
从终端上读入分数 0-100
>= 90: 'A'
>= 80 : 'B'
>= 60 : 'C'
< 60 : 不及格
if中使用或运算:
-o: 或运算符号
if [ $score -lt 0 -o $score -gt 100 ] score < 0或者 score > 100
-a: 与运算符
if [ $score -ge 0 -a $score -le 100 ] 0=< score <= 100
if另一种结构:if then .. elif ...then fi
if []
then
xxxxxx
elif []
then
yyyyy
elif []
then
zzzz
else
xxx
fi
多路分支语句case:
case…esac
case 变量 in
10) xxxx
;;
20) yyyyy
;;
30) zzzzz
;;
*) xxxxxx ###默认情况是*
;;
esac
case $num in
9|10) ###满足9后者10
echo "A"
;;
esac
循环语句:
for 循环:
for xxx
do
要执行的命令
done
for value ####当从终端上读入参数可以
do
echo "value = $value"
done
for xx in yyy
do
xxxxx
done
在列表中空格表示换行
问题:
传递一个文件名参数
遍历当前目录下的文件名 ,如果找到和参数一致的,那么输出find,并且exit 退出
如果没有找到, 输入not find。。
问题:使用for循环遍历从命令行中传入的参数(数值),
判断参数是否是偶数, 如果是,那么就输出。
while循环:
while xxx
do
要执行的命令
done
问题:使用while循环,在当前目录下创建file_1 到file_10 10个文件
while true ####代表死循环
do
done
break n 跳出n层循环。
continue
shell函数:
定义方式两种:
function_name ( ) ####常用的定义方式
{
command1
……
commandn
}
function function_name ( )
{
command1
……
commandn
}
比如:
sum() ###括号是空的。
{
sum=`expr $1 + $2` ###此处的 $1, $2不在是命令的位置参数
他们是调用该函数时传递的两个参数。
}
函数的两种调用方式
1、sum 10 20 ##直接调用函数sum,并且传递两个参数10和20, 不需要函数的返回值。
2、ret=`sum 10 20 ` ##调用函数sum,并且传递两个参数10和20, 需要接收函数的返回值并且赋值给ret变量。
函数中的return 不可以返回函数的执行结果,return只能返回函数的执行状态。
函数中要想返回结果,那么必须使用 echo $value
问题:
1、从终端上读入一个用户名
2、在函数判断该用户是否处于登录状态
如果是,就输出
如果不是,就输出。
结构体:
结构体的构造:构造数据类型的定义。
struct Stu
{
char name[32]; //结构体成员。
int age;//结构体成员。
float score; //结构体成员。
};
构造类型变量的定义: 构造类型名 变量名字
比如: struct Stu one;
问题:
1、 定义一个包含name,age ,score的学生信息结构体
2、实现学生信息的输入函数,从标准输入中输入每个学生的所有信息(学生有多少个,自己定义)
3、实现排序函数,通过学生信息的score来对学生进行排序
4、实现信息输出函数, 输出排序后的学生信息
union: 定义共用体类型, 使用方法和结构体一样。
union Name
{
};
存储类型:auto register static extern
int a;
register int a;
static int a; a 就是静态变量,只会初始化一次。后续会保留上一次操作的值。
static 修饰函数,表示该函数只能在当前文件中被调用。
extern: 外部引用
extern 修饰函数表示,该函数是调用其他的文件的。
extern 修饰变量表示,该变量是引用其他文件的。
栈 stack:存放在栈上的数据,在函数调用完成之后,所占的栈空间都系统自动回收。
堆 heap :堆空间需要程序员手动申请, 当不需要时,那么需要手动释放空间。
只申请空间,不释放:叫做内存泄露。
堆空间申请/动态内存申请:
void * malloc(size_t num)
参数num:就是要申请的字节个数。
返回值:返回申请到的空间的起始地址。
出错,返回NULL,所以通常需要做出错判断。
void free(void *p)
参数:申请到的空间的起始地址
free(p);
p = NULL; 避免double free。
释放堆空间时,不可以进行双重释放。
通过valgrind命令来检测 代码是否有内存泄露。
valgrind --tool=memcheck ./a.out 打印使用堆空间信息。
gcc test.c -DDEBUG
-D: 指定宏定义
Make: 工程管理器,编译源码
Make将只编译改动的代码文件,而不用完全编译
Makefile:是一个用来编译代码的文件。
Makefile按照规则来编译代码。
一条规则的基本构成如下:不要带有行末空格
目标:依赖文件
Tab键 编译命令
变量的定义:
var = 1
$(var) 表示var的值
用”$”则用”$$”来表示
Makefile中的四种赋值:
=
+=
?= 如果之前已经赋过值,那么不在赋值。
:= 直接展开和向后引用相反。
自动变量:
$< 第一个依赖文件的名称
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
默认第一目标为Makefile的终极目标
执行步骤:
make 默认执行当前目录下的Makefile文件
make clean 删除中间文件
make -f xxx 指定执行文件名为xxx的Makefile文件。
注释:使用 “#”