自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 数据结构—顺序表

数据量增长与程序运行时间的比例关系以函数描述称为时间渐进复杂度函数,简称时间复杂度。数据量增长与程序所占用空间的比例关系称为空间复杂度。3.链表空间不连续,使得理论上长度是无限的。2.链表需要更大的空间存放数据和节点地址。1.空间可以不连续,访问元素不方便。程序 = 数据结构 + 算法。4.链表的插入和删除效率很高。

2024-08-27 21:46:40 239

原创 Linux软件编程 - 数据库

select grade.stuid as 学号, lesson.subject as 科目, grade.score as 成绩 from grade inner join lesson on grade.lessonid = lesson.id;sqlite> select grade.stuid as 学号, student.name as 姓名, lesson.subject as 科目, grade.score as 成绩。insert into 表名称 values(值1, 值2, ...);

2024-08-22 22:42:25 824

原创 linux软件编程-多路复用io

1.poll监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销。2.select监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销。3.poll只能工作在水平触发模式(低速模式)而无法工作在边沿触发模式(高速模式)4.select只能工作在水平触发模式(低速模式)而无法工作在边沿触发模式(高速模式)2.epoll监听的事件表在内核层,内核监听事件不需要操作用户层空间提高效率。3.epoll会获得产生事件的文件描述符,不需要用户查找。

2024-08-22 22:41:38 229

原创 Linux软件编程-day(14) 多路连接方法

select不再阻塞,同时select会将产生事件的文件描述符留在集合中,而把没有产生事件的文件描述符从。监听文件描述符集合,将所有要监听的事件加入集合中,使用select监听所有事件,当集合中有事件发生,将一个文件描述符设定为异步IO,当IO有事件发生时,内核会向用户层发送SIGIO信号提醒用户层处理事件。集合中踢出,所以留在集合中的文件描述即为产生事件的文件描述符,对其处理即可。功能:判断fd是否仍在文件描述符集合中。功能:将fd加入文件描述符集合中。功能:将文件描述符集合清0。

2024-08-20 20:02:50 304

原创 Linux软件编程day(13)-粘包,万维网

目的发:本次发送的确认号,为收到的序号 + 实际接收到的数据长度 实际接收到的数据下次发送的位置。滑动窗口:用来控制接收和发送窗口的大小,来实现对流量的控制。TCP发送数据是连续的,两次发送的数据可能粘连成一包被接收到。确认号:接收到数据的编号(只有当ACK为1时,该位有效)、确认号。443 https 加密。3.客户端向发送HTTP请求报文,告诉服务器想要的数据。源端发送:本次发送的序号,为上次收到的确认号。UDP是无连接的,面向数据包的传输方式。TCP是面向连接的,面向字节流传输方式。

2024-08-20 20:01:31 413

原创 Linux软件编程day(12) -udp

发一次数据(数据可以随便) 接收一次数据(目的:接收发送方的IP+Port)backlog:等待队列的大小(最多存放尚未被处理的三次握手请求的个数)两个任务 两个任务。addrlen:接收方的IP地址和端口号的大小。addr:存放发送方IP地址的空间首地址。sockfd:套接字文件描述符。sockfd:套接字文件描述符。成功返回一个新的文件描述符。sockfd:套接字文件描述符。buf:要发送的数据的首地址。len:接收数据的缓冲区的大小。

2024-08-16 19:07:33 437

原创 Linux软件编程day(11)-套接字

子网掩码展开成二进制,1对应的部分就是IP地址的网络位,0对应的部分就是IP地址的主机位。子网掩码:每个IP地址都会搭配一个子网掩码,用来区分IP地址的网络位及主机位。私有地址:192.168.0.0 ~ 192.168.255.255。私有地址:10.0.0.0 ~ 10.255.255.255。B类:128.0.0.0 ~ 191.255.255.255。C类:192.0.0.0 ~ 223.255.255.255。D类:224.0.0.0 ~ 239.255.255.255。

2024-08-16 09:03:52 895

原创 linux软件编程-day(10) 进程通信

/SEM_UNDO 操作结束后,信号量的值会恢复到原来的值。//对信号量的操作 +1(释放信号量) -1(申请信号量)read.c 创建共享内存 -> 映射 -> 从共享内存中读取数据 -> 显示到终端。write.c 创建共享内存 -> 映射 -> 从终端接收数据写入共享内存中。recv.c 创建消息队列 -> 接收消息 -> 销毁消息队列。ipcrm -q/m/s 消息队列ID/共享内存ID/信号灯ID。IPC_CREAT:创建一个信号量数组。IPC_CREAT:创建一个消息队列。

2024-08-15 09:00:14 396

原创 Linux软件编程Day(9)-信号

自定义的函数的函数名(指向函数的指针)9号SIGKILL和19号信号SIGSTOP不能被忽略和捕捉。间隔seconds秒后给进程发送SIGALRM信号。SIGINT ctrl+c 打断。SIG_IGN 忽略信号。handler:信号对应的处理方式。成功返回之前注册的信号的处理方式。signum:信号的编号。SIGCHLD:表示该进程有一个子进程结束了。SIGUSR1:用户可以使用该信号实现通信。成功返回上次定时剩余的秒数。按照默认的方式处理信号。按照指定的方式处理信号。

2024-08-12 08:56:32 283

原创 Linux软件编程(Day8)-进程通信,管道

2.创建以下4个线程任务, 线程1 负责循环间隔1s打印"采集线程正在执行" 线程2 负责循环间隔2s打印"存储线程正在执行" 线程3 负责循环间隔5s打印"告警线程正在执行" 线程4 负责循环间隔10s打印"日志线程正在执行" 主进程负责从终端接收'A'、'B'、'C'、'D'上述表示两个文件执行不同操作,通过有名管道,就是创建了一个内核文件,这个文件在内核中,这段缓存区。无名管道创建后,进程会获得操作管道的两个文件描述符,创建子进程时,子进程会拷贝得到父进程的操作无名管道的两个文件描述符,

2024-08-09 18:33:01 791

原创 Linux软件编程(Day7)-分离,互斥锁,死锁,信号量

2.不剥夺条件:不剥夺条件是指一个线程任务已经锁定了一个资源,不能被其他线程任务抢占,直到它使用完该资源。资源是有限的,在程序运行过程中,一段代码、一段空间、一个变量、CPU、内存都可以看做资源。资源数 == 0 申请操作会阻塞,直到资源数不为0,申请得到资源后继续向下执行。是一种资源,当一个线程任务加锁,其余线程任务无法再次加锁,直到解锁后才能加锁。3.请求和保持条件:如果没有拿到锁资源一直申请获得锁资源。申请:资源数 > 0 申请操作让资源数-1。

2024-08-08 20:46:03 665

原创 Linux软件编程(Day6)

多线程一个线程任务异常结束可能导致进程异常结束,会导致进程中其余线程也随进程一起结束。pthread_join具有阻塞功能,线程不结束,会阻塞等到直到线程结束回收线程空间。多进程没有共享空间,通信需要使用其余的进程间通信方式完(管道、套接字、信号等)成。线程代码执行结束,空间不回收会成为僵尸线程,需要回收线程空间。1.创建3个线程,线程负责打印线程 线程(自己的TID)开始执行。retval:存放线程结束状态的值的空间首地址。多进程需要在不同的进程空间内部切换调度任务。

2024-08-08 12:43:10 535

原创 Linux进程总结(Day5)含内存结构图

写时拷贝:fork创建子进程,子进程拷贝父进程中的数据,如果只是读取时不会为子进程单独生成空间,只有做写入操作时,才会。父进程先结束,子进程成为孤儿进程,被init进程(1号)进程收养,子进程结束,init系统进程自动回收进程空间。如果子进程没结束,wait会阻塞直到子进程结束回收子进程空间。2.子进程结束,父进程回收子进程空间,子进程不会变成僵尸进程。1.让父进程先结束,子进程再结束,子进程不会变成僵尸进程。1.子进程任务结束,空间没有被回收,该进程成为僵尸进程。

2024-08-06 19:38:22 501

原创 Linux项目实践(Minishell)

3.makefile维护文件时间戳,需要编译的重新编译,不需要重新的编译则省略编译的时间。9.cat 实现。1.ls 实现。ln -s file.txt a.txt 实现。3.rm 实现。2.touch 实现。3.minishell记录了用户输入命令的时间和内容,可以支持用户。

2024-08-05 19:27:31 920

原创 Linux软件编程(Day4)

* 偏移量,不是真正的偏移量,是一个内部使用的值,用来 标记目录项在目录流中的位置。/* Inode号,表示文件的索引节点号 ,用于唯一标识文件*//* 记录的长度,即该目录项的长度 *//* 以空字符结尾的文件名 */软连接文件名 -> inode -> 数据块 -> 链接向的文件名 -> inode -> 数据块。pathname:目录文件的路径。mode:目录文件的权限。

2024-08-02 19:12:48 474

原创 Linux软件编程(Day3)

7.文件IO可以操作设备文件、进程间通信的文件、普通文件(Linux系统下的一切文件均可以使用文件IO)必须包含:O_RDONLY、O_WRONLY、O_RDWR 三个其中之一。写出标准IO中"r"、"r+"、"w"、"w+"、"a"、"a+"对应的文件IO的打开形式。O_CREAT 文件不存在创建。O_TRUNC 文件存在清0。O_EXCL 文件存在报错。SEEK_SET:从文件开头开始偏移。SEEK_CUR:从当前位置开始偏移。

2024-08-02 09:10:54 870

原创 Linux软件编程(Day2)

ASCII码文件: '2' '0' '2' '4' 代码、文本文件。将score.csv中每个学生的成绩获得平均值逐行写入到avg.csv中。向流中写入nmemb个对象,每个对象size个字节,在ptr。从流中读取nmemb个对象,每个对象size个字节,在ptr。练习:利用fgets和fputs实现将一个文件中的内容拷贝到另一个文件中。读取一行:fscanf 处理换行符(\n)时,会将其视为空白。ptr:写入数据空间的首地址。

2024-08-01 08:58:17 854

原创 LINUX软件编程(Day1)

w 只写 如果文件存在则清0,只写打开。5.link l 链接文件 指向其他文件的文件。如果文件不存在则创建。如果文件不存在则创建。a 追加只写 如果文件存在则追加只写打开。如果文件不存在则创建。a+ 追加读写 如果文件存在则追加读写打开。如果文件不存在则创建。r+ 读写 如果文件存在则读写打开。

2024-07-30 18:24:37 596

原创 嵌入式学习第十五天(Day15)

p = "hello world" 也可以,只是字符串常量,在数据区存放。实现创建链表的代码,定义一个空结点,将结构体的地址赋给空节点,判断是否创建成功,并将头节点的pnext 赋为空。例题,返回值为*******空******上述为值传递 ====地址传递。地址传递a,改变a的值,地址传递*p,传递**P,就是p的地址。分散空间的数据如何找到,通过链表来存储下一个数据的地址,可以找到当前元素。传指针变量的地址,可以修改p的值。插入一个节点,头插法,第二个参数为插入的数据。

2024-07-27 17:39:56 191

原创 嵌入式学习第十四天(Day14)

左边用共用体测试,里边的空间共享,用int填入数据,char测试,后边如果数据填入低地址位,就是小端。结构体的接收,最后边的getchar()用来接受\n,或者前边的第一个字符串用scanf接收的话,后边的第二行%c之前需要有一个空格,保证不会接收到\n。在求解这个问题上,老师给的方法为扫描法,自己脑子没转过来,用的法二,容易产生越界风险。主函数输入的Get这个不用返回,直接就是写到结构体中。看操作系统的位数,32位为4字节对齐。后者若是double类型,前者必须为8的倍数才可以。结构体的初始化表示。

2024-07-26 16:47:21 277

原创 嵌入式学习第十三天(Day13)

字符串拷贝函数满分实现,函数指针使用。蓝色错误示范,指示两次。

2024-07-25 19:50:34 126

原创 嵌入式学习第十二天(Day12)

左图为值传递,右图为地址传递。

2024-07-24 18:32:02 101

原创 嵌入式学习第十一天(Day11)

1.字符串在函数中传参时,只想让函数体内使用字符串,而不允许通过指针改变字符串的值使用const。const修饰p和*p, 指针变量p的值不能变,也不能利用*p改变指向空间中的值, 一定要对指针初始化。const修饰p, 指针变量p的值不能变, 但可以利用指针修改指向空间中的值, 一定要对指针初始化。const修饰*p, 指针变量p可以修改指向的空间,但不能利用该指针修改指向空间中的值。2.定义指向字符串常量的指针,最好加const。数组的数组名是永远指向数组第一个元素的指针。

2024-07-23 20:37:30 163

原创 嵌入式学习第十天(Day10)

2024-07-22 18:59:11 122

原创 嵌入式学习第九天(Day9)

2024-07-22 10:51:52 128

原创 嵌入式学习第八天(Day8)

2024-07-19 20:42:51 95

原创 嵌入式学习第七天(Day7)

2024-07-18 18:59:40 138

原创 嵌入式学习第六天(Day6)

练习:从终端获得5个数,打印出最大值和最小值以及他们的下标。7.找到数组中最大值和最小值对应的下标。6.找到数组中的最大值和最小值。5.数组数据的输入和输出。

2024-07-17 18:42:48 363

原创 嵌入式学习第五天(Day5)

case 常量2:语句块2;case 常量3:语句块3;case 常量1:switch (整形表达式2)case 常量1:语句块1;case 常量2:语句块2;case 常量3:语句块3;C:每轮循环执行结束后会执行的代码。D:满足条件执行的循环体内部代码。穷举法:将所有的情况都使用循环试一遍。else if (逻辑表达式2)else if (逻辑表达式3)} while (逻辑表达式);A:for循环前执行一次。if (逻辑表达式2)switch (整形表达式1)

2024-07-16 18:49:44 341

原创 嵌入式学习第四天(Day4)

5.scanf中只有%c可以接收' '和'\n'字符,其余均认为是数据结束的标志。4.scanf中' '和'\n'字符表示数据末尾。逻辑或左边为真时,右边不再计算。逻辑非:真取非得假,假取非得真。逻辑与左边为假时,右边不再计算。1.gets会去掉从终端接收的\n字符。3.scanf不能接收带' '的字符串。逻辑与:一假为假,全真为真。逻辑或:一真为真,全假为假。2.gets能够接收带' '的字符串。2.scanf中不要加入\n字符。2.printf不会多打印\n。1.puts会多打印一个\n。

2024-07-15 17:47:10 137

原创 嵌入式学习第三天(day3)

结果为ch = -32,480的二进制为1 1110 0000,char占8bit,所以在内存中保存的是1110 0000,1位符号位+7位数据位,110 0000是数据的反码形式,其原码为010 0000,故结果为-32。a - 20 > 0 结果应该为真, a - 20 相当于无符号整数类型+有符号整数类型,结果会被隐式类型转换为无符号整数类型,而0是最小的无符号整数,所以a - 20 > 0 结果为真。2.整数类型中无符号类型精度大于有符号类型精度。3.浮点数类型精度高于整数类型精度。

2024-07-14 23:55:35 402

原创 Linux学习+C语言基础学习(Day2)

2024-07-13 00:07:44 90

原创 2024 -7-11

touch 1/1 2/2 3/3 创建1 2 3 下的不同普通文件。创建同一目录下的文件 mkdir 1 2 3 用空格隔开。ls -a 1.c 查看1.c文件的详细位置。rm -rf 删除文件夹带文件的内容。ls -l读写权限全部文件可查看。mdkir 创建一个文件夹。touch 创建一个文本文件。cd ~返回当前用户的根目录。rmdir 删除一个文件夹。Linux快捷键的使用。cd .. 返回上一级。ls -a 详细文件。cd / 返回根目录。

2024-07-11 17:27:24 207

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除