自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 今天是学习嵌入式的第39天

2. 只给指定几列填,剩下留空:insert into student (id, name, sex) values (4, "赵五", "男");不加where,要么全表更新,要么全表清空,手滑直接删库,属于经典背锅事故。1. 给全部列填数据:insert into student values (1, "张三", "男", 18, 90);咱们先说数据库是干啥的,简单讲,就是专门用来大批量增删改查数据的软件,不用咱们自己对着一堆txt文件瞎折腾。这里的*代表所有列,一次性把整张表的数据全部查出来。

2026-09-18 23:57:48 204

原创 今天是学习嵌入式的第38天

只要集合里任意一个fd有读写事件,select就不再卡住,把有事件的fd留在集合里,没事件的删掉。1. epoll_create:创建内核里面的事件表,返回一个epoll的fd。一句话:一个线程,同时监视一堆文件描述符,哪个有事件就处理哪个。3. 空一行CRLF隔开,最后实体主体,GET请求一般这块是空的,POST才会放提交的数据。3. epoll_wait:蹲事件,阻塞等待,有事件就把触发事件的fd打包返回给用户。一般搭配线程池用,提前开好一批线程,来了连接直接复用,不用反复创建销毁。

2026-09-15 22:09:41 91

原创 今天是学习嵌入式的第37天

接收方收到数据,回复确认号,告诉发送方我收到哪了,下次从哪开始发,保证数据完整不乱序、不丢包。6. accept:服务器调用,取出监听队列里的连接,成功之后返回一个新套接字,专门用来和这个客户端收发数据。4. 保活掉线检测:连接建立之后长时间空闲,TCP会检测对方在线状态,判断连接有没有断。2. connect:客户端用,用来向服务器发起连接请求,成功返回0。特殊情况:被动方刚好数据发完,ACK和FIN合并,四次挥手简化成三次。2. 被动接收方回复SYN+ACK,意思:收到你的请求,我也同意连接。

2026-09-14 17:47:56 53

原创 今天是学习嵌入式的第36天

UDP是无连接的,不用提前握手建立连接,直接扔数据包,就像寄明信片。1. 网络里面所有端口、IP,全部要求大端字节序,本机小端数字一定要用htons、inet_addr转换,忘记转换代码完全无法通信。• 把字符串IP,比如"192.168.1.100",转换成网络大端的二进制数字,直接给s_addr成员用。TCP是字节流会粘包。把网络大端格式的二进制IP,变回人看得懂的字符串,比如192.168.1.100,打印输出的时候用。2. 填充sockaddr_in结构体,设置本机IP、端口,htons转端口。

2026-09-04 22:53:05 189

原创 今天是学习嵌入式的第35天

• C类:192.0.0.0‑223.255.255.255,掩码255.255.255.0,小型局域网,我们家里路由器192.168.x.x就是C类;MAC地址:网卡出厂自带,全球唯一,同一个局域网内部,靠MAC地址完成数据传递。私有IP(上面写的私有段):只能在自己家局域网内部用,不能直接上互联网,路由器做NAT转换才能访问外网。网络位不变,主机位全部写1,就是广播地址:192.168.0.255,发给这个局域网所有设备。👉 虚拟机相当于局域网一台独立电脑,既能访问别人,局域网别的电脑也能访问虚拟机。

2026-09-03 23:16:01 179

原创 今天是学习嵌入式的第34天

管道、消息队列、shm共享内存属于进程间IPC,线程虽然也能用,但太重,线程一般不用。动态初始化:int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *attr);比如生产者放数据,消费者没数据就休眠,不要while死循环轮询占满CPU,就用条件变量。管道、FIFO、消息队列、systemV共享内存属于进程间通信,线程能用,但是开销大,线程一般优先用pthread系列同步接口。原因cnt++不是单条CPU指令:读,自增,写回。

2026-09-02 21:39:23 179

原创 今天是学习嵌入式的第33天

所有进程直接读写同一块内存,数据不需要在内核和用户空间来回拷贝,速度拉满。但是进程之间内存完全隔离,互相看不见对方的数据,必须靠操作系统提供的IPC手段传递数据。注意:open打开有名管道的时候,读和写必须两边都到位,open才会成功,否则程序阻塞卡住。3. 如果所有读端全部关闭,再往管道write写,直接触发管道破裂,进程收到信号直接退出。调用pipe(fd),得到两个文件描述符 fd[0]读端,fd[1]写端。内核开辟的消息缓冲区,多个进程可以往队列丢消息包,也可以按类型读取消息包。

2026-09-01 20:10:24 255

原创 今天是学习嵌入式的第32天

一个进程里面可以开好多个线程,同一个进程里的所有线程,堆内存、全局变量、静态变量这些东西全部是共享的,只有栈内存每个线程是自己独一份。线程A读到变量是10,还没来得及写回去,CPU切到线程B,B也读到10,两个线程都做+1操作,最后结果本该12,实际变成11,数据就错了,这叫竞态条件。作用:等着目标线程结束,然后回收它占的资源。这个函数是阻塞的,如果线程还没跑完,程序就卡在这原地等,直到线程结束才往下走。3. pthread_mutex_unlock:解锁,把锁交出去,别的等待的线程就可以拿到锁。

2026-08-29 23:57:43 243

原创 今天是学习嵌入式的第31天

底层写时复制COW:刚fork完父子进程共享物理内存,只有某一方要修改数据的时候,内核才复制那一块内存给子进程,不会全盘复制内存节省开销。比wait更灵活,可以指定等待某一个特定PID的子进程,还可以设置非阻塞模式(选项传WNOHANG,不卡父进程,子进程没结束就直接返回0)。PID不变,把当前进程里面全部旧代码、内存全部清空,加载磁盘上另一个新程序,从新程序main开始跑。进程:程序跑起来之后的动态实例,有自己内存、PID,经历创建、运行、消亡。3. 栈区:存局部变量,函数调用栈,函数执行完自动回收;

2026-08-27 20:16:38 237

原创 今天是学习嵌入式的第30天

和标准 IO 的fseek功能一模一样,只不过操作对象是文件描述符 fd,不是 FILE 指针,同样三个基准SEEK_SET / SEEK_CUR / SEEK_END。文件 IO 是操作系统直接给的接口,没有缓冲区,适合设备、管道这类特殊文件。前几天换了个设备,出了点儿小插曲,断更了几天,实际上我已经学到线程了,更新还在标准IO,看客友子们不好意思,我这几天会陆续补上前边差的!简单理解:文件里面有个看不见的 “读写光标”,读、写的时候光标会自动往后挪,fseek就是手动挪这个光标位置。

2026-08-26 18:54:50 227

原创 今天是学习嵌入式的第27天

• fread:读到的数据存到哪里,填变量/数组地址。1. fgets、fscanf、printf:文本模式,把数字转成字符保存。⚠️ 如果用r、w文本模式,windows下会乱改换行符,二进制直接坏掉!2. fread、fwrite:二进制模式,内存里面长啥样,文件就存啥样。二进制一定要 rb、wb,不能写r、w。// 从fp读,每块4字节,读1块,读到&width这块内存。• fwrite:把哪里的数据写进文件,填变量/数组地址。int数字123,直接保存4个原始二进制字节,不转字符串。

2026-08-21 23:15:51 171

原创 今天是学习嵌入式的第26天

标准IO自带缓存,咱们写的数据不会立刻跑到硬盘,先暂存在内存缓冲区,满足条件才真正写入磁盘。咱们操作文件固定三步走:打开文件 → 读/写文件 → 关闭文件。不要拿fgetc返回EOF直接当成唯一判断,要搭配feof区分:是读到末尾,还是真的读写出错。存在的话,不会清空旧内容,新写的内容全部加到文件尾巴。旧内容保留,写的数据追加到末尾,同时支持读取文件。3. w只写:文件不存在就新建;文件原本存在,直接把原有全部内容清空,从头写。不关闭会造成:数据留在缓存没真正写到硬盘,出现数据丢失,还会占用系统资源。

2026-08-20 23:19:25 151

原创 今天是学习嵌入式的第25天

运行速度慢,但是写起来省事,开发效率高,适合做系统运维脚本。c是创建压缩包,x代表解压,v显示过程,f必须放在最后,指定文件名。find . -name "文件名",点代表当前目录,会把找到的完整路径输出。编译型(C语言这种):数据类型丰富,全部代码先编译成二进制,再运行,跑的速度快,但是写代码开发慢。用法:head/tail -n 数字 文件名,-n后面写几,就看几行。6.rm -rf:强制删除文件夹,就算里面有东西也能删掉,慎用。>> 追加重定向:把输出写到文件末尾,原来内容保留,接着往下写。

2026-08-19 18:42:02 241

原创 今天是学习嵌入式的第23天

链式队列动态节点,不用考虑越界。2.入队EnterSeqQueue:先判断队列满不满,如果没满,把数据放到tail下标位置,tail = (tail+1)%最大长度。递归算出左子树高度、右子树高度,取两者更大的值再加1(+1代表算上当前自己这个节点),一层一层向上返回。3.出队DeSeqQueue:先判断队列是不是空,如果不为空,取出head位置的数据,head=(head+1)%最大长度,队头往后走。8.销毁二叉树DestroyBTree:后序销毁,先销毁左、右子树,最后释放自己节点,避免内存泄露。

2026-08-17 21:35:13 195

原创 今天是学习嵌入式的第17~19天

先消行、加分数,再把预览方块切换为当前操控方块,随机生成新预览方块,重置出生位置。方块移动、旋转前,必须先调用这个函数,把旧坐标的方块内容清空、颜色归零,再绘制新位置,否则屏幕会残留旧方块残影。5、COL_XXX 系列:颜色编号宏,统一管理方块颜色,0为无颜色,1-7对应七种不同彩色,后续上色直接调用编号,方便修改维护。

2026-08-16 19:30:59 465

原创 今天是学习嵌入式的第22天

每一个节点有三块内容,数据、指向前一个节点的前驱指针、指向后一个节点的后继指针。头节点一般不放数据,用来做链表的起点,最后一个节点的后继等于NULL,代表链表结束。3. 指定位置删除:先遍历找到要删的节点,先修改前后节点的指针,把这个节点从链里摘出去,再移动遍历指针,最后释放这个节点内存。2. 尾插:找到链表最后一个节点,新节点连到尾部,改四根指针,前节点next指向新节点,新节点pre指向前节点,新节点next置空。1. 创建链表:先开辟头结点内存,把头结点的前驱、后继置空,空链表就建好了。

2026-08-14 22:40:53 382

原创 今天是学习嵌入式的第21天

任意位置删除:找到要删节点的前一个节点,跳过目标节点,把前后连起来,最后释放被删节点内存,防泄漏。尾插法:从头结点一路找到最后一个节点,新节点挂在末尾,最后节点指针置空,最常用、最稳。3. 内存特点:节点都是零散堆内存,不连续,随便放哪都行,靠指针找到下一个节点。销毁链表:从第一个有效节点开始,逐个释放所有节点,最后释放头结点,彻底清空内存。任意位置插入:先找到插入位置的前一个节点,改两次指针,先连新节点,再断旧链接。遍历:从头结点下一个节点开始,一个个往后跑,直到指针为空,挨个打印数据。

2026-08-13 22:42:41 263

原创 今天是学习嵌入式的第20天

前几天在做项目,所以推更了,各位看官不好意思,等我吃透了,总结好,再给各位补上欠更,今天正式告别了C语言基础学习阶段,开始了数据结构学习!动态顺序表用malloc动态堆内存,不够能扩容,咱们作业写的就是动态版。1.本质:就是用一片连续内存存数据,类似加长版数组,逻辑上前后挨着,物理内存也挨在一起。3.核心成员:存数据的指针、最大容量、当前已有元素个数,三个变量配合管理。指定下标插入:插入位置后面所有元素整体往后挪一位,腾位置再放新数;销毁:先释放数据数组内存,再释放结构体本身,指针置空防野指针。

2026-08-12 20:59:10 313

原创 今天是学习嵌入式的第16天

代码常量放只读区,全局静态常驻内存,局部变量栈自动回收,malloc堆手动管理,调试靠gdb抓段错误,静态库打包进程序、动态库运行共享。空指针 NULL = 地址0,系统保护,不能读写,一操作直接段错误。字符串就在这,不能改。加 -g 才能调试,不加 gdb 看不了代码。局部变量、函数参数、数组、指针变量全在栈。gdb 直接 run,崩在哪行就是哪行错。函数执行完,系统自动回收内存,不用你管。栈自动,堆手动,常量不能改,全局活全程。速度最快,空间小,溢出就栈溢出报错。你不开自动销毁,必须手动 free。

2026-08-06 22:23:28 153

原创 今天是学习嵌入式的第15天

• malloc(字节数):堆上申请一块连续内存,返回void*通用指针,申请失败返回NULL,用之前必须判空;• 栈内存:普通局部变量、数组,函数运行时自动分配,函数结束自动回收,不用手动管;1. 核心特点:所有成员共用同一块内存空间,同一时刻只能存一个成员的数据,改一个成员的值,别的成员数据直接被覆盖。3. ^异或:对应位不一样为1、一样为0,特性:一个数异或自己=0,异或0不变,可用来两数交换、加密。4. 小提醒:枚举本质就是整型,能和int互相赋值运算,但尽量只用来存预设选项,别乱混用数字。

2026-08-05 21:23:54 209

原创 今天是学习嵌入式的第14天

②传结构体地址(指针):函数操作的就是外面本体,函数里修改,外面的变量真的会跟着变。像我们写的GetCurDate,就用指针,函数内部读取输入直接改外面结构体。普通变量只能存单个东西,结构体可以把年、月、日这种一堆相关的数据装到一个盒子里。5、如果是结构体指针(struct date *p),就用 -> 箭头访问成员。普通变量点,指针用箭头。1、结构体struct,就是把一堆不同类型的变量打包成一个整体。year、month、day叫做结构体的成员。p->year,指针不能用点,要用箭头。

2026-08-04 23:15:01 393

原创 今天是学习嵌入式的第13天

数组指针指向完整数组,普通一级指针只指向单个元素,步长完全不一样。先看[],p本质是数组。数组里面存放的东西是int(一级指针)。数组名传参的时候,会退化成二级指针。数组指针和二级指针不能随便混用,类型不一样,直接赋值会报警告。指针数组的数组名,作为函数参数等价于二级指针,可以互相匹配;不要把数组指针和指针数组写混,括号位置错了,含义天差地别。先看括号,p本质是指针。区分口诀:有括号包住p,就是数组指针。可以理解成:一堆指针塞进一个数组里。链条:普通变量→一级指针→二级指针。看到两个*:二级指针。

2026-08-03 21:59:43 428

原创 今天是学习嵌入式的第12天

作用:同一个函数,可以传入不同功能的子函数,实现灵活切换逻辑(排序自定义比较规则就是典型用法)3. const修饰指针,重点分清:不能改指针本身,还是不能改指针指向的数据。*p不能改(指向的数据只读),但是p可以改(指针可以指向别的变量)p不能改(指针指向固定不变),*p能改(可以修改指向的数据)• int (*p)() → 函数指针(是指针,指向函数)• int *p() → 指针函数(是函数,返回指针)示例:int (*p)(int a,int b);定义:存放函数地址的指针,指针指向一个函数。

2026-08-02 19:41:07 235

原创 今天是学习嵌入式的第11天

普通变量装数字,指针变量装别的变量的门牌号(地址)。函数拿到门牌号,用解引用,直接修改外面原始变量。parray[i] 等价于 *(parray+i),都是访问数组第i个元素。只改指针保存的地址,外面变量丝毫不变。&gcd 就是gcd这个盒子的地址。记住结论:想在函数内部改动main里的变量,必须传地址+函数内使用。,调用函数直接写 a,等价于 &a[0]。千万别漏掉&,parray[i]是数值,scanf需要地址。顺着地址,修改main函数的gcd变量。&gcd 把gcd地址传给指针pgcd。

2026-07-31 20:01:24 159

原创 学习嵌入式的第10天

3.让我印象最深刻的是,汉诺塔,这道题,使我感觉到了计算机的魅力,用简单的命令,让计算机给出了完美解决答案,以前在我的印象中,计算机只会计算,基本上都是通过人的脑力相出整个构架,再让计算机来求解,这道题让我打开了视野。数组传参传的是地址,子函数改数组,主函数数组直接变,相当于共用一块地盘。大事拆小事,小事一模一样,拆到最小能直接算,再原路返回算结果。有三根柱子A、B、C,A上面叠着一堆圆盘,从上到下越来越大。第一步:把上面 n-1 个盘子,借助C,从A挪到B。第三步:把n-1个盘子,借助A,从B挪到C。

2026-07-30 22:04:25 153

原创 今天是学习嵌入式的第9天

之后想用这个功能,直接喊名字调用就行,不用一遍一遍复制粘贴一大堆代码,省事还清爽,这个打包操作就叫封装函数。如果传递数组进去,函数内部直接修改数组里的内容,不用把结果返回出来,调用的时候直接写函数名就行,不用拿变量接收数据。4. return一旦执行,函数直接结束,所以if里面写了return,后面的代码可以直接省去else,代码能写得更简洁。往函数里传入数据,函数算出结果,通过return把数值送回来。5. 传参数量、类型要对上,函数规定要1个数字,调用的时候别不传,也别一次性塞好几个数据进去。

2026-07-29 23:54:45 180

原创 今天是学习嵌入式的第八天

方式2:char arr[6]={'a','b','c','d','e','\0'};内存真实存放:'a' 'b' 'c' '\0',实打实占用4个字节。3. 想把字符数组当成正常字符串操作,一定要预留出存放\0的位置,挤不下结束符,后续所有字符串操作全部翻车!程序先找到目标数组原本的\0,从这个位置开始接上新内容,拼接结束自动补充全新的\0。风险预警:目标数组空间必须足够宽裕,装下全部文字外加\0,空间不够直接越界出错。我今天又学习了,字符型数组,知识很多,很庞大,我的脑袋有点装不下,在这里记一下。

2026-07-28 18:05:33 175

原创 今天是学习嵌入式的第七天

核心思想:在每一轮未排序区间内,全程只进行对比、不交换,遍历寻找最小值所在的下标。核心思想:相邻两个元素依次比较,如果前一个数字大于后一个,立刻交换。小总结:冒泡排序是每次比较之后就换,选择排序是,拿着当前的数,跟每一个比较,有小的就选择小的,拿最小的来放在此次的开始位置。内层j < len-1-i;选择排序:先搜寻记录最小元素位置,搜寻结束统一交换,小数依次放到数组前面。1.冒泡排序内层循环不要省略 len-1-i,避免重复比较已经排好的数据。冒泡排序:相邻元素实时比较,发现逆序当场交换,大数向后移动。

2026-07-27 21:35:31 229

原创 学习嵌入式的第六天

跑完再检查条件,成立继续循环,不成立退出。continue:立刻跳过本轮剩下代码,直接进入下一轮条件判断,循环不会终止。1. 循环变量更新一定要写在大括号里面,不然变量数值永远不变,直接死循环。3. 条件别随手写成赋值符号=,判断相等必须用==,写错极易造成死循环。while(n<5),大括号里没有n++,程序卡死。如果写在循环内部,每次循环sum都会重置归零,永远得不到正确总和。很多人漏写大括号,导致只有一行循环,剩下代码直接跳出,结果出错。程序走到while,第一时间检查括号里条件成立不成立。

2026-07-26 14:52:16 210

原创 今天是学习嵌入式的第五天

我们经常搭配else一起使用,if负责处理条件成立的情况,else处理条件不成立的情况,这两个分支永远只会运行其中一段,不会同时执行。还有else if,可以用来连续判断多种不同情况,程序会从上到下依次校验条件,只要碰到第一个成立的条件,执行完对应的代码之后,后面所有else if和else都会直接忽略,不会继续判断。如果条件成立,结果不为0,就会执行紧跟着的代码;首先区分等号,双等号==才是用来判断两者是否相等,单等号=是赋值操作,千万别把if(a==5)写成if(a=5),后者会一直判定条件成立。

2026-07-24 17:59:53 145

原创 学习嵌入式的第四天

那么输入时必须手动先输入a=,再输入数字,日常输入直接写scanf("%d",&a);比如两个变量就要写两个%,顺序一一对应,整数不能用%f输出,浮点数尽量不用%d,否则数值错乱。6. scanf不会做数据合法性校验,比如要求输入数字,用户输入字母,变量会得到脏数据,需要自己用if判断输入内容、边长这类条件。2. 输出float、double优先用%f,不要手误写成数字1的%1f,这是高频笔误,小写字母L是%lf,数字1属于书写错误。二者输出都可以用%f,输入规则不一样,这点极易出错。

2026-07-23 17:56:04 210

原创 学习嵌入式的第三天

double > float > 无符号 long > long > 无符号 int > int > char/short。示例:(a + b, b + c, c + d, a + 100, b + 200),整体结果等于 b+200。原理:char 仅 1 字节,赋值 355 会直接截取二进制低位,输出结果为截断后的数值。,拆分千、百、十、个位数字并求和打印。致命坑点:未初始化的变量存储随机脏值,绝对不能直接使用,会引发各类随机 bug。左值:能放在等号左侧,必须是可修改内存,只有变量满足;

2026-07-22 18:11:37 217

原创 学习嵌入式的第二天

友友们好啊,今天开始C语言的了解和基础学习。一、Linux 下 GCC 编译相关命令。

2026-07-21 18:38:59 204

原创 学习嵌入式第一天

3. 批量创建子文件:touch test1/file1.txt test2/file2.txt test3/file3.txt。◦ 相对路径:基于当前目录,位置改变含义改变,例cd ./dirname、cd ../dirname、cd ~/Desktop。配套手册:man手册,分8大类(标准命令、系统调用、库函数、设备、文件格式、娱乐、杂项、管理员命令),用于查询命令用法。◦ 绝对路径:从/根目录开始,任意位置含义不变,例cd /home/linux/Desktop。

2026-07-20 18:12:00 282

空空如也

空空如也

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

TA关注的人

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