linux学习总结
day1
一、嵌入式linux操作系统
-
1、什么是嵌入式操作系统
- 操作系统是管理和控制计算机硬件与软件资源的计算机程序,它是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行
-
2、操作系统的分类
-
1、批处理操作系统
-
2、分时操作系统
-
3、实时操作系统
-
4、嵌入式操作系统
-
概念:以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于对功能、可靠
性、成本、体积、功耗有严格要求的专用计算机系统。 -
组成:微控制器、晶振、内存(SRAM,SDRAM等)、存储器(ROM,FLASH,SD等)、其他外围设备接口、输入输出接口
-
分类
- Linux
- μC/OS
- windows CE
- Vxworks
- QNX
-
-
5、个人计算机操作系统
-
6、网络操作系统
-
7、分布式操作系统
-
-
应用领域
-
1、工业控制
- 机械手臂、集装箱起重机、工业机器人、电机驱动器、智能测量仪、智能控制器、智能数控机床等
-
2、智能家居领域
- 智能扫地机器人、空调、冰箱、洗衣机、投影仪、智能门锁、智能门禁、可视对讲门铃、微波炉、电视机、遥控器、水电表、扫地机器人等
-
3、安防领域
- 人脸识别、监控设备、指纹识别、视网膜识别等
-
4、汽车电子领域
- 行车记录仪、自动驾驶系统、车辆导航系统等
-
5、交通物流领域
- 蜂巢快递柜、共享单车、智能分拣等
-
6、健康医疗领域
- 生化分析仪、血液分析仪、CT等各类智能检测仪器、智能血压计、智能手环等
-
7、通信领域
- 机顶盒、路由器、通信基站设备、交换机等
-
8、金融领域
- 刷卡机、智能ATM终端等
-
9、消费电子领域
- 手机、平板电脑、可穿戴设备、游戏机、数码相机、广告机、遥控玩具、音频视频播放器、自动售货机
-
10、军事航空领域
- 卫星系统、无线传输系统、定位系统、无人机、雷达系统、火炮、导弹和智能炸弹制导引爆等控制装置、各种智能坦克、舰艇、轰炸机等
-
二、嵌入式linux
-
历史
-
unix起源
- 1969年,由kenThompson在AT&T贝尔实验室实现的。使用的是汇编语言。
- 1973年,Kenthompson和DennisRitchie使用C语言对整个系统进行了再加工和编写,使得Unix能够很容易的移植到其他硬件的计算机上。
- 1977年BSD的诞生(在unix发表之后,柏克莱大学Berkeley的教授对于这个操作系统相当的有兴趣,经过几经修改之后,在1977年发表了第一代BSD Berkeley Software Distribution,伯克利软件套件 (SUN)添加了TCP/IP协议,有了以后的网络编程)
-
Linux发展
- 1984年Richard Matthew Stallman(自由软件之父) 在 1984 年启动了 GNU 项目。(模仿unix但不是unix)
- 1991年Linus Torvalds 在芬兰赫尔辛基为了能在家里的PC机上使用与学校一样的操作系统,开始了Linux 内核开发,类Unix他是为他的硬件 - Intel 30386 CPU 编写的程序。他也使用 Minix 和 GNU C 编
译器。
-
Linux的发行版本
三、Linux操作系统的使用
-
shell命令
-
什么是shell命令
- shell:命令行解释器,用户和内核之间的桥梁
- shell也是一个程序,提供给了我们一个界面,(终端)
-
shell的版本
- Bourne Shell: 最早的Shell
- C Shell
- Ksh
- Z Shell
- Bourne-again shell(bash)
-
格式
-
三要素:命令名称 [选项] [参数]
-
注意:
- <1>.一条命令三要素之间必须要有空格隔开
- <2>.若多个命令在一行书写,用分号(;)将各命令隔开
- <3>.如果一条命令不能在一行写完,在行尾使用反斜杠()标明该条命令未结束
-
-
day2
操作系统的使用
-
命令
-
用户系统相关命令
-
1、用户切换命令(su)
-
2、系统管理员命令
-
ps:显示当前系统中由该用户运行的进程列表
- ps:显示当前系统中由该用户运行的进程列表
- ps -ef:查看所有进程及其pid(进程号),系统时间、命令详细目录,执行者
- ps aux:除可显示-ef所有内容之外,还可显示CPU及内存占用率,进程状态
- ps -w加宽以显示较多的信息
-
top:动态显示系统中运行的程序 (一般为每隔几秒刷新一次)
-
pstree 以树形格式显示进程
-
kill 输出特定的信号给指定PID(进程号)的进程
-
kill -l列出所有可用的信号名称
-
-
clear:清除屏幕上的信息
-
uptime:显示系统已经运行了多长时间
-
关机
- shutdown -h now现在立刻关机
- shutdown -h +30 30分钟之后关机
-
重启
- reboot
- shutdown -r now
-
-
3、磁盘相关命令
-
free:查看当前系统内存的使用情况
-
df:查看文件系统的磁盘空间占用情况
-
du:统计目录(或文件)所占磁盘空间的大小
- du -sh:显示该文件夹所占的大小
- du -sh ./:显示当前目录下所占磁盘空间的大小
-
fdisk:查看磁盘分区情况及对磁盘进行分区管理
-
fdisk -l:显示文件系统的分区情况
-
注意:
- <1>使用fdisk必须拥有root权限
- <2>IDE磁盘hda,hdb…SCSI磁盘是对应sda,sdb…hda1,第一个硬盘分区
-
-
-
-
文件、目录相关命令
-
1、vim编辑器
-
vi
-
查找(命令模式下)
- /<要查找的字符> 向下查找要查找的字符
- ?<要查找的字符> 向上查找要查找的字符
-
替换(低行模式下)
-
-
-
2、chmod改变文件的访问权限
- 第一个字符表示文件的属性(在Linux中一共有7种文件) - d 是文件夹 - - 普通文件 - l 链接文件 (类似于windows快捷方式) - p 管道文件 - s 套接字(socket)文件 - c 字符设备文件 - b 块设备文件 - rwx:权限 -
-
更改权限的方法
-
方法一
- a —>all 所有人
- u —>user 文件所有者
- g —>group 同组用户
- o —>other 其他人
-
方法二(用三位二进制,一个八进制)
- x—1
- w—2
- r—4
-
-
-
3、chown:修改文件的所有者和组别
- sudo chown linux 1.c #必须使用root权限 修改文件所有者
- sudo chown :linux 1.c #修改文件组别
-
4、chgrp:改变文件的组所有权
-
5、cat:查看比较短的文档
-
6、more:适合查看比较长的文档
- 按空格(space)向下走一页
- 按回车(Enter)向下走一行
- 按B向上走一页
- 按q退出
-
7、less:more的增强版
- 按空格(space)向下走一页
- 按回车(Enter)向下走一行
- 按B向上走一页
- 按q退出
- 支持上下箭头
-
8.grep: 在指定文件中搜索特定的内容,并将含有这些内容的行标准输出
-
示例:grep -n scores arr.c #在arr.c这个文件中查找scores这个字符串
-
一般会和(|)管道配合起来使用
- (|)关联两个命令,将前一个命令的输出作为后一个命令输入
-
ls --help | more
-
ls /dev | grep video #快速的找到我们的摄像头
-
-
9、常用的特殊符号
-
<1>.重定向符号 > 文件不存在,则新建,文件存在,覆盖原文件中的内容
-
<2>.追加重定向符号 >> 文件不存在则新建,文件存在,则追加在文件的末尾
-
<3>.反引号 ``
- echo today is
date
#将date当成命令来执行
- echo today is
-
<4>通配符
-
-
10、ln(创建链接文件)—>类似于windows快捷方式
-
硬链接
-
软连接
-
注意:
- <1>.ln命令会保持每一处链接文件的同步性,也就是说,你不论改动哪一处,其他的文件也都会发生相同的变化,
- <2>.软链接它只会在选定的位置上生成一个文件的镜像,不会重复占用磁盘空间,硬链接它会在选定的位置上生成一个和源文件大小相同的文件。
-
-
11、find在指定目录下搜索文件,他的使用权限是所有用户
- find [路径] [选项] [描述]
-
-
压缩打包命令
-
压缩
-
1、gzip
- gzip arr.c #压缩arr.c文件之后生成arr.c.gz
- gunzip scores.c.gz #解压
-
2、bzip2
- bzip2 scores.c #压缩scores.c文件之后生成scores.c.bz2
- bunzip2 scores.c.bz2 #解压
-
3、tar :对文件目录进行打包和解包
- -c, --create # create a new archive (创建包文件)
- -f #指名包文件名
- -x #解包
- -v #显示打包的过程
- -z #自动调用gzip,gunzip
- -j #自动调用bzip2
-
4、
-
1、打包+压缩
- tar -cvzf mynew.tar.gz day1 day3 1.txt
-
2、解压+解包
- tar -xvzf mynew.tar.gz
-
-
-
-
文件比较命令
- diff a.c c.c
-
-
Linux环境变量
-
env # 显示所有环境变量的值
-
1.临时修改变量的值 PATH
- echo $PATH
- /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
- export
- PATH=$PATH:/home/linux/23072/LinuxC/day3
-
2.永久修改变量的值 PATH
- sudo vim /etc/profile
- 添加export PATH=$PATA:(地址)
- reboot #重启计算机
-
-
-
网络配置管理
-
1.测试虚拟机是否有网 (ping)
-
2.如何设置虚拟机的网络
-
3.查看ip地址
- ifconfig
-
-
网络基础知识
-
IP地址
-
IP地址:在网络中,IP地址是主机的唯一标识,由网络地址+主机地址
-
32位的二进制 ------->点分十进制(“192.168.12.78”)
-
分类:
-
1.A类:1字节网络地址+3个字节主机地址(网络地址最高位必须为0)
-
2.B类:2字节网络地址+2个字节主机地址(网络地址最高位10)
-
3.C类:3字节网络地址+1个字节主机地址
(网络地址最高位为110) -
4.D类:主要用于组播(网络地址最高位为1110)
-
5.E类:(网络地址最高为11110)
-
-
子网掩码
-
什么是子网掩码
- 网络地址部分全为1,主机地址部分全为0 (c类子网掩码 255.255.255.0)
-
子网掩码的作用
- 判别主机发送的数据包是向外网发送,还是向内网发送
-
-
-
-
软件安装
-
离线安装
- sudo dpkg -i sl_3.03-17build2_amd64.deb
-
在线安装
-
apt高级软件包管理工具
- sudo apt-get install vim #安装
- sudo apt-get update #下载更新软件包列表
- apt-get remove openssh-server
-
-
day3
用户管理
-
用户属性
- 用户名 口令 用户ID 用户主目录 用户shell(bash)
-
用户和组
- 用户组是具有相同特征的用户的集合体,通过用户组可以让多个用户具有相同的权限
-
相关配置文件
- <1>./etc/passwd 系统能够识别的用户清单
- <2>. /etc/shadow 加密的用户清单, (打开时必须使用root权限)
- <3>./etc/group 该文件包含Unix组的名称和每个组中的成员列表,每一行代表一组
-
管理命令(必须使用root权限)
-
1.创建用户 adduser
-
2.修改密码 passwd
-
3.添加组 groupadd
-
4.修改用户的属性 usermod
-
5.删除用户 (deluser)
-
6.删除组 (groupdel)
-
shell编程
-
什么是shell编程
- 一堆shell命令集合
-
shell执行过程
- 1、创建一个.sh文件 #touch 1.sh
- 2、修改文件权限 #chmod +x 1.sh
- 3、执行 #./1.sh
-
注释 :#!/bin/bash 这句话必须放在程序的首航,作用是告诉计算机使用指定的shell版本
-
变量
-
用户自定义变量
-
1、命名规范
- <1>.由数字,字母,下划线组成,首字母不能为数字
- <2>.不能为关键字和保留字
- <3>.尽量见名知意,尽量大写
-
2、访问shell变量
- #变量赋值时=左右两边不能出现空格
- #shell中访问变量中的值$+变量名
-
-
位置参数即命令行参数
- 由系统提供的参数为位置参数
-
预定义变量
- $# 包含命令行参数的个数
- $@ 包含所有命令行参数:“$1 $2 …$9”
- $* 包含所有命令行参数:“$1,$2…$9”
- $$: 包含正在执行进程的ID号
- $? 包含前一个命令退出的状态
-
环境变量
-
-
shell程序和语句
-
1、说明性语句
-
2、功能性语句
-
1、键盘读入变量值 #read
-
2、算数运算命令#expr
- 注意:1、expr和变量之间,以及变量和符号之间必须夹空格
- 2、将expr的结果给ADD必须使用``(反引号)
- 3、表示通配符*表示本身
-
test命令
-
1、测试字符串
- s1 = s2 测试两个字符串的内容是否完全一样
- s1!= s2 测试两个字符串的内容是否有差异
- -z s1 测试s1字符串的长度是否为0
- -n s1 测试s1字符串的长度是否不为0
-
2、测试整数
- a -eq b 测试a与b相等 (equal)
- a -ne b 测试a与b不相等
- a -gt b 测试a是否大于b (great)
- a -ge b 测试a是否大于等于b
- a -lt b 测试a是否小于b
- a -le b 测试a是否小于等于b
-
3、文件属性
- -d name 测试name是否为一个目录
- -f name 测试name是否为普通文件
- -L name 测试name是否为符号链接
- -r name 测试name是否存在且可读
- -w name 测试name是否存在且可写
- -x name 测试name是否存在且为可执行
- -s name 测试name是否存在,且长度不为0
- f1 -nt f2 测试文件f1是否比文件f2更新
- f1 -ot f2 测试文件f1是否比文件f2更旧
-
-
-
3、结构性语句
-
1、顺序
-
1、read输入
-
2、echo输出
-
-
2、选择
-
1、单分支
-
2、双分支
-
3、多分支
-
if
-
case
-
-
-
3、循环
-
1、for
-
<1>.带列表的for
-
2、不带列表的for
-
3、类似C的for
-
-
2、which
-
3、break跳出循环
- break跳出一层循环
- break2跳出两次循环
-
4、continue:结束本次循环,继续下一次循环
-
-
-
-
函数
-
1、函数的定义
-
方式一:
-
方式二:
-
-
函数的调用
-
方式一:
-
方式二:
-
-
day4
1、结构体
-
1、如何创建结构体数据类型
-
2、如何创建结构体变量
- struct sutdent s1={“tuomiao”, 183, {11,55,20}}
-
3、如何访问变量的值
- 1、s1.name
- 2、ps->name
-
4、如何操作结构体的指针
- 定义一个指向结构体的指针 #struct student *ps=NULL;
2、内存管理
3、在堆区分配空间和释放空间
-
1、分配空间
- void *malloc(size_t size)
-
2、释放空间
- void free(void *prt)
4、结构体和堆区空间关联起来
-
1、在堆区创建5个存结构体的空间
- ps=(Stu *) malloc(sizeof(struct student)*5)
-
2.编写一子函数,对ps指向的空间进行输入和输出
day5
1、自定义头文件
- 1、引入库头文件
- 2、宏定义
- 3、结构体类型的定义
- 4、枚举类型的定义
- 5、函数声明
2、如何引入头文件
-
#include “stu.h”
-
""和<>的区别
- “”: 编译器从用户的工作路径开始搜索头文件
- <>: 编译器从标准库路径开始搜索头文件
3、条件编译
-
作用:避免头文件被重复引入
-
语法
4、gcc工作原理
-
vim -p *.c #同时打开多个.c文件
-
1、分阶段执行
-
1、预处理 #gcc -E main.c -o main.i
-
2、编译 #gcc -S main.i -o main.s
-
3.汇编 #gcc -c main.s -o main.o
-
4、链接 #gcc main.o -o main
- 在连接阶段将输入的机器代码文件*.o(与其它的机器代码文件和库文件)汇集成一个可执行的二进制代码文件
-
-
将四部合为一 #gcc stu.c -o stu
5、Make工程管理器(多文件编译)
-
1、make工作原理
- 默认在当前路径下查找一个Makefile/makefile的文件
-
2、Makefile
-
3、Makefile中假目标
-
执行假目标
- make clean#并没有生成clean(目标),只是执行了rm *.o
-
假目标出现的问题
-
问题:
- 假设在当前文件夹由一个文件和伪目标的名称相同,就会显示伪目标是最新的
-
解决:
-
在伪命题的前面加.PHONY:clean
-
-
-
-
4、Makefile变量
-
1、自动变量
- <1>.$@ 目标文件
- <2>.$^ 所有的依赖文件
- <3>.$< 第一个依赖文件
-
2、预定义变量(Makefile预定义变量包含了常见编译器,汇编器的名称及其编译选项)
- <1>.CC C编译器的名称,默认为cc
- <2>.CFLAGS C编译的选项,无默认值
- <3>.RM 文件删除程序的名称,默认值为rm -f
-
3、自定义变量
- 示例:OBJS:=main.o calp.o stuio.o sort.o
-
-
5、Makefile中变量的展开方式
-
1、递归展示方式
-
2、简单展开方式
-
day6
1、函数指针
-
1、定义函数指针
-
2.定义一个长度为4的数组,该数组中的每个元素是个函数的指针
- int ( *pfunArr[4] ) (int,int )={add,sub,mul,div};
-
3.函数参数可以是函数指针
- int pfunaction(int (*pfun)(int,int),int num1,int num2)
-
4.函数指针也可以取别名 (typedef )
2、存储类型
-
1.register 寄存器
-
2.auto (默认)
- 存储类型 类型名 变量名
-
3.extern 外部的
-
1.变量
-
局部变量 :定义在函数体内部的变量,称为叫局部变量
- 作用域:自定义开始到最近}结束,函数作用域 ,块作用域
- 生命周期:函数调用分配,函数结束释放
-
全局变量:定义在函数体外部的变量,称为叫全局变量
- 作用域:自定义开始到文件 文件作用域
-
-
2.extern修饰全局变量
-
3.extern修饰函数
-
4.static 静态的
- 1.static修饰全局变量 (隐藏)
- 2.static修饰函数 (隐藏)
- 3.static局部变量:延长变量的生命周期
-
3.共用体
-
大小端
-
大端序
-
低字节存在低地址处,高字节存在高地址处
-
-
小端序
-
低字节存在高地址处,高字节存在低地址处
-
-
4、枚举:(语义化)定义常量的一种方式
-
定义一个枚举的数据类型
-
定义枚举的变量
5、字节对齐:分配空间的时候一次性分配多少个字节
- 1、基本类型:自然对齐方式
- 2.结构体的对齐方式:成员当中最大的那个
6、位域
7、递归
-
一个数的阶乘
-
斐波那契数列
特别注意:
原文链接