前文
在c基础阶段完成后,我开始了LinuxC高级的学习,在我的学习过程中,我深刻体会到了LinuxC编程的重要性和挑战。
首先,我了解到Linux操作系统的核心是内核,它是操作系统的核心组件,负责管理系统资源、进程调度和设备驱动等。
通过学习LinuxC编程,我能够更好地理解内核的工作原理,并且能够编写驱动程序来与硬件设备进行交互。这对于我未来从事嵌入式系统开发或者操作系统研究领域都是非常有帮助的。
下面是我这个阶段学习的一些内容
一、结构体
C语言使用简单的数据类型描述数据,描述复杂的数据类型时需要用到复杂的数据类型-----》结构体
Struct是结构体的关键字
Struct student
{
Char name[10];
Int age;
Float height;
};------->学生的结构体---->数据类型
1.1字节对齐
32OS:一个结构体的大小,首先先找出结构体内最大的数据类型,如果该数据类型没有超过4字节,那么就按照最大的数据类型进行对齐
Struct a
{
Char a;
Short b;
};--->4字节
如果结构体内的数据类型超过4字节,那么就按照4字节分配
Struct b
{
Char name[29];
Int a;
Double b;
};---->44---->32OS
64OS
Struct a
{
Int a;
Char b;
Short c;
Char d;
};--->12字节
原理:
结构体拿空间换时间--->让数据存放之后,使用时便于寻址
1.2结构体访问
对内部的数据类型进行输入和输出
1.3定义结构体变量
先定义结构体,然后定义结构体变量
或者定义结构体的同时去定义变量
残缺的结构体定义
Typedef--->起别名(数据类型)
清空结构体变量
1.4结构体指针
1.5嵌套
结构体内部有一个元素,这个元素是结构体类型
Struct a
{
Int b;
Char c;
};
Sturct d
{
Struct a e;
Int f;
};
1.6变量访问变量访问元素
对结构体内部的元素进行输入输出,只需要看,对内部元素进行输入输出的时候要不要用&,并不看使用的是结构体变量还是结构体指针
1.7指针访问
指针访问变量访问元素
指针访问指针访问元素
结构体指针一定要指向结构体变量才能使用,所以要先从people里拿出来stu,让stu指向一个struct student类型的变量。
1.8初始化
不能通过结构体指针给结构体元素赋值,只能通过结构体变量
二、共用体
Union AA
{
Char a;
Int b;
Short c;
};
当共用体内部元素的数据类型没有超过4字节,按照最大的一个数据类型去共用空间,如果超过4字节,先按照4字节分配,然后共用开辟出来的最大的空间
字节序(大小端存储)
大端:低字节存放在高地址
小端:低字节存放在低地址
三、枚举
将所有的结果列出来
Enum()
{
结果
}
四、堆区操作
#include <stdlib.h>
void *malloc(size_t size);
在堆区申请空间
参数:申请的空间的大小
返回值:成功返回申请空间的首地址,失败返回NULL
void free(void *ptr);
释放申请到的空间
参数:空间首地址
如果不手动释放会造成资源浪费和内存泄露
void *realloc(void *ptr, size_t size);
扩容:
参数1:申请到空间的首地址
参数2:扩容的大小 原字节+(+- 字节数)
#include <string.h>
void *memset(void *s, int c, size_t n);
参数1:空间首地址
参数2:清空用到的字符
参数3:大小
申请5个char类型的空间
Char * P = (char *)Malloc(sizeof(char)*5);
If(NULL == p)
{
Return MALLOC_ERROR;
}
Memset(p,0,sizeof(char)*5);
Free(p);
五、make工程管理
管理多个.c的。把子函数单独拆分,组成一个.c文件,然后在main.c内部去调用各个.c里面的子函数
工程管理
添加变量---》makefile是一个脚本---》轻量化编程
CC---》系统预定义的编译器
CFLAGS---》系统预定义的编译选项 -c但是一般用-c -g -Wall
$@:当前的所有依赖 malloc.o:malloc.c --->malloc.o就是$@
$^:所有依赖 malloc.o input.o output.o.......
$<:当前的第一个依赖 malloc.o:malloc.c --->malloc.c 就是$<
Make工程管理需要自己书写头文件
5.1书写头文件
以test.h为例
#ifndef _TEST_H_
#define _TEST_H_ //防止头文件被重复包含
//1.用到的库文件
//2.宏定义
//3.结构体/共用体定义
//4.枚举
//5.私有数据类型 typedef int peo_t
//6.函数声明
#endif
5.2引用头文件
#include “test.h” 引用自定义头文件
#include <stdio.h> 引用库函数头文件
<>:包起来的头文件,在预处理阶段,会去/usr/include里面找
“”:在当前的工作路径下寻找头文件
5.3书写makefile
Make管理文件需要规则,这个规则就是makefile
目标:依赖
[TAB]命令表
App:1.c
gcc 1.c -o App
App:最终生成的文件
1.c:最原始的文件
gcc 1.c -o App---》制作过程
如果.c文件更新,App此时不会更新,经过一次make之后,App才会更新,那么make就是通过时间戳管理文件(以最新时间为准)
假目标:假目标没有依赖,一半的假目标是一个命令,这个命令可以自定义
如果出现假目标,先声明
.PHONY:clean 声明clean是假目标
clean:
rm App
5.4单文件编译
预处理 gcc -E 1.c -o 1.i
汇编 gcc -S 1.i -o 1.s
编译 gcc -c 1.s -o 1.o
链接 gcc 1.o -o App
一般将前三步叫单独编译不链接 gcc -c 1.c -o 1.o
如果此时有多个.o文件:gcc *.o -o App *作为通配符,会自动匹配后缀名是.o的文件
5.5嵌套makefile
将可执行文件,.o文件,.c文件,头文件四种分别放到不同的文件夹当中
bin:可执行文件
Include:头文件
obj:.o文件
src:.c文件
六、Linux系统相关命令
1.用户切换命令
su - 用户名;//切换用户
su - root <==> su - :路径以及环境变量都发生了改变
su root:路径以及环境变量为发生改变
2.用户管理命令
adduser username #创建用户
password username #修改密码
groupadd groupname #添加组
deluser username #删除用户
deluser --remove-home username #删除用户(同时删除他的home目录)
delgroup groupname #删除组
3.系统管理命令
ps # 查看系统当前的进程
kill #杀死进程(需要加进程号PID)
clear #清除命令行中的信息
reboot #重启
shutdown #关机
4.文件等相关命令
ls:列出当前目录下的文件和子目录。
示例:ls
cd:切换到指定目录。
示例:cd /path/to/directory
pwd:显示当前所在的目录路径。
示例:pwd
touch:创建一个空白文件或者修改文件的访问时间。
示例:touch filename
cp:复制文件或者目录。
示例:cp source_file destination_file
mv:移动文件或者重命名文件。
示例:mv old_filename new_filename
rm:删除文件或者目录。
示例:rm filename
mkdir:创建新的目录。
示例:mkdir directory_name
rmdir:删除空的目录。
示例:rmdir directory_name
cat:连接文件并打印到标准输出设备上。
示例:cat filename
more和less:逐页查看文件内容。
示例:more filename 或 less filename
head和tail:分别显示文件的头部和尾部内容。
示例:head filename 或 tail filename
grep:在文件中搜索指定的模式。
示例:grep pattern filename
find:根据条件在文件系统中搜索文件。
示例:find /path/to/search -name "filename"
chmod:修改文件或目录的权限。
示例:chmod permissions file/directory
chown:修改文件或目录的所有者。
示例:chown owner file/directory
chgrp:修改文件或目录的所属组。
示例:chgrp group file/directory
ln:创建链接文件。
示例:ln -s source_file link_file
file:确定文件类型。
示例:file filename
stat:显示文件或目录的详细信息。
示例:stat filename
5.压缩解压等相关命令
压缩: gzip 文件名:压缩后文件后缀为.gz
bzip2 文件名:压缩后文件后缀为.bz2
解压:gzid -d 文件名; gunzid 文件名
bzip2 -d 文件名; bunzip2 文件名
tar:对文件或文件夹惊醒打包,打包后的后缀为.tar
-c:打包
-v:显示信息
-x:解包
-f:指定打包名(放在最后一个)
-z:调用gzip压缩的打包文件,与‘-x’时调用gunzip解压
-j:。。。bzip2.。。。,。。。bunzip2解压
tar -cvf 打包名 文件名
tar -xf 打包名
打包压缩一体化:tar -czf 打包名 文件名
解压解包一体化:tar -xzf 打包名
6.常用的符号
管道符号(|):用于将一个命令的输出传递给另一个命令作为输入。
示例:command1 | command2
输入重定向符号(<):用于从文件中读取输入,而不是从标准输入(键盘)读取。
示例:command < input_file
输出重定向符号(>):用于将命令的输出保存到文件中,而不是输出到标准输出(屏幕)。
示例:command > output_file
追加重定向符号(>>):用于将命令的输出追加到文件的末尾,而不是覆盖原有内容。
示例:command >> output_file
后台执行符号(&):用于将命令在后台运行,终端可继续输入其他命令。
示例:command &
分号(;):用于分隔多个命令,按顺序依次执行。
示例:command1 ; command2
逻辑与符号(&&):用于当前一个命令成功执行后,才执行下一个命令。
示例:command1 && command2
逻辑或符号(||):用于当前一个命令执行失败后,才执行下一个命令。
示例:command1 || command2
通配符(*):用于匹配任意字符。
示例:ls *.txt
问号(?):用于匹配单个字符。
示例:ls file?
方括号([]):用于匹配指定范围内的字符。
示例:ls file[1-3].txt
反引号()或者$():用于将命令的输出作为变量或者命令的参数。 示例:variable=command`
variable=$(command)
反斜杠(\):用于转义特殊字符,使其失去特殊含义。
示例:echo "This is a "quote"."
7.环境变量
临时环境变量:export PATH= $PATH:绝对路径
永久环境变量:sudo vim /etc/profile
在末行下面加:export PATH= $PATH:绝对路径
reboot
七、shell脚本
7.1如何创建shell脚本
![](https://i-blog.csdnimg.cn/blog_migrate/94caad04184c6e4e3c943d3782714325.png)
chmod 777 1.sh or chmod u+x 1.sh
./1.sh
7.2变量
7.2.1用户自定义变量
(1)由数字、字母,下划线组成,首位不能为数字
(2)一般shell变量用大写表示
7.2.2、系统定义的变量
$#:包含命令行参数的个数
$@:包含所有命令行参数
$*:包含所有命令行参数
$$:包含正在执行的进程的ID号
$?:包含前一个命令的退出状态,正常退出返回0,反之为非0(0为真,非0为假)
7.2.3、环境变量
案例
![](https://i-blog.csdnimg.cn/blog_migrate/163534c4cc7367c7b88d4d58a4bec558.png)
7.3程序和语句
7.3.1、说明性语句
#:表示注释
7.3.2、功能性语句
输入 :read
输出 :echo
运算符 :expr
7.4、shell结构
7.4.1、选择结构
1.单分支
if [ 表达式 ]
then
语句
fi
2.双分支
if [表达式]
then
语句1
else
语句2
3.多分支
if [表达式1]
then
语句1
elif [表达式2]
then
语句2
...........
elif [表达式n]
then
语句n
else
语句n+1
fi
4.case语句
case 字符串变量 in
模式1)
语句1
;;
模式2 | 模式3)
语句2
;;
模式n)
语句n
;;
*)
语句n+1
;;
esac
注意:除了最后一个双分号可以省略,其余均不可省略
7.4.2、循环结构
for循环
for 变量名 in 单词表
do
语句;
done
while循环
while [表达式]
do
语句
done
八、函数
8.1、定义
方式1:
函数名()
{
语句
}
方式2:
function 函数名()
{
语句
}
注意:一般使用最多的是方式2
8.2、调用
方式1:
变量名=`函数名 参数列表`
方式2:
函数名 参数列表
注意:一般使用最多的是方式2
总结
在LinuxC高级学习中,还应该学习和掌握调试技巧和性能优化技巧。调
试技巧是指通过调试器和日志分析等工具,定位和修复程序中的错误和问题。
性能优化技巧是指通过优化算法和使用高效的数据结构,提高程序的执行效率和响应速度。
总之,LinuxC高级学习是一项重要的技能,有助于我们更好地理解和应用Linux操作系统和C语言。通过学习Linux操作系统的基本原理和C语言的高级特性,我们能够开发高效、安全和可靠的软件和系统。
同时,学习Linux系统编程、调试技巧和性能优化技巧,能够提高我们的编程能力和解决问题的能力。希望本文能够对LinuxC高级学习的读者有所帮助。