Linux基础与C高级

文章介绍了嵌入式系统的基本概念,Linux系统结构及shell命令的使用,包括文件管理、权限修改、压缩解压等。此外,还深入讲解了C语言的高级特性,如函数、函数指针、枚举类型和结构体的运用。同时,提到了内存管理和调试工具GDB的使用。
摘要由CSDN通过智能技术生成

Linux基础与C高级

一、什么是嵌入式

以应用为中心,以计算机技术为基础,软硬件可裁剪,对功能、可靠性、成本、体积、功耗有严格要求的
专用计算机系统就叫嵌入式系统。

二、linux系统体系结构

shell命令 C库函数 系统调用函数
||
系统
||
内核
1、文件管理
2、内存管理
3、网络管理
4、进程管理
5、设备管理
shell命令

三、shell命令

1、复习shell命令

pwd 定位(我在哪)
ls (查看当前路径下有哪些文件,不包含隐藏文件)
ls -a (查看当前路径下的所有文件,包含隐藏文件)
.vimrc 中(~下)
set mouse=a 鼠标点击可以使光标移动,不能粘贴内容
set mouse-=a 鼠标点击不可以使光标移动,能粘贴内容
set nu:显示行号
set nonu:不显示行号
注:在底行模式修改是一次性的,配置文件修改是永久的
ls -l (以列表的形式显示文件信息)
linux系统的七大文件类型
lsp-bcd
l:链接文件
s:套接字文件
p:管道文件
-:普通文件
b:块设备文件
c:字符设备文件
d:目录文件
cd : 路径的跳转
mv:移动文件/重命名文件
cp:复制文件
mkdir:创建目录文件
rm:删除文件
cat:查看文件内容
touch:创建一个普通文件
gcc:编译器
vi:以vi的方式打开文件

2、文件相关
1、chmod
修改文件的读、写、执行权限

chmod +/-(r,w,x) 文件名 :增加或减少文件的对应权限(所有都要改)
chmod (u,g,o)+/-(r,w,x) 文件名 :增加或减少文件对应用户的对应权限
u:文件所有者
g:同组用户
o:其它用户
rw- rw- r--
110 110 100
如果文件有这个权限,那么该位置对应二级制的1,没有则为0
每三位二进制代表一位八进制
则上面的数字可以转换为0664
0664 <==> rw-rw-r--
0777 <==> rwxrwxrwx
chmod 八进制表示的文件权限 文件名:修改文件的权限

2、ln

软链接:相当于快捷方式,如果快捷方式里面的内容被改变,与软链接文件也会改变,如果目标文件被删
除,则软链接文件会变成一个全新的文件
硬链接:目标文件的内容被改变时,硬链接文件也会改变,如果目标文件被删除,硬链接文件仍然独立存
在
ln -s 目标文件(注:最好写绝对路径,并且不要移动) 链接文件文件名:创建一个软链接
ln 目标文件(注:最好写绝对路径,并且不要移动) 链接文件文件名:创建一个硬链接

3、压缩与解压

gzip 需要压缩的文件名:将文件压缩为原文件名.gz的形式
gunzip 需要解压的文件名:将文件解压
压缩比例最大,但是压缩时间最长
bzip2 需要压缩的文件名:将文件压缩为原文件名.bz2的形式
bunzip2 需要解压的文件名:将文件解压
压缩比例中等,压缩时间中等
xz 需要压缩的文件名:将文件压缩为原文件名.xz的形式
unxz 需要解压的文件名:将文件解压
压缩比例最小,但是压缩时间最短
注意:压缩的文件会被替换为相应压缩工具后缀的文件(原文件不会保留)

4、归档与释放

tar
tar -cvf 想要创建的归档文件的文件名 需要归档文件文件名 归档
tar -czvf 想要创建的归档文件的文件名 需要归档文件文件名 归档并压缩
tar -xvf .tar文件 释放归档文件
参数:
-c 创建归档文件
-x 释放归档文件
-v 显示归档或释放的过程
-f 跟需要操作的文件名
-z 以gzip的方式压缩归档文件
-j 以bzip2的方式压缩归档文件
-J 以xz的方式压缩归档文件

5、diff

diff 文件名1 文件名2
比较两个文件的不同处

6、file

file 文件名
查看文件的属性

7、wc

wc 文件名:显示行数 单词数 文件字节大小
wc -w 统计单词数
wc -l 统计行数
wc -c 统计字节大小
wc -m 统计字符个数

8、grep

grep 字符串 文件名:查询该文件中的匹配字符串
grep -r 字符串 路径:查询该路径下所有文件中的匹配字符串

3、工具
1、vi

插入模式:修改文件内容的模式
底行模式:
w
q
wq
q!
x
exit
#number:跳转到指定行
/字符串:查询该字符串所在位置,跳转到第一个查到的位置
vsp:并列打开一个文件
ctrl+w跳转到另一个文件
s/字符串1/字符串2 将该行的第一个字符串1替换为字符串2
%s/字符串1/字符串2 将所有行的第一个字符串1替换为字符串2
%s/字符串1/字符串2/g 将所有行的字符串1替换为字符串2
命令行模式:
a:光标所在位置后一个
i:光标所在位置
o:光标所在位置下一行
yy
nyy
dd
ndd
p
u

4、网络相关
1、软件包分类
Deb(重点学习)
Rpm(只用于红帽)
2、软件包管理工具
dpkg

dpkg -i 软件包名:安装软件 install
dpkg -r 软件名:卸载软件 remove
dpkg -p 软件名:删除该软件的配置文件
安装时加sudo
dpkg不会检查软件包的依赖性

apt

apt-get install 软件名:在线下载软件
apt-get install--reinstall 软件名:重装软件
apt-get remove 软件名:卸载软件
apt-get clean 清理软件包
apt-get update 更新软件源
使用时加sudo
下载的软件包在/var/cache/apt/archives

3、ifconfig
4、ping

ping www.baidu.com
为了检查虚拟机是否连网用的

5、进程管理
1、top
2、ps

查看前台的进程
-A 查看所有进程
aux 查看所有进程的详细信息
运行程序或命令时后面加 &可以让它跑在后台

3、kill

 -9 PID(进程号) 向进程发送一个停止运行的请求,被锁住的进程和系统进程不会被干掉

6、用户管理
1、adduser

adduser 想要创建的用户名
创建一个新用户

2、deluser

deluser 想要删除的用户
删除用户
注意:该用户的家目录可以手动删除

3、passwd

passwd 用户名
修改该用户的密码

4、chown

chown 想要修改为的用户 文件名
修改文件的所有者

5、chgrp

chgrp 想要修改为的组 文件名
修改文件的所属组

6、su

su 切换为root
su 用户名:切换为指定用户

7、sudo

sudo 命令
以root权限执行命令

8、shutdown

shutdown -h 关机
shutdown -r 重启
shutdown -h/-r now 立刻关机或重启
shutdown -h/-r +n 延迟n分钟关机或重启
shutdown -c 取消定时关机重启

7、其它
1、man手册

man手册可以查看我们需要的信息
根据页数不同,存放的内容也不同
1、常用的指令
2、系统调用
3、库函数

2、echo

echo 字符串
在终端上输出该字符串

3、clear

clear命令清空你的终端内容

4、sleep

睡眠
sleep n 表示睡眠n秒

四、shell中的特殊字符

1、*
2、{n…m}
3、?
4、[]
5、[n-m]
6、|
7、重定向
8、``

五、shell脚本

基础知识
一系列shell命令的有序集合就叫shell脚本
解释性语言(shell脚本,python)

不会检查错误,如果有错误会在运行的时候报错,即使报错也会往下执行,需要解释器

编译性语言(C语言、c++)

需要编译才能运行,编译时会检查错误,需要编译器

如何写一个shell脚本

2、写一段shell命令
3、执行它
执行的两种方法
1、通过解释器 shell脚本文件 :执行shell脚本
例子:bash first.sh
2、通过chmod修改文件的权限(增加x权限),然后./需要执行的shell脚本执行文件
注:需要在文件开头加上
#!/bin/bash 告诉系统./运行时使用哪个解释器(如果写这句话,注意不要写错)

1、变量
1、用户自定义变量

在shell脚本中,只有一种数据类型叫字符串
变量不需要定义可以直接使用
给变量赋值时需要注意 val=123
1=两边不能有空格
2123'123'"123"无较大区别
如果想要使用变量里面的值,需要在变量名前面加$符号
如果需要在""中使用变量的值,需要将变量名放在[]/{}''中无法使用变量的值
如果不想使用变量里的值时,可以用unset将变量的值清空

2、位置变量

$0 - $9
位置变量,表示命令行参数
$0 命令行第0个参数
$1 命令行第1个参数

3、预定义变量

$#:打印除了文件名以外命令行参数的个数
$@/$*:打印所有的除了文件名以外所有的命令行参数
$?:上一条语句的执行结果,0为真,非0为假
$$:进程号

4、环境变量

env 查看所有的环境变量
$HOME表示家目录的路径
$PATH表示编译器路径

2、shell中的语句

1、解释性
2、功能性
1、read

read:从终端上读取内容到变量中
read 变量1 变量2...
注意:换行(回车)是结束输入的标志,每个输入之间以空格隔开
参数
-p:打印一个提示信息
read -p "please input:" val val1 val2
用法:read -p 提示信息 变量1 变量2
-t:限制输入的时间为n秒
read -t 5 val val1 val2
用法:read -t n 变量1 变量2
-n:限制输入的字符个数最多为number个(输入时的空格也算)
read -n 5 val val1 val2
用法:read -n number 变量1 变量2
-s:隐藏输入的内容
read -s val val1 val2
用法:read -s 变量1 变量2

2、test

test能比较的内容为
字符串 整型 文件
1、字符串
test 字符串1 = 字符串2 判断字符串是否相等
test 字符串1 != 字符串2 判断字符串是否不等
test -z 字符串 判断字符串长度是否为0
test -n 字符串 判断字符串长度是否不为0
2、整型
-eq 相等
-ne 不相等
-gt 大于关系
-lt 小于关系
-ge 大于等于关系
-le 小于等于关系
{
read val1 val2
#判断两数是否相等
test $val1 -eq $val2
echo $?
#判断两数是否不等
test $val1 -ne $val2
echo $?
}
3、文件
-r 文件可读
-w 文件可写
-x 文件可执行
-e 文件存在
-s 文件存在且有内容
-f 文件为普通文件
-d 文件为目录文件
-L 文件为链接文件
-c 文件为字符设备文件
-b 文件为块设备文件
-p 文件为管道文件
-S 文件为套接字文件
f1 -nt f2 文件1比文件2新
f1 -ot f2 文件1比文件2

3、expr

expr
expr后面可以跟算数运算
val=`expr 1 + 2`
特殊的是乘法,需要在*前面加一个\转义,也就是\*
val=`expr 1 \* 2`
val=$[1 + 2 + 3]
val=$((1 + 2 + 3 + 4))
val=$[2**3] 运算的是23次方 幂级运算

3、控制性
1、if

if 表达式
then
需要执行的语句
fi
表达式有两种方式
1、test -e 文件名
2[ -e 文件名 ] 注意:[ ]方括号内部需要有空格隔开
if
then
需要执行的语句
else
需要执行的语句
fi
if test
then
需要执行的语句
elif test
then
需要执行的语句
else
需要执行的语句
fi
-a 逻辑与
-o 逻辑或
! 逻辑非

2、case

case 变量名 in
常量)
执行的语句
;;
常量1 | 常量2)
执行的语句
;;
通配符)
执行的语句
;;
esac

**六、C高级

函数

定义:能实现特定功能的代码模块
系统的头文件可以用<>""
自己定义的头文件只能用""
定义头文件的方式sqlist.h
#ifndef _SQLIST_H
#define _SQLIST_H
#endif
编译的时候将sqlist.c main.c一起编译
gcc sqlist.c main.c
函数指针
数据类型 (*p)(形参) = 函数名;
数据类型和该函数的返回值类型保持一致
形参和函数的形参保持一致
保存函数的入口地址,调用该指针时只需要将函数名等价替换为指针变量名就可以了
函数指针一般和回调函数(将函数名作为参数传入函数中)联用
使用回调函数时请注意:
传入的函数需要 返回值类型和形式参数 与函数指针一致
递归函数
在函数内部直接或间接的调用本身
在写递归函数时一定要注意设置函数出口
先理清逻辑,再设计

枚举类型

enum{A,B,C,D};
如果未赋值
A->0
B->1
C->2
D->3
如果有赋值
则从赋值开始
enum{A=5,B,C,D};
A->5
B->6
C->7
D->8
enum{A=5,B,C=8,D};
A->5
B->6
C->8
D->9
B = 10;//此用法会报错,因为枚举型中的元素都是常量,不允许修改,类似于宏定义

结构体

结构体可以存放不同数据类型的元素
struct 结构体名{
成员变量1;
成员变量2};
相当于自己定义了一个数据类型叫struct 结构体名类型;
定义结构体变量的方式和普通变量一致,都是数据类型加变量名;
如果想要访问该结构体变量里面的变量,需要用:
结构体变量名.结构体内部变量名的方式
struct class a;
a.age;
初始化:
初始化类似于数组的格式{元素1,元素2,元素3}
每个元素和定义时的顺序保持一致,每个元素之间以逗号隔开
字节对齐:
结构体存储时会涉及到字节对齐,结构体里面的变量自上而下顺序存储
在64位系统中,结构体会按内部最大字节数的数据类型对齐
int char double -->
4int 1char 8
8double 8
sizeof求出来为16
int double char -- >
4int 8
8double 8
1char 8
sizeof求出来为24
int int char -->
4int 4
4int 4
1char 4
sizeof求出来为12
结构体存储变量会存储在不同的内存空间,但是都可以单独使用
结构体可以存放整型、字符型、浮点型、数组、指针类型、结构体类型等。
结构体指针
sturct people *p = &a;
同样也是 数据类型 *变量名;
结构体指针访问内容可以用
(*p).age;(基本上没有人使用)
p->age(常用的方式)

malloc

在堆区手动申请一片内存空间,需要程序员自己释放
非法访问内存 --> 使用了未申请的空间(段错误)
内存泄漏 --> malloc申请的空间未手动释放
内存溢出 --> 多次内存泄漏导致malloc无法申请到空间
void *malloc(size_t size);
返回值:malloc申请到的空间的首地址
参数:需要申请的空间大小
free(需要释放的空间首地址)
作用:释放该地址所对应的内存空间

七、Makefile与gdb**

gdb

帮助我们调试代码用的
如果要使用gdb则一定要在编译时加上-g选项
gcc -g
gdb + 可执行文件 开始调试
r:运行代码
l:查看代码里面的内容
b 行号:设置断点,将程序中断在断点处
n:让程序按行运行,不会进入函数内部
s:让程序按行运行,会进入函数内部
p n:查看变量的值

makefile

make工具会根据文件的时间戳来判断文件是否更新
make编译时只会编译更新过的文件
makefile中需要注意的有
目标:最终想要达成的效果
依赖文件:达成目标所必须的文件
实现目标的操作行,一定要有一个tab键(不能用空格代替)
写好之后,用make执行makefile中的内容
定义变量方便一次性修改全局的值
变量的定义直接变量名 = 内容
CC = gcc
使用变量时
需要用$(变量名)
自动变量
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
Makefile示例:
OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
app:main.o myp.o
$(CC) $^ -o $@
main.o:main.c
$(CC) main.c -c -o main.o
myp.o:myp.c
$(CC) myp.c -c -o myp.o
clean:
rm *.o app
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值