自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 内核链表;栈和队列

1.一种链表结构能够操作多种类型的数据对象。出栈(弹栈):将数据元素从栈顶位置取出。利用内核链表实现对学生信息的插入,并完成打印。栈底:不允许入栈和出栈的一端称为栈底。栈和队列只允许在固定位置插入和删除。2.节点包含数据变成数据包含节点。栈顶:允许入栈出栈的一端称为栈顶。入栈(压栈):将数据元素放入栈顶。表可以在任意位置插入和删除。1.栈和队列是特殊的表状结构。

2024-08-30 08:59:02 25

原创 段错误调试方法;单向链表操作

如何计算环入口位置:将一个指针从第一个节点向后走,将一个指针从相遇点向后走,两个指针相遇的位置即为环入口的位置。如何计算环长:标记相遇的位置,让指针继续向后走,没走一步计算器自加,走回到标记位置,则计算器值即为环长。4.执行代码,复现段错误,产生包含出错信息的core文件(检查core文件是否生成)是否有环:快指针每次走2步,慢指针每次走1步,快慢指针相遇则说明有环。5.已知链表中间某个节点地址,不知道头结点地址,如何删除该节点。不限制core文件的生成的大小。查看段错误产生的位置。3.链表的倒置(反转)

2024-08-28 22:26:26 114

原创 数据结构;顺序表;链式表

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

2024-08-27 21:52:55 383

原创 数据库;SQL语言; 数据库编程

select student.name as 姓名, lesson.subject as 科目 from student cross join lesson where 科目 like "语文";insert into student values("李四", NULL, NULL, 99.99);insert into student values("张三", "男", 19, 89.5);insert into student (姓名, 年龄) values ("王二", 18);

2024-08-22 18:45:01 864

原创 select的缺点;poll ;poll的缺点;epoll

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

2024-08-21 22:00:47 972

原创 阻塞IO;非阻塞IO; 异步IO;多路复用IO

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

2024-08-20 17:22:54 218

原创 TCP粘包问题;TCP和UDP传输方式;客户端如何拿到服务器中的网页文件;通信报文

确认号:接收到数据的编号(只有当ACK为1时,该位有效)、确认号即想要让对方下次发送数据的序号。滑动窗口:用来控制接收和发送窗口的大小,来实现对流量的控制。TCP发送数据是连续的,两次发送的数据可能粘连成一包被接收到。本次发送的确认号,为收到的序号 + 实际接收到的数据长度。3.客户端向发送HTTP请求报文,告诉服务器想要的数据。3.传输过程中通过序号和确认号保障数据传输的完整性。UDP是无连接的,面向数据包的传输方式。TCP是面向连接的,面向字节流传输方式。协议://主机:端口号/资源路径。

2024-08-18 14:38:33 419

原创 UDP包头;UDP特点;TCP编程

backlog:等待队列的大小(最多存放尚未被处理的三次握手请求的个数)addrlen:接收方的IP地址和端口号的大小。addr:存放发送方IP地址的空间首地址。sockfd:套接字文件描述符。addr:接收方的IP地址和端口号。sockfd:套接字文件描述符。sockfd:套接字文件描述符。sockfd:套接字文件描述符。buf:要发送的数据的首地址。sockfd:套接字文件描述符。len:接收数据的缓冲区的大小。len:要发送的数据的长度。成功返回实际接收字节数。2.UDP资源开销小,实现机制简单。

2024-08-16 17:25:50 717

原创 网络;TCP/IP协议模型;命令

子网掩码展开成二进制,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-15 20:18:26 599

原创 IPC对象;消息队列;共享内存;信号灯

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

2024-08-14 18:47:04 489

原创 信号:内核层和用户层通信的一种方式

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

2024-08-11 09:52:41 525

原创 Linux进程间通信的方式:管道;

无名管道创建后,进程会获得操作管道的两个文件描述符,创建子进程时,子进程会拷贝得到父进程的操作无名管道的两个文件描述符,4.编写两个进程任务clienta.c和clientb.c, clienta.c从终端接收一行字符串,通过管道发送给clientb.c。通过管道在文件系统中的路径找到管道名,两个进程以读写的方式打开同一管道完成通信。如果管道中写满(64k),则阻塞等待,等有数据读出才能继续写入。如果管道中没有数据,会阻塞等待直到有数据写入后读出。向管道中写入数据会产生管道破裂信号。

2024-08-09 18:02:10 377

原创 线程;互斥锁;死锁;信号量

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

2024-08-08 17:23:42 653

原创 waitpid;exec函数族;system函数;线程

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

2024-08-07 17:52:08 417

原创 进程;进程相关命令;进程创建与消亡;相关函数接口

写时拷贝:fork创建子进程,子进程拷贝父进程中的数据,如果只是读取时不会为子进程单独生成空间,只有做写入操作时,才会。父进程先结束,子进程成为孤儿进程,被init进程(1号)进程收养,子进程结束,init系统进程自动回收进程空间。2.子进程结束,父进程回收子进程空间,子进程不会变成僵尸进程。进程:是一个程序动态执行的过程,包括进程的创建、调度和消亡的过程。1.让父进程先结束,子进程再结束,子进程不会变成僵尸进程。1.子进程任务结束,空间没有被回收,该进程成为僵尸进程。

2024-08-06 17:45:15 915

原创 目录文件;链接文件;函数stat/lstat

删除链接文件名,并让硬链接个数-1 ,如果一个磁盘空间硬链接个数为0,需要回收磁盘空间。软连接文件名 -> inode -> 数据块 -> 链接向的文件名 -> inode -> 数据块。ln -s 要链接向的文件名 软链接文件名。pathname:目录文件的路径。创建一个newpath的硬链接文件。通过在磁盘中存放的inode节点进行链接。ln 要链接的文件名 硬链接文件名。oldpath:要链接的文件名。buf:存放软链接文件内容的缓冲区。newpath:硬链接文件名。pathname:链接文件名。

2024-08-02 18:24:22 1037

原创 标准IO;文件IO;标准IO和文件IO的区别;其余函数接口;Linux系统中时间的获取

7.文件IO可以操作设备文件、进程间通信的文件、普通文件(Linux系统下的一切文件均可以使用文件IO)必须包含:O_RDONLY、O_WRONLY、O_RDWR 三个其中之一。文件描述符:很小的非负整数,而且新的文件描述符总是尚未被使用的最小的非负整数。写出标准IO中"r"、"r+"、"w"、"w+"、"a"、"a+"对应的文件IO的打开形式。系统调用:是Linux内核中的函数接口,只能在Linux系统中使用。O_CREAT 文件不存在创建。O_EXCL 文件存在报错。

2024-08-01 18:50:01 465

原创 fputs/fgets ; fprintf/fscanf; fread/fwrite

ASCII码文件: '2' '0' '2' '4' 代码、文本文件。向流中写入nmemb个对象,每个对象size个字节,在ptr指向的空间中存放。从流中读取nmemb个对象,每个对象size个字节,在ptr指向的空间中存放。练习:利用fgets和fputs实现将一个文件中的内容拷贝到另一个文件中。ptr:写入数据空间的首地址。ptr:存放数据空间的首地址。nmemb:写入对象的个数。成功返回实际写入对象的个数。nmemb:写入对象的个数。

2024-07-31 19:27:26 567

原创 Linux软件开发;IO输入输出

4. - 普通文件 保存数据信息的文件(代码、图片、音视频、压缩包等)如果文件不存在则创建。w 只写 如果文件存在则清0,只写打开。5.link l 链接文件 指向其他文件的文件。a 追加只写 如果文件存在则追加只写打开。a+ 追加读写 如果文件存在则追加读写打开。r+ 读写 如果文件存在则读写打开。

2024-07-30 18:40:20 487

原创 内存管理;链表

1.函数体内部的局部变量会随函数结束被回收,可以考虑存放到堆区空间中避免随函数结束回收。当使用strcat、strcpy、strcmp函数时可能会产生内存越界。应该用strncat、strncpy、strncmp函数替代。注意:操作指针时,注意指针指向的空间是否存在?4.单向链表、双向链表、内核链表、循环链表。如果成功,返回指向申请空间的指针。申请size个字节的堆区空间。size:申请空间的大小。1.数组是有限个元素的集合。申请的堆区空间没有被释放。2.数组的空间必须连续。1.链表空间不需要连续。

2024-07-27 19:46:42 344

原创 结构体;共用体;枚举类型;位运算

1.存放结构体成员变量,必须保证前面的长度为成员变量所占空间大小的整数倍。1.枚举常量第一个值默认为0,后面的枚举常量为前一个枚举常量的值+1。括号 > 单目 > 双目 > 三目 > 赋值 > 逗号。2.结构体整体的大小必须为最大类型长度的整数倍。2.大端:内存低地址存放高数据位称为内存大端。2.枚举类型对应的变量的值应该为枚举常量中的值之一。1.小端:内存低地址存放低数据位称为内存小端。2.测试一个硬件平台是大端平台?不改变其余位的前提下,让第n位置1。不改变其余位的前提下,让第n位置0。

2024-07-26 17:05:13 378

原创 函数指针和指针函数;构造数据类型

1.char *、int *、double * 转换为void *时需要强制类型转换。2.void *转换为char *、int *、double *时不需要强制类型转换。2.指针数组的数组名是指向数组第一个元素的指针即二级指针。结构体访问成员变量最终的类型由成员变量的类型决定。void *只表示类型地址,没有指向空间大小的含义。-> :结构体指针类型访问成员变量。数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;指针函数是函数,函数的返回值是指针。函数指针是指针,指针指向一个函数。

2024-07-25 18:19:46 806

原创 指针数组和数组指针

定义一个指针变量p,占8个字节空间, 指向一个int类型5个元素的数组的指针,指向20个字节空间。2.指针数组的数组名是指向数组第一个元素的指针,即指向指针的指针也就是二级指针。2.数组指针取*操作:值不变,类型降级成为指向数组第一个元素的指针。定义数组a,占40个字节空间,共有5个元素,每个元素为int*型指针。数组的数组名是指向数组第一行所有元素的数组指针。一维数组中数组的数组名是指向数组第一个元素的指针。指针数组是数组,数组的每个元素是指针。数组指针是指针,指针指向一个数组。主要用于存放字符串数组。

2024-07-24 18:21:06 848

原创 数组和指针的关系;const指针

1.字符串在函数中传参时,只想让函数体内使用字符串,而不允许通过指针改变字符串的值使用const。const修饰p和*p, 指针变量p的值不能变,也不能利用*p改变指向空间中的值, 一定要对指针初始化。const修饰p, 指针变量p的值不能变, 但可以利用指针修改指向空间中的值, 一定要对指针初始化。const修饰*p, 指针变量p可以修改指向的空间,但不能利用该指针修改指向空间中的值。练习:从终端接收一个字符串,编写一个函数统计该字符串中大写、小写、数字和空格的个数。指针[n] == *(指针 + n)

2024-07-23 17:31:10 531

原创 预处理命令;指针

3.指针变量:用来存放指针(地址)的变量,使用变量等价于等使用指针,所以我们也把指针变量简称为指针。*p:取0x2000开始向下8字节空间中的数据,并按照双精度浮点数来理解。实参将地址传递给形参,形参是指向实参的指针,可以利用形参修改实参的值。对*p赋值:不会修改指针变量的指向,只是利用指针修改其指向空间中的值。*p:间接访问,通过变量在内存中的地址来使用该变量的空间。值:获得指针指向空间中的值(根据指针的类型来读取)2.指针:指针就是地址、地址就是指针,指针具有指向的概念。

2024-07-22 17:28:52 736

原创 函数传参;递归函数;预处理命令

----include ---- add.h add.c中用到的数据类型的定义、宏定义、全局变量的声明、全局函数的声明。|--- mul.h mul.c中 用到的数据类型的定义、宏定义、全局变量的声明、全局函数的声明。|--- sub.h sub.c中用到的数据类型的定义、宏定义、全局变量的声明、全局函数的声明。jisuanqi--------src ----- main.c 主函数的实现。

2024-07-21 09:42:59 438

原创 strcpy、strcat、strcmp、strlen的相同功能的代码实现

【代码】strcpy、strcat、strcmp、strlen的相同功能的代码实现。

2024-07-19 18:03:48 193

原创 字符型二维数组;函数

函数类型:函数运行结果的类型(如果返回值类型与函数类型不一致,会将返回值强制类型转换成函数类型返回)3.实参与形参类型不一致时,会将实参强制类型转换为形参类型,传入函数中。函数类型 函数名(数据类型1 形参1, 数据类型2 形参2, ...)2.定义:定义一个之前不存在的变量或函数,需要开辟新的空间。如果没有返回值,函数类型应该为void类型。函数体外部想获得函数体内部值的时候,通过返回值获得。函数体内想使用函数体外部变量的值,使用复制传递。被调函数在主调函数下方定义,需要声明该函数。

2024-07-19 17:54:31 592

原创 二维整形数组;字符型数组

/对数组中所有元素清0。没有给定初值的元素被赋值为0('\0') ,不是'0'数据类型 数组名[第一维数组的元素个数][第二维数组的元素个数];1.字符型数组存放字符串,必须能够存放下末尾的\0字符。获得字符串的长度(从字符串开头到\0中间元素的个数)结果 == 0 str1 == str2。按照字符串打印:从字符串开头到第一个\0中间的内容打印。

2024-07-18 18:47:05 660

原创 循环语句;辅助控制语句;数组

定义变量时没有给定数组元素个数,通过给定初值的个数决定数组元素个数。1.元素个数必须为常量或常量表达式,不允许是变量或变量表达式。只给定一部分元素的值,没有给定初值的元素会被默认赋值为0。1.数组元素下标为0 - 元素个数-1 ,不要越界使用。数组所占空间的大小 = 每个元素所占空间大小 * 元素个数。练习:从终端接收10个数到数组中,计算这10个数的平均值。练习:从终端获得5个数到数组中,获得数组中的最小值。

2024-07-17 17:50:13 685

原创 if分支;switch分支;循环结构

1.双层switch中,里层switch结束,如果没有break,外层switch会继续向下执行。3.switch只与case后面的值比一次,然后顺序向下执行直到break或者switch结束。case 常量2:语句块2;case 常量3:语句块3;例如,输入a,则输出b。则显示输入数据有误,如果输入的字符是z或Z,则输出a或A。case 常量1:语句块1;case 常量2:语句块2;case 常量3:语句块3;练习:鸡兔同笼,共50只,140只脚,打印出鸡兔的个数。C:每轮循环执行结束后会执行的代码。

2024-07-16 19:28:35 612

原创 常用的输入输出函数;流程控制

2.if可以脱离else单独使用,但是else不能脱离if单独使用。%c 按照char类型接收(会接收' '和'\n'字符)表达式1:表达式2;1.if后面必须加条件, else后面不能加条件。_%c 接收一个非' '和'\n'的字符。4.scanf中' '和'\n'字符表示数据末尾。3.scanf不能接收带' '的字符串。|| 逻辑或 要么..要么..2.gets能够接收带' '的字符串。&& 逻辑与 既..又..

2024-07-15 18:44:19 842

原创 变量;表达式;运算符;C语言中常用的输入输出函数

2.最好不要与系统的库函数重名(如printf,重名可能会导致对应库函数无法使用)2.整数类型中无符号类型精度大于有符号类型精度。从左到右依次运行,最后一个逗号表达式的结果为整体表达式的结果。左值:能够放在等号左边的值,可以是变量,不能是常量或表达式。1.功能:给定一个数字,并将其对应的ASCII码显示在屏幕上。右值:能够放在等号右边的值,可以为常量、变量、表达式。1.功能:从键盘读取一个字符,并将其对应的ASCII码返回。%# 打印八进制前的0和十六进制前的0x。

2024-07-14 09:12:24 511

原创 gcc编译器及C语言基础

根据条件编译规则将符合条件的代码加入到编译中,不符合条件的代码从编译中去除。./a.out时将该文件加载到内存中运行,内存负责与CPU交互执行代码内的运算处理。1.每次编译代码都寻找第一个错误并修改,直到错误完全解决为止。s 进入函数内部调试。查看代码 -> 设置断点 -> 运行代码 -> 单步执行。将C语言代码展开(处理程序中与#号相关的代码)q 退出。将头文件stdio.h展开到代码中。将二进制代码链接成为可执行程序。

2024-07-12 18:36:45 414

原创 基本数据类型

int 整形 4个字节 1位符号位+31位数据位 -2^31 - 2^31 -1。long 长整型 8个字节 1位符号位+63位数据位 -2^63 - 2^63 -1。double 双精度浮点数类型 8个字节 1位符号位 + 11位指数位 + 52位尾数位。

2024-07-12 17:56:08 402

原创 Linux基础

嵌入式学习第一天——Linux基础

2024-07-11 18:18:50 240 2

空空如也

空空如也

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

TA关注的人

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