自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 framebuffer

显示屏:800*600(横向有800个像素点,纵向有600个像素点)Linux内核为显示提供的一套应用程序接口(驱动内核支持)RGB:(8个bitR,8个bitG,8个bitB)2.获取显示设备相关参数(分辨率、位深度)通过内存映射技术,向显存空间写入RGB值。framebuffer:帧缓冲、帧缓存。1.打开显示设备(/dev/fb0)显卡(显存(保存像素点的值))分辨率:像素点的总和。4.写入RGB颜色值。

2024-09-10 22:20:08 566

原创 哈希表与算法

思想:先设置基准数(begin),从右往左找,第一个比基准数小的数,从左往右找,第一个比基准数大的数,互换两个数,重复刚才的操作,直到p ,q 相遇,内层循环结束后,将p,q所指的元素与基准数交换。将要存储的数据的关键字和位置建立对应的关系,通过哈希函数(散列函数)将数据映射到存储的位置,方便快速查找。3.健壮性,输入非法数据,能进行相应的处理,而不是产生异常。随着n的增加,时间复杂度增长较慢的算法时间复杂度低。思想:将待排的数据插入到已有的数据中的合适的位置。思想:相邻数据两两比较,小的放前,大的放后。

2024-09-09 22:06:57 519

原创

概念:只允许从一端进行数据的插入和删除的线性的存储结构。允许从一端插入数据,另一端删除数据的线性存储结构。顺序队列 ---> 假溢出 ---> 循环队列。满栈、空栈:栈顶所在位置是否存有元素。满增栈 满减栈 空增栈 空减栈。先进后出、后进先出 FILO。先进后出、后进先出 FILO。先进先出,后进后出 FIFO。入栈(压栈):数据的插入。出栈(弹栈):数据的删除。增栈、减栈:栈的增长方向。2、函数的形参和返回值。

2024-09-06 22:18:46 270

原创 内核链表

通过定义一个通用的list_head结构,内核开发人员可以轻松地构造和操作不同对象的列表,而无需为每类对象编写专用的链表函数。在删除链表节点时,内核链表会将节点的prev和next指针分别设置为特定的“毒化”值(如LIST_POISON1和LIST_POISON2),以确保被删除的节点不会被意外访问,从而提高了链表操作的安全性。结构体第一个成员的首地址即为结构体的首地址,将结点放在结构体的成员的第一个位置,链表的首地址即为结构体的首地址,方便访问结构体的其他成员数据。获取结构体成员到结构体开头的偏移量。

2024-09-06 00:22:16 621

原创 单向链表与双向链表

1.结构:每个节点包含三部分信息:存储的数据(data)、指向前一个节点的指针(prev)和指向下一个节点的指针(next)。插入:与单向链表类似,但在插入新节点时,需要同时设置新节点的prev和next指针,以及相邻节点的指针。删除:同样需要遍历到目标节点的前一个节点,然后修改其next指针,使其跳过目标节。遍历:可以从头节点开始正向遍历,也可以从尾节点开始反向遍历。删除:直接修改目标节点前后节点的指针,使其绕过目标节点。指针指向新节点,新节点的next指针再指向原位置的后一个节点。

2024-09-04 21:59:20 705

原创 数据结构基本概念

将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中,并在此基础上实现某个特定的功能的操作。散列存储(哈希存储):将数据元素的存储位置与关键码之间建立确定对应关系从而实现查找的存储方式(方便查找)一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)索引存储:通过关键字构建索引表,通过索引表来找到数据的存储位置。线性结构:元素之间一对一的关系(表(数组、链表),队列,栈)数据的物理结构:数据的逻辑结构在计算机内存中的存储形式。数据的逻辑结构:数据元素与元素之间的关系。

2024-09-03 20:50:54 469

原创 数据库命令与语句

DELETE FROM 表名称 WHERE 列名称 = 值(与create相似)UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值。3.select 列名 from 表名称 查找该列名的数据 (若为*则查找所有数据)1.create table 表名称(列名1 类型,列名2 类型......)创建表。sqlite:嵌入式数据库,开源免费,代码量少,文件型数据库可以移动,最大2T。4.where :1.用于特定条件的数据查找 where 列/运算符/值。

2024-08-29 19:43:04 850

原创 IO多路复用

2.int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event) 添加文件描述符到集合。读事件的文件描述符集合,写事件的文件描述符集合,其他异常;1.创建内核事件表,不受到文件描述符上限限制,一对多,时间复杂度O(log n)2.监听文件描述符集合在用户层,需要应用层和内核层互相传递数据;

2024-08-28 22:12:17 677

原创 TCP并发服务器

多进程流程:socket()---bind()---listen()---accept() ---fork()阻塞IO:fgets,scanf,read,recv,getchar(用来实现多个IO同步的效果)TCP实际上是单循环的服务器,只能建立一对一连接,其他人不能再与其建立连接,之前只有一个套接字。信号驱动IO:实现:(当终端有输入的时候应该会触发,发射信号,才会执行)非阻塞IO:非阻塞就是访问内核,有数据带着数据返回,没有数据也带着返回。特点: 1、异步通知io的方式,节省CPU。

2024-08-27 22:07:56 725

原创 TCP协议与网络测试工具

因为缓冲区的大小,一次性发送的数据会进行拆分(大小不符合的时候)就和水一样一次拆一次沾到一块,不好对数据进行拆分字节流就是像水一样,一个接着一个往过流,字节流,紧挨着,多次发的东西一次性接受在底层下面,socket 会在发送数据会等一下,时间到了就一次性发送。因为是文件IO,标准IO的问题,读写问题,因为fgets,先去底层取数据,我们把东西拿走了,而等文件IO,去取数据的时候东西已经没有了。fgets()后面的参数需要一个流指针,后面是一个流指针,遇到\n结束,并且将\n读到。

2024-08-23 22:16:05 2355

原创 UDP+TCP

1)建立连接:socket------bind------listen------accept。1)建立连接:socket------bind(可选)------connect(发起连接)功能:如果在服务端调用,则表示将参数1相关的文件描述符与参数2指定的接口地址关联。有两个socket:一是监听的socket,二是处理建立连接的socket。2)通信过程:read-----write------close。2)通信过程:read-----write------close。用来保存发送方的地址信息;

2024-08-22 20:34:18 903

原创 IPC进程间通信方式及网络通信

在现在(IPv4)的网络中,IP地址是32bit的二进制数,采用大端字节序。其允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或以上的进程映射至自己的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程读取。

2024-08-22 02:30:05 1008

原创 有线管道与信号

sighandler_t signal(int signum,sighandler_t handler)信号处理函数的注册函数。3.kill函数:int kill(pid_t pid, int sig)通过该函数可以给pid进程发送信号为sig的系统信号。SIG_DFL ---默认操作。半双工 如:对讲机 --- 同一时刻 只能有一个方向。SIG_IGN ---忽略。单工 如:广播 --- 单一方向的数据通道。

2024-08-19 00:59:16 492

原创 进程间通信

sem wait()判断当前信号量是否有资源可用 / sem post()释放资源。参数:pipe fd 用来获取管道两端 读端:fd[0] 写端:fd[1]p操作逻辑:尝试获取资源,有资源可用直接使用,资源减1,如果没1,继续等待。写端存在,读端不存在:导致管道破裂,收到信号SIGPIPE,使程序结束。2.有顺序的进行访问:信号量机制,核心操作:pv。v操作:产实这个资源,表示资源个数加1。

2024-08-16 21:56:16 867

原创 线程第二部分

2.pthread_detach 可分离属性 --子线程运行很久才结束 - 设置分离属性一般为系统回收。1.pthread_join 需要自己回收 --线程的属性可结合性 一般是子线程在较短时间内运行完。带来资源竞争 (专门的技术解决资源竞争 ---互斥 同步)机制: 互斥锁:互斥 排他性 ---要么不访问 要访问就是一次完整的操作(原子操作)5.锁的操作机制:定义互斥锁----初始化锁----加锁-----解锁-----销毁锁。初始化锁:pthread_mutex_init();

2024-08-15 21:59:20 941 1

原创 线程基本概念

3.线程的编程: 类似于进程过程 NPTL 创建----执行-----退出-----资源回收。start_routine 线程执行函数(线程回调函数) (完成线程任务功能的函数,需要调用自己实现)2.线程存在于进程中 线程共享进程的资源。线程结束不一定导致进程结束 但进程结束会导致线程结束。主函数所在执行流为主线程 其他的线程为子线程(次线程)1.线程:轻量级的进程 进程:重量级。

2024-08-14 22:34:44 1273

原创 进程第二部分

在进程结束时自动执行后面所跟的函数。eg:“ls” ... --- 要执行的文件本身需要用到的参数(都是字符串形式)父进程创建出子进程之后,子进程做的事情与父进程完全不同(自力更生)path --- 表示要运行的文件的路径(要包含文件名)p ---path //PATH(可执行文件路径)arg --- 要执行的文件的名字。v --- vector(向量)e ---表示该函数的环境变量。

2024-08-13 21:39:08 669

原创 进程

ps -elf | grep 程序名 //主要查看 父子进程 包含PID PPID // parent pid。pstree -sp pid号 查看父子进程间的关系(以树状图的方式展现 包含pid号)D: 不可中断的睡眠态。S:可中断 的睡眠态。进程是程序的实例 进行中的程序------正在运行中的程序。n个fork同时前后运行:一共2的n次方个进程,新生成2的n次方-1个进程。进程是程序的一次执行的过程(一个程序可以对应多个进程)PID // Process ID // 进程的id号。

2024-08-12 20:45:27 504

原创 目录函数

5.link ln 1 2 :int link(const char *oldpath, const char *newpath)创建一个硬链接文件(ll -i)2.strerror:打印errnum出错码对应的出错信息 char *strerror(int errnum)3.time:获得1970年到现在的秒数 成功返回1970年到现在的秒数 失败返回-1。oldpath:被链接向的文件的路径 newpath:新符号链接文件。

2024-08-08 23:56:44 821

原创 对目录的操作

7.stat : 获得文件的属性 int stat(const char *pathname,struct stat* statbuf)6.mkdir 创建目录 rmdir 删去一个空的目录 成功返回0 失败返回-1。1.fileno:获得文件流指针里的文件描述符 int fd = fileno(FILE *fp)path为改变后的路径 成功返回0 失败返回-1。成功返回包含路径空间的字符串首地址 失败返回NULL。

2024-08-07 23:56:15 346

原创 标准IO与文件IO

2.特性:1、没有缓存区2、操作对象不再是流(FILE*),而是文件描述符(int 0-1023)3、文件描述符(内核每打开一个文件就会获得一个文件描述符)6.read:通过文件描述符读取文件中的数据ssize_t read(int fd, void *buf, size_t count)fd为文件描述符,buf为要写入文件的字符串首地址 ,count为写入字符的个数,一般为buf有效长度。返回值:成功返回读到的数据大小,单位为字节 失败返回-1 读到文件结尾返回0。

2024-08-07 01:10:30 717

原创 stdio

2.写size_t fwrite(const void *ptr, size_t size,size_t nmemb, FILE *stream);1.读:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);从stream流对象关联的文件中获取size大小字节的文本数据并存储到s对应本地内存(栈区数组,堆区内存)从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr所在的本地内存中。

2024-08-05 23:49:38 1899

原创 shell脚本

普通文件, d 目录, b 块设备 , c 字符设备,h/L 软链接(快捷方式),p 管道 ,s 网络文件(套接字)LANG语言 美式英文 全球统一字符型(UTF-8)(消除乱码)(一个中文占3个字节)/bin/bash):上一句shell命令执行的效果(成功返回0,失败返回1)作者权限,r读,w写,x执行 组用户(批量用户管理) 其他人。if (条件)[] /test(0为真,1为假) + 表达式。$$:当前shell的PID(正在运行的程序的编码)‘’单引,打印字符串,遇到$变量依然打印$变量。

2024-08-05 02:13:27 474

原创 结构体与共用体

5.算数右移:有符号类型,最后一位移出去后,前面有可能补0(i 为正数),也有可能补1(i 为负数)建议编写参与位运算的数据类型时,标明是否有符号,即加signed 或 unsigned。3.按位异或:指定位翻转(相同为0,不同为1)(连续两次异或同一个数,还是数本身)2.共用相同的内存空间(最大的),有效的为最后输入的字节。6.逻辑右移:无符号类型,最后一位移出去后,前面补0。枚举的常量可以自己定义,其本质为int 型。INT生成类型名,作用为已有的数据类型起别名。4.逻辑左移:抛掉最高位,低位补0。

2024-08-02 23:15:44 733

原创 结构体

pHead头指针保存第一个节点的位置(插入,删除的算法复杂度为1,效率相较数组较高,但其成员地址并不连续,,不能直接加i访问第i个元素的地址节点内存均在堆区)2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节的放置位置必须能够整除成员的字节数。4、可以使用#pragma pack(n)强制编译器按照指定n值对齐,可以为1,2,4,8,16。5.对齐原则:1、结构体按照其最长成员大小对齐,即最终的大小必须为最长成员大小的整数倍。4.结构体对齐:系统会有意浪费空间,来对齐提高系统效率。

2024-08-01 21:51:01 602

原创 多维数组与指针

若getMem(s)未取地址,则s为野指针,s的基类型为char *型,指针传参时,形参需要一个指针*P来接收,getMem函数中,char *为基类型,* 只是为了说明p 为指针。1.指向数组的指针:比如int a[10],此时&a是指向数组长度为10的一维数组的指针,其基类型为int [10],占8 个字节。1.a代表二维数组首元素的地址,此时的首元素指首行所有元素所成的组,即a+1代表第一行的首地址。(数组首元素地址,数组元素个数,一个元素所占字节个数,描述比较大小关系,其返回值为int型)

2024-07-31 22:18:54 477

原创 指针第二章节

2.strcpy与strncpy:strncpy本质上也是拷贝,只不过在传参时多传一个int n,即拷贝多少个字节数。二、迭代器([begin,end]):通过前一个元素找到下一个元素(++),原理是基于数组有序性。7.指针函数:返回值为指针的函数(不建议使用局部变量,用完即销毁,最后所指向的是野指针)1.const int i ,无法通过直接访问改变其值,但能通过间接访问修改。3.void *p万能指针:能接受任何类型指针的地址(不能进行指针运算)3.int const *p,无法修改p所指向的地址。

2024-07-30 22:14:48 662

原创 指针

7.int i=1,char *p = (char *)&i ,if *p == 1,则为小端排序方式。int *p: *为类型标识符 (指针变量p指向i) 可以希望使用指针变量p来访问i。i= 100(直接访问) *p= 100(间接访问)2.一般形式:基类型 *指针变量名 (基类型指所能装地址的数据类型)6.指针类型强制转换:char *p = (char *)&i。8.对指针可以进行加法计算,结果与基类型有关。p为变量可以进行++计算,但a为常量不能++计算。

2024-07-29 19:35:22 417

原创 预处理命令

4.register变量:寄存器变量,将变量定义为寄存器变量,提高读写速率(建议非命令)本质:在预处理阶段,将所有的宏替换为数值(无脑替换,不做任何运算处理),宏定义不加分号。1.局部作用域:局部作用域里声明的标识符(局部变量)只能作用于所在的{}里,(栈区)5.extern(局外声明变量):extern 为声明,定义只有一次,声明有无数次。1、编译过程: 编辑 ----预处理----编译-----链接-----运行。预处理阶段,会在程序段1观察宏名是否定义过,若没有定义,则为无效,执行else。

2024-07-27 21:38:09 504

原创 数组传参

数组传参是指针传参,可以修改给出地址中的数据,即可以在被调函数中修改主调函数。如sizeof(s),由于s为数组名又代表数组首元素地址,所以只有8字节。在C语言中数组作为函数参数,只传递数组地址,需要再传参数:数组元素个数。一维char数据由于'\0' 存在,所以无需传递数组长度。三、二维int、char数组需要传递行数,并且将列数写定。利用函数来实现一维char数组的string。一维int数组传参时需要传递数组长度。二维int数组求极值与边缘求和。一、数组作为函数参数。二、一维char数组。

2024-07-26 20:29:40 553

原创 函数的递归调用

栈区:形参和局部变量都保存在栈区,空间有限,linux约8M,windows约1M。2.assert(expression):关系表达式,若表达式为假,则程序终止。3.值传递:C语言中,所有传参都是值传递,被调函数中,无法通过形参改变实参地址。是循环的第五种表达方式,(无条件)导致栈区空间消耗殆尽造成程序崩溃。调用结束后,恢复现场(消耗栈区空间)(只把i的值传过来,不会影响i的值)形参是实参的复制品。5.传参过程中,不允许对同一变量进行++,--的操作。堆区:向操作系统申请,用完归还,手动申请和销毁。

2024-07-25 22:06:57 590

原创 二维数组与函数

初始化:int a[3][4] ={{1,2,3,4},{5,6,7,8,},{9,10,11,12}}{}用来说明具体一个一维数组的数据,去掉则表示整个二维数组的数据。如: int a[3][4] 表示定义一个叫a的三行四列二维数组。3.函数的一般形式:类型标识符 函数名(形式参数表列)执行到被调函数的return 语句时,立马结束当前函数的执行。二维数组是一维数组的数组,即一个特殊的一维数组、a表示数组的首元素地址,即a[0]的首元素地址。2.所有函数是平行的,不能在函数里定义别的函数。

2024-07-24 22:13:41 624

原创 字符串数组

strcmp(s1,s2)若输出为正数,则s1 > s2;若输出为零,则相等(不能直接使用关系运算符)strcat(目标,源)(内存至少为strlen1 + strlen2 + 1) 不能直接使用赋值。strcpy(目标,源)(确保内存足够大,最少为strlen +1),防止越界访问。将一个有序的数列取中值,判断数在哪一段,每次筛选原来的一半,重复多次。scanf输出时,若有空格,会认为是数据的分割,后面的数据不会输入。容量至少为有效字数个数 +1(空字符\0)二、字符串数组(容器,用来存放字符)

2024-07-23 19:25:43 481

原创 数组

如:float a[100]数组名与标识符规则一致,常量表达式表示该数组数的个数,类型可以为除void外所有的数据类型,常量表达式必须为整型常量(最少为1)int len = sizeof(a) / sizeof(a[0])表示数组中元素个数。[]下标运算符:定义的方括号为类型说明符,不是下标运算符。数组的数组名代表数组的首元素地址(常量),不能做左值。数组越界访问:初始化列表的元素大于数组个数。连续性:数组中所有元素地址连续,没有间隔。有序性:下标小的元素在下标大的元素前面。一、一维数组的定义和引用。

2024-07-22 21:19:10 394

原创 循环控制

先执行表达式1(一次)。再判断表达式2是否为真,若为真,则执行循环体,再执行表达式3;1.循环三大元素:1.循环变量初始化 2.循环的执行条件 3.要有使循环趋于结束的语句。while先判断后执行 (即do while至少执行一次)先判断表达式(关系式或逻辑式),后执行循环体。1.for(表达式1;循环内可以嵌套循环,且内层循环比外层运行快。2.do while先执行后判断。跳出当前所在循环,循环终止。结束本次循环,开始下次循环。2.while(表达式)三、do while语句。while(表达式)

2024-07-21 23:50:53 261

原创 选择结构程序设计

每个case后跟的语句结束后,需要加break;当a大于b时,表达式为真,取a,不大于时,表达式为假,取B。用关系运算符连接两个表达式即为关系表达式,其值为逻辑值。||逻辑或 (一真为真,全假为假)2.if(表达式) 语句1 else 语句2。else if (表达式2) 语句2。&&逻辑与 (全真为真,一假为假)如判断大小,max = (a>b)?else if(表达式m) 语句m。4.if后必须加(),且后面不加;判断一个量是否为真时,用!3.if(表达式1)语句1。

2024-07-19 19:37:54 630

原创 C语言顺序程序设计

f,F 四舍五入,十进制的小数(%m.nf,m表示总宽度,包括小数点,n表示小数点后 保留几位,四舍五入)int为返回值类型,printf调用函数,const char *字符型指针,承载字符型变量地址信息 ...变参,可传可不传。向终端输出字符,占一个字节,一般为字符型和整型变量(可以输出转义字符)putchar(a)为右值。o,u,x,X 无符号整数参数,八进制o,十六进制x。

2024-07-18 19:29:35 541

原创 变量赋初值,各类数据的混合运算,运算符及表达式

4.lvalue(leftvalue):左值(也为locatable),能在内存中定位,即为左值,利用&可以获得地址,即为左值。5.rvalue(rightvalue):右值(rightable),不能定位,即为右值。2.int=double(int不能显示小数,只保留整数,为小数部分截断)4.int =short(符号为正,前面补0;1.赋初值(初始化,变量开辟空间时同时赋值),如int i= 5。6.左值一般为变量,可以改变,常量一般为右值,不可以改变。7.临时变量为右值,不能被赋值,不能自增,

2024-07-17 18:53:44 776

原创 整型数据、浮点型数据及字符数据

字符数据使用char,占用一个字节,范围为-128~127,0~127范围中的每个数字均与ASCII码一一对应,如A既可以使用65表示,也可以使用'A'表示。浮点型变量提供的有效数字是有限的,有效位以外的数字会被抹去,产生误差,在小数后加f表示float形式的小数。计算机中用指数形式表示小数,整数部分为1,用二进制表示小数部分,用2的幂次部分表示指数部分。指数形式如12e3或12E3,均为12X10^3,e前面必须为数字,后面必须为整数。整型数据有一定范围,当超出范围值后,会发生整形溢出。

2024-07-16 18:19:12 472

原创 linux基本命令指令及C语言数据类型基础

vi分为两种状态:命令状态与编辑状态,默认为命令状态,按i进入编辑状态,按esc进入命令状态。cp (copy) 复制文件(cp 源文件 目标文件)ls (list) 列表,查看当前工作环境中的文件。mv 源文件 目标文件 移动源文件到目标文件。程序运行过程中,值不能改变的是常量,可以改变的是变量。ls -a 查看所有文件,包括隐藏文件。./a.out 运行当前环境的a.out。(x)yy 复制以光标所在行开始的x行。(x)dd 剪切以光标所在行开始的x行。touch 创造新的文件。

2024-07-15 18:26:00 369 1

空空如也

空空如也

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

TA关注的人

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