LinuxC高级学习

前文

在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脚本

C 语言(强类型语言 --> 对数据类型分的很清楚),需要编译 gcc 1.c ./a.out
shell 脚本(弱类型语言),不需要编译,直接运行

7.1如何创建shell脚本

(1)创建脚本文件( 1.sh
(2)编辑脚本文件( vim 1.sh
(3)执行的时候发现没有可执行权限,需要人为添加
chmod 777 1.sh or chmod u+x 1.sh
(4)运行
./1.sh

7.2变量

7.2.1用户自定义变量

shell 允许用户建立 变量存储类型 ,但它不支持数据类型( int float ),所有赋值给变量的值都会被解释为一串字符
命名规范
(1)由数字、字母,下划线组成,首位不能为数字
(2)一般shell变量用大写表示

注意:
(1)要取用一个变量的值,只需在变量名前加一个 $ 即可
(2)等号的左右两侧不能有空格

7.2.2、系统定义的变量

$#:包含命令行参数的个数
$@:包含所有命令行参数
$*:包含所有命令行参数
$$:包含正在执行的进程的ID号
$?:包含前一个命令的退出状态,正常退出返回0,反之为非0(0为真,非0为假)

7.2.3、环境变量

案例

在家目录下创建一个 mydir 文件夹,在该文件夹中创建 1.txt ,然后向 1.txt 中写入 "hello shell"

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

注意:
(1)函数中的 $n 并非脚本中的 $n
(2)函数中的所有标准输出都会传递给主程序中的变量

总结

在LinuxC高级学习中,还应该学习和掌握调试技巧和性能优化技巧。调

试技巧是指通过调试器和日志分析等工具,定位和修复程序中的错误和问题。

性能优化技巧是指通过优化算法和使用高效的数据结构,提高程序的执行效率和响应速度。

总之,LinuxC高级学习是一项重要的技能,有助于我们更好地理解和应用Linux操作系统和C语言。通过学习Linux操作系统的基本原理和C语言的高级特性,我们能够开发高效、安全和可靠的软件和系统。

同时,学习Linux系统编程、调试技巧和性能优化技巧,能够提高我们的编程能力和解决问题的能力。希望本文能够对LinuxC高级学习的读者有所帮助。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值