1.1 课程目标
熟悉Linux操作系统
掌握Linux下的常用命令
掌握Linux下的Shell脚本编写
高级C内容(指针 结构体 共用体 枚举 函数 动态内存管理)
掌握工程目录搭建
掌握make(gnu-make工程管理工具的使用)
掌握makefile的编写
1.2课程特点
内容多
linux命令非常多
难度不大
注意:总结 梳理 回顾
1.3 Linux操作系统
3.1什么是操作系统
架设在软硬件之间的系统软件,实现计算机资源的管理,资源的分配和调度
3.2 os的作用
提供给用户便于操作的计算机软硬件资源的接口(工具)
3.3 os的分类
开源和闭源 os
开源os: Linux Uc-os II
闭源:window,Mac OS
嵌入式因为需要可裁剪的os,因此大多数使用的是开源的os
批处理操作os
分时os:按照时间片轮转的方式进行处理 千万分之一秒
实时os :百万分之一秒
常见的实时os:uC-OS II,实时版linux,RT-Thread
非实时操作系统:window,linux
多任务os:多个应用程序可以同时执行os,一般都是多任务的
多用户os:支持多个用户同时使用os
常用的嵌入式os(可裁剪):
Linux ,μc-OS II, Android ,ios ,windows ,embedded(可嵌入的)
3.4 Linux os
Linux是一个开源,多任务,多用户,有实时版和非实时版的os
3.5Linux操作系统的来源和发展
丹尼斯.里奇 肯.汤姆森 c的创始人
3.6Linux os 的结构
kernel(核心) shell(壳)
3.7 Linux OS 的内核结构
kernel:
内存管理模块:负责内存的管理(开辟,释放,读写)
进程管理模块:对任务的创建,管理,调度,销毁等操作和维护
文件系统:组织,管理文件的设备
网络管理模块:协议栈和网卡操作
3.8 Linux OS 的特点
开源,支持多任务,支持多用户,
跨平台(支持多cpu) CPU架构:x86 x86_64 ARM MIPS
内核可裁剪:(有选择保留某些模块,而删除一些模块的功能,内核部分代码可以不用编译,可以修改内核部分的代码,添加驱动等) 有实时版和非实时版(及时响应)
GNU:搞个开源的os
GCC(GUN complication collection):c c++ object-c object-c++ fortran java
GPL:凡是使用GNU工具开源端的软件,必须开源
LGPL:阉割版的GPL,可以不开源,但是库和库的详细说明必须提供
林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds, 1969年~ ),著名的电脑程序员(程式师)、黑客。Linux内核的发明人及该计划的合作者
Linux开源于MINIX,MINIIX来源于UNIX,Linux使用GNU的开发工具,于是开源了,UNIX os
类UNIXos:DSB UNIX , AT&T UNIX , Mac OS. GUN/Linux
类Linux的os:CentOS, RedHat, Debian,Unbuntu
POSIX(protable operating system Interface 可移植操作系统接口)这个类UNIX操作系统的接口
《微机原理》《计算机组成原理》
1.4常用的Linux命令
Linux命令(shell命令)
Linux提供了一个shell软件,shell是一个解释器
shell是用来解释命令(对用户来说就是特殊字符串),解释成os能够理解的命令。
shell命令就是Linux命令
将一堆按照一定逻辑编写的shell命令,写入一个后缀名为.sh文件中,.sh后缀的文件称为shell脚本
shell解释器可以解释shell命令和shell脚本
shell解释器什么时候打开的?
打开一个终端,默认打开一个shell解释器(默认的shell解释器:
bash(猛击))
终端:
最开始是一种设备,可以让用户更为方便的和计算机进行交互
随着技术的发展。拜托了终端的额概念,已将将终端这个功能做进了os
Linux下的终端分类:
终端:os默认提供的终端
字符界面终端:只有字符串交互没有图形化
图形界面终端:有图形化界面操作
伪终端:应用程序开发者使用软件模拟的终端
pts开的是伪终端
1.5 常用的shell命令分类
-
- 文件管理命令
创建:
touch
vi+文件名
gedit +文件名
删除:
rm 文件名
rm -r//全部删除
rmdir//下面没有文件才删除
复制
cp -r srcfilename dstfilename//复制全部
重命名
mv filename newfilename
移动
mv srcfiename dstfilename
查看文件信息:
ls
ls -l
ls -a
输出文件内容
文件编辑
-
- 文件操作命令
- 磁盘操作命令
- 进程管理命令
- 网络管理命令
- 用户管理命令
- 软件管理命令
1.6文件类型和文件权限
文件类型socket(plug插座,插口)
字符是 c ,这表示字符设备文件。比如猫等串口设备。
b,这表示块设备,比如硬盘,光驱等设备;
这个种类的文件,是用mknode来创建,用rm来删除。目前在最新的Linux发行版本中,我们一般不用自己来创建设备文件。因为这些文件是和内核相关联的。
套接口文件
当我们启动MySQL服务器时,会产生一个mysql.sock的文件。
1
2[root@localhost ~]# ls -lh /var/lib/mysql/mysql.sock
srwxrwxrwx 1 mysql mysql 0 04-19 11:12 /var/lib/mysql/mysql.sock
注意这个文件的属性的第一个字符是s,是socket的缩写。
符号链接文件
查看文件属性时,会看到有类似 lrwxrwxrwx,注意第一个字符是l,这类文件是链接文件。是通过ln -s 源文件名 新文件名。lrwxrwxrwx 1 root root 11 04-19 11:18 setup.log -> install.log,表示setup.log是install.log的软链接文件。
man gcc(命令)查看响应命令的功能
用户通过自己调用app shell命令来执行文件
系统调用:os提供访问软硬件资源的接口
sprintf: int sprintf(char *string, char *format [,argument,...]);
将p1中的字符+string写入到p2中
2.1shell命命令
1、用户切换命令(su)
gedit是一个Linux环境下的文本编辑器utf编程,类似windows下的写字板程序,在不需要特别复杂的编程环境下,作为基本的文本编辑器比较合适。
su – 用户命:su – linux <==>su - :改变路径
su root:只是改变用户身份,不改变路径
注意:一般不使用root用户命,要使用加一个sudo,给一个临时的管理员权限
2.2系统管理命令
top:动态显示系统中运行的程序
ps:显示当前系统由该程序用户运行进程的列表
ps -ef:查看所有进程机器PID(进程号)
ps -aux:除了显示-ef显示之外,还可以,cpu,显示内存占有率
sudo shutdown -h now:立刻关机
sudo reboot:重启
kill -l:列出说有可用的信号名称
2.3磁盘相关命令
free:查看当前系统内存使用情况
df: 查看文件系统的磁盘空间的占用情况。
du:统计目录(或文件)所占磁盘空间的大小
fdisk:用于查看硬盘的分区情况
sudo fdisk -l:使用的时候必须使用root权限
2.4chmod
作用:修改文件的访问权限
(1):
u 文件拥有者
g 所属的用户组
o 其他用户
+ 表示增加全选
- 表示删除权限
= 设置权限
2.5chown
修改文件所有者和组别
修改用户:
sudo chown zhangsan hello.c
同时修改用户和组
sudo chown linux:zhangsna hello.c
2.6 chgrp
作用:修改文件组的所有权
注意:chown和chgrp必须使用root权限
alias :起别名
永久生效:添加到.bashrc
` `:反引号 当关键字使用
cat:查看文档,适合查看比较短的文档
more:适合查看比较长的文档 回车翻一行 空格翻一页
less: 加强版的more 支持上下箭头
wc -l:统计文件多少行(line)
wc -c:统计文件有多少字节(character)
2.7特殊字符
*:匹配任意长度的字符串(匹配任意个字符)
touch 1.c 2.c 3.c 4.c 1.txt 2.txt
mkdir test
mv *.c test//将所有.c移动到test里去
?:匹配一个长度的字符
mv ?.c test //1.c移动 mv ??.c test
[…]: 匹配指定的一个字符 //mv[1a].c test 一个带有1.c a.c移动
[-]:匹配指定的一个字符范围//mv[1-2].txt test
[^…]:除了指定的字符均可匹配 //mv[^31].c test
只针对于一个字符
2.8管道
l:将前一个命令的输出作为后一个命令的输入
ls test I grep(查找+一个字符串) hello.c
grep 字符串:查找字符串
>: 输出重定向,如果文件不存在,则新建,如果文件存在则覆盖源文件内容//
>>:追加重定向,如果文件不存在则新建,如果文件存在则追加在文件的末尾
硬链接和软连接
硬链接:利用Linux中为每个文件分配的物理编号建立链接
软链接:利用文件路径名建立链接
注意:
相同点:
(1)ln会保持每一处链接文件的同步性,也就是说,无论改变哪一处,其他文件都会发生改变。
区别:
硬链接:会在用户选定的位置上生成一个和源文件大小相同的文件
软链接:会在用户选定的位置生生成一个文件镜像,不会重复占用磁盘空间,平时使用最多的是软链接
2.9 打包压缩命令
压缩工作:gzip、bzip2
压缩:只能压缩文件
gzip文件名
bzip2 文件名
解压:
(1):
gzip -d 压缩包名
bzip2 -d 压缩包名
(2):
gunzip 压缩包名
bunzip2 压缩包名
注意:gzip和bzip2 只能压缩单个文件,不能压缩目录
tar:对文件目录进行打包或解包
-c:打包
-x:解包
-v:显示打包或解包的详细信息
-f:指定包名(该参数必须放在最后)
-z: 调用gzip来压缩打包文件,于-x连用完成一个解压缩
-j: 调用bzip2压缩打包文件,于-x连用完成一个解压缩
打包、压缩:
解压、解包
打包压缩一体化
解压解包一体化
2.10 环境变量
env:查看系统中所有的环境变量(在任何情况下都可以执行,如ls)
(1)临时添加
临时添加只对当前终端有效,如果当前终端关闭,添加的环境变量就不存在了
echo(回声、暗示) $PATH(必须大写)//查看环境变量
export PATH=$PATH:(从根路径下开始)/hom/linux a.out可执行文件
:冒号表示下一个
window;分号表示下一个
(2)永久添加
sudo vim /etc/profile(轮廓 形象 印象)
在文件的末尾添加 export PATH=$PATH:
添加完成之后重启sudo roboot或者source /etc/profile
2.11 用户管理命令
相关配置文件:
/etc/passwd 系统能够识别的用户清单
/etc/shadow 加密的用户清单,只有超级用户可用访问,用来保护加密口令的安全
/etc/group 组的名称和组的成员列表 每一行带表一个组
2.12添加用户
sudo adduser 用户名
删除用户:
sudo deluser 用户名 –remove-home(连同home目录下的用户名也删除)
添加组:
sudo groupadd 组名
修改用户所在的组:
sudo usermod -g 目标组 被修改的用户
修改密码:
sudo password zhangsan
删除组:
sudo groupdel 组名
2.13 linux共享文件
查看ip地址:ifconfig
虚拟机->设置->选项->共享文件夹->总是启用
/mnt/hgfs之下
2.14网络配置
测试虚拟机是否有网
ping www.baidu.com
有网
(1)虚拟机->设置->网络适配器
nat没有网设置成桥接模式
(2)编辑->虚拟网络编辑器->更改设置
配置静态ip
windows网络配置
ip地址
主机唯一标识:
ip地址组成:网络地址+主机地址
分类A B C D E
A类IP地址
1字节网络地址+3字节主机地址网络地址最高位必须是0
范围:1.0.0.0 ~126.255.255.255
B类IP地址
2个字节的网络地址+2个字节的主机地址,网络地址的最高位必须是10
3.1shell脚本
touch
vi+文件名
gedit +文件名
c语言(强类型语言) gcc test.c ./a.out 先编译后运行
shell(弱类型语言)。不需要编译,直接运行
shell脚本:一堆命令的集合
1、创建shell脚本
#表示脚本
(1)新建文件vim 1.sh(后缀.sh)
(2) 编辑文件
(3)shell脚本在使用的时候没有权限在使用的时候需要认为添加权限
(4)给.sh添加权限 chmod u=x 1.sh chmod 777 1.sh
(4)运行
./1.sh
date日期 cel
3.2shell变量
shell中允许用户建立 变量存储类 不支持数据类型
用户自定义变量:
(1)由数字、字母、下划线组成,且首字母不能为数字
(2) shell变量一般用大写表示
注意:任何赋给变量的值都被shell解释为一串字符
注意:再给变量赋值的时候=两边没有空格
取变量的值时,在变量前加$
夹括号${}变量中有多个字符用花括号括起来,多个字符
预定义变量
$#:包含命令行参数的个数
$@:包含所有命令行参数
$*:包含所用命令行参数
$?:包含前一个命令的退出状态(在shell中0为真,1为假)//可于判断前一个文件是否创建完成
$$:包含正在执行的进行的ID号
不包含可执行文件(命令传参)
3.3环境变量
env查看所有环境变量
1、在主目录下创建一个文件夹(shell),在该文件夹中新建一个脚本文件叫做1.txt,然后向该文件中写入”hello shell”//写一个脚本文件将命令全部放入里面.
3.4shell程序和语句
说明性语句
#:注释
功能性语句
输出:echo ““ 自带换行 //echo ”hello shell”自动换行
echo -n “”//不换行
输入:
read $NUM1 $NUM1
read -p “请输入两个字符:” NUM1 NUM2 //一定要加空格
read -p “请输入两个字符:
” NUM1 NUM2 //下一行输入
当输入的过程中有空格时,分多次进行输入
echo “NUM1 = ${NUM1},NUM2 = ${NUM2}
3.5 算术运算
算数运算命令expr主要进行简单的整数运算 + ,-, \*(*相当于通配符), / % 赋值不能有空格 赋值必须+’’当作一个整体赋值
注意:(1)想要将结果赋值给一个变量必须使用反引号
(2)expr与变量以及变量与运算符直间必须加空格
3.6 test命令
测试:字符串、整数、文件属性(主要用于测试文件属性)
测试字符串:
s1=s2测试两个字符串是否相等
s1!=s2测试两个字符串是否有差异
-z s1 测试s1字符串的长度是否为0
-n s1 测试s1字符串的长度是否不为0
$?:包含前一个命令的退出状态(在shell中0为真,非0为假)
test可用用[] 代替
注意:”[”的右边和”]”的左边以及运算符的左右两边必须有空格
测试整数:
a -eq b 测试a于b是否相等
a -ne b 测试a于b是否不相等
a -gt b 测试a是否大于b
a -ge b 测试a是否大于等于b
a -lt b 测试a是否小于b
a -le b 测试a是否小于等于b
测试文件属性:
-d name 测试是否为一个目录
-f name 测试是否为普通文件
-L name 符号链接
-r name 测试name是否存在且可读
-w name 是否存在且可写
-x name 是否存在且可执行
-s name 是否存在且长度不为0
f1 -nt f2 测试f1是否比f2更新
f1 -ot f2 测试f1是否比文件f2更旧
3.7 结构性语句
单分支选择
if[表达式]
then
语句
fi //和{}作用一样
双分支选择:
if[表达式]
then
语句1
else
语句2
fi
空格都不能差
多分支选择
if [表达式1]
then
语句1
elif[表达式2]
then
语句2
.......
elif[表达式n]
then
语句n
else
语句n+1
fi
多了分支选择语句
case 字符串 in
模式1)
命令表1
;;
模式2)
命令表2
;;
.....
模式n)
命令表n
;;
*)
;;
esac
for语句
for 变量名 in 单词表
do
语句
done
方式1:
变量一次取单词表中的各个单词,每取一次单词,就执行一次循环体
4.1 while 语句
while [表达式]
do
语句
done
break
作用:跳出循环
break 2 //后面根数字跳出基层循环
4.2 函数
函数名()
{
}
function 函数名()
{
}
注意:一般使用方式二
调用
变量=`函数名(实际参数)`
函数名(实际参数)//一般使用这个
注意:(1)子函数中的$n并非shell中的$n
(2)子函数中的所有输出都传递给了主程序中的变量
4.3结构体
描述一类事物相关属性的集合,是一个中自定义数据类型
定义:
struct 结构体名
{
属性1;
属性2;
};
struct student
{
char name[20];//姓名
int age;//年龄
};//定义了一个结构体结构体的数据类型:struct student
初始化:
int a=0;
struct student stu={“zhangsan”,12};
访问:
(1)变量名.成员
stu.name
(2)指针访问
struct student *p=NULL;
p = &stu;
(*p).name p->name
(*p).age p->age
字节对齐
一次性分配多少个字节
自然对齐方式(32os)
char: 1 字节对齐
short: 2 字节对齐
int : 4 字节对齐
float : 4字节对齐,分配的时候分配两次
int: 4 double : 8 float :4 short: 2
字节对齐:选成员中最大的对齐
(os)字节对齐一次性分配8个字节
5.1 节省空间的方法
1、最大的放在最前面
2、位域/位段
未优化之前:
优化之后:
注意:位域不能使用标准输入进行输入找不到地址,标准输入一次是一个字节,而位域是bit类型型的 month 31 11111二进制占5个比特位。
stduent中引用date,date结构体必须在student前面声明
用直接初始化的方法解决:
struct student stu = {“zhangsan”,18,2001,11,11};
5.2给结构体取别名
(1)typedef int date_type;
typedef struct student
{
char name[N];
data_type age;
}stu;
stu s={}
(2)
main()
{
typedef struct student stu;
Stu stu;
}
方式1:
方式2:
结构体之间相互赋值:
5.3 malloc函数
头文件:
#include <stdlib.h>
void *malloc(size_t size)
功能开辟空间的大小
返回值:成功返回申请到的空间的首地址,失败返回NULL
注意:(1)malloc 申请到的空间没有名字,返回的只是首地址
(2) malloc 申请到的空间是连续的
prror=printf(打印一个错误信息)
free(ps)释放ps指向的地址空间,释放完后ps的地址仍然存在变成野指针了,所有的NULL一下编程空指针
5.3自定义文件
头文件
宏定义
结构体类型的定义
枚举的定义
函数声明
vi -p 1.c 2.c同时打开2个文件
头文件:“”和<>的区别:
“”:用户的工作路径下搜素头文件“stu.h”
<>:从标准库路径下搜素头文件
查看标准库路径;locate stdio.h
/usr/include/
多文件编译:
#ifndef 文件名 (一般用大写表示,所有的.换成_)
// #ifndef _STU_H
#define 文件名
//#define _STU_H
#endif
//#endif
作用:防止头文件重复定义
直接可交换值: