自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux系统编程——并发服务器

4.select返回-1表示错误,返回0表示超时时间到没有监听到事件发生,返回正数表示监听到的所有事件数(包括可读,可写,异常),通常在处理事件时 会利用这个返回值来提高效率,避免不必要的事件触发检查。2.设定文件描述符的属主,也就是当文件描述符上可执行IO时会接收到通知信号的进程或进程组,通常为调用进程,通过 fcntl(fd,F_SETOWN,pid);2.要注意计算nfds,当新增文件描述符时比较容易修改,减少时修改麻烦,如果要精确修改需要遍历或采用最大堆等数据结构维护,一般减少时不管nfds。

2026-08-27 20:49:29 451

原创 Linux系统编程——网络(TCP与UDP)

功能:从listen的等待队列中提取第一个连接请求,完成连接,同时创建一个socket表示已经连接好的socket,最后返回这个已经连接好的socket的fd。1.IP地址是网络中主机的唯一标识,它由网络地址和主机号组成,网络地址是子网的唯一标识,类似于区号,主机号是子网内每台主机的编号,定义了如何让格式化的数据以帧为单位进行传输,以及如何让控制对物理介质的访问,这一层通常还提供错误检测和纠正,以确保数据的可靠传输。TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据)

2026-08-25 20:26:31 178

原创 Linux系统编程——进程间通信

注意:有名管道进行通信时,需要进行open操作,如果只有一端以只读或只写的方式打开,此时程序会阻塞在open操作,必须等待另一端以相对的方式打开,阻塞才会解除,此时也表示有名管道文件 读端和写端都打开。不存在 存在 ---写管道,管道破裂 //SIGPIPE --- 信号作用->结束进程。存在 存在 ---读管道,如果管道有数据则读取,如果没有数据则读操作会阻塞。b)有名 --- 在文件系统中有名字,类似于普通文件的名字。

2026-08-20 20:11:52 514

原创 Linux系统编程——线程间通信

功能:用指定的互斥锁开始加锁代码,加锁后的代码到解锁部分的代码属于原子操作,在加锁期间其他进程/线程都不能操作该部分代码,如果该函数在执行的时候,mutex已经被其他部分使用,则代码阻塞。3. 信号量的PV操作 (核心) sem_wait()/ sem_post() //使用之前先申请 有资源就可以用,没资源就阻塞。功能:函数可以将指定的sem信号量资源释放(表示产生的一个对应的资源),默认执行sem = sem + 1,线程在该函数上不会阻塞。有资源:则申请该资源(对应资源数量-1)程序继续执行。

2026-08-19 21:06:10 466

原创 Linux系统编程——线程

如果在main线程中调用pthread_exit(),此时,只是将主线程的执行结束,不是整个进程结束,等所有子线程都执行结束,进程的空间才会销毁。如果要获得该线程的退出状态值,则需要另外的线程通过pthread_join来获取。0 不执行。可分离属性 --- 线程资源的回收,是系统完成,不需要进行pthread_join。1.线程共用的是进程空间,资源共享,如果操作的是同一资源,互相之间会影响。线程:轻量级进程,线程是CPU的基本调度单位,线程侧重于成为一个执行体。

2026-08-18 20:41:47 284

原创 Linux系统编程——多任务编程(进程)

2.fork之后,父子进程拥有独立的4G内存空间(32位系统),父子进程各自拥有自己的数据段,互相不会直接影响。1.exit函数被调用时,才会调用atexit函数,_exit函数调用时,不会调用atexit注册的函数。功能:该函数可以阻塞等待任意子进程退出,并回收该进程的资源和获取退出状态值,一般用在父进程回收子进程状态。如果要执行的文件需要用到环境变量的时候,则可以通过带e的这两个函数传统环境变量给可执行文件。C语言库函数,会执行IO库的清理工作,关闭所有的流 和 所有打开的文件。

2026-08-18 20:05:03 178

原创 Linux系统编程——目录操作

mode 权限 --- mode & ~umask。其中st_mode为32位的权限信息,与下面的参数做&运算可以得到对应权限数据。失败 返回NULL,到达目录结尾也返回NULL。成功 返回包含路径空间的字符串的首地址。@buf 保存工作路径空间的首地址。@pathname 目录文件的名字。@size 保存路径空间的长度。@path 改变到的路径。@path 文件的路径。

2026-08-13 20:32:15 384

原创 Linux系统编程——标准IO缓冲区以及文件IO

mode 模式---对应的是文件的权限,用来指定创建文件的权限,只有有O_CREAT时使用。@offset --- 文件偏移量 //可正,可负(如果参考点在文件开头,则不能为负)O_EXCL --- 需要和O_CREAT同时使用,表示新建的文件不存在,则成功,否则open就失败。注意:创建文件时,文件的权限最终的确定取决于 --- mode&~umask。rw-rw-r-- //八进制表示权限。设置缓冲区为了提高效率 --- 通过减少系统调用的方式来提高效率。

2026-08-12 20:18:14 516

原创 Linux系统编程——基础概念及读写

c : char --- 字符设备文件 eg:ls -l /dav/input/mouse0。(2)借助第三方库来实现 //库 --- 函数库 stdio --- 标准输入输出函数库。失败 --- EOF //-1 到达文件末尾也返回EOF。b : block --- 块设备文件 eg:ls -l /dev/sda。w //只写 --- 如果文件存在则清0,如果不存在则创建。

2026-08-11 21:09:53 140

原创 数据结构——二叉树与哈希表

3.完全二叉树:对n个节点层序从1到n编号,若每个节点的位置与相同深度的满二叉树中编号相同的节点位置一致,则为完全二叉树(除最后一层外,其他层全满,最后一层节点靠左排列)b)其余节点分为m个互不相交的有限集合,每个集合本身也是一棵树,称为根的子树。n > 0,则是由一个根节点和两棵互不相交的子树组成,分别称为左子树和右子树,且两者有严格顺序。2.满二叉树:深度为k且节点数为2^k - 1的二叉树,所有层均被填满,叶子节点全在最后一层。先访问根节点,再递归遍历左子树,最后右子树。

2026-08-10 19:34:23 517

原创 数据结构——栈和队列

4.操作数据的顺序:FILO //first in last out。数据顺序:FIFO //first in first on。顺序栈 --- 以顺序存储结构来实现的栈(数组)为例。入队列尾插,出队列用头删,操作和单向链表操作基本相同。入栈就是头插,出栈就是头删,和单向链表操作相同。栈底 --- 不能进行数据操作。2.特殊:受到限制的线性数据结构。3.栈顶 --- 操作数据的一端。2.入栈(push)

2026-08-07 20:38:47 496

原创 数据结构——双向链表及循环链表

双向链表:结构体中有两个指针,一个指向下一个节点,一个指向上一个节点。头删:每次删除头节点后一个节点。头插:每次从头节点插入数据。尾插:每次从尾节点插入数据。找到返回数据位置的地址。尾删:每次删除尾节点。

2026-08-06 20:46:56 319

原创 数据结构——链表2

思路:定义两个指针,先让一个先走k步,然后两个指针一起走,直到第一个指针遇到空。思路:将链表拆分为空节点和无头链表,通过指针p得到每个节点,往空节点中进行头插。比较当无序区的数据比插入位置的数大时往后比,直到小于插入位置。找位置,要插入时找到插入位置的前一个节点。思路2:快慢指针,快指针一次走两步,慢指针一次走一步。2.找到链表的倒数第k个节点。1.找到链表的中间节点。4.链表的逆序(倒置)2.找到链表倒数第k个节点。:给合适的位置选择合适的数。1.找到链表的中间节点。4.链表的逆序(倒置)

2026-08-05 20:56:22 317

原创 数据结构——概念 及 链表

数据(有哪些数据) --> 数据应该如何组织 --> 选择不同的数据结构,就会有不同的算法。存储结构:顺序、链式、索引 --- 索引表 、散列(哈希) --- 关键词。节点 --- 节点 --- [数据|下一个数据的地址]创建、插入数据、删除数据、修改数据、查找数据、销毁。头节点 --- 数据域随机,指针域指向有效节点。首节点 --- 第一个有效数据节点。尾删 --- 每次都是从尾节点删除。实现:节点 --- [数据|下一个数据的地址]链表的长度 --- 链表中有效数据节点的个数。用完链表销毁整个链表。

2026-08-04 20:55:08 151

原创 C语言基础学习--位运算

(与), |(或), ~(非) , ^(异或), <<(左移), >>(右移)算术右移:a是一个有符号类型就是算术右移 --- 最高位补符号位。逻辑右移:a是一个无符号类型就是逻辑右移 --- 最高位补零。在嵌入式硬件操作中,用来控制一个寄存器中的某一位或某几位。运算规则:相同为0,不同为1。a<<n --- 表示将a这个数左移n位。a>>n --- 将a右移n位。注意:浮点型数据不能做位运算。左移运算相当于每次乘2。

2026-08-03 09:59:54 273

原创 C语言基础学习——结构体

s->name //->指向结构体成员运算符,自左至右,用于结构体类型的指针,结构体类型指针->结构体成员变量名。如果一个变量只有几种可能的值,则可以定义为枚举类型,所谓“枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。注意:有了共用体类型,则定义共用体变量,定义共用体指针变量,定义共用体数组,作为函数的形参,作为函数返回值类型。1.枚举类型的常量值,默认从0开始,也可以自己给值,指定值后,后续的值接着这个值依次变化。4.如果给成员赋值,成员中的值取决于最后赋值的结果。

2026-07-31 20:52:54 344

原创 C语言基础学习——指针

1.指针(类型)也是一种数据类型(地址类型),这种数据类型专门用来处理地址这种数据(具有指向含义的值---指向内存单元)p的数据类型 int*型 //指针类型,表示能处理的是int型所在空间的地址。(3)p中要放的地址,看基类型,基类型决定了p中能存放的是一块存放int型数据的空间的地址。指针是内存单元的编号---地址(是一类特殊的数据---具有指向含义的值)通过p本身 --- 得到地址 --- 找到对应的内存空间。p指向目标 --- 就是基类型的空间地址。p本身 --- 指针类型变量。

2026-07-27 19:55:12 214

原创 C语言基础学习——预处理

include "文件名" //""首先在当前路径下寻找要包含的文件,找不到再到系统的相关路径下寻找。如果想提前取消其作用,可以用 #undef 取消 // #undef 宏名 --- #undef N。用<> //如果包含的是标准头文件 --- 系统提供。用"" //要用自己的头文件 --- 自己指定路径。编译程序 --- 笼统的编译 //实际上划分几个具体的阶段。将程序中预处理命令执行完毕 --- 本质做文本的替换。

2026-07-27 19:35:06 186

原创 C语言基础学习——函数

基本类型:整型、浮点型、字符型 //注意,数组类型不能用做函数返回值类型。注意:如果函数不需要传入数据可以不写形参 //不写形参或者写成void。//函数调用充当参数。eg: int a,int b //注意不能写成int a,b。要带出结果---考虑返回值类型说明符--->带出结果的语句。不带出结果---返回值类型说明符 void(空类型)step2:从 输入----->处理----->输出 这个模型出发。1.函数需要输入什么---需要哪些数据,数据类型。

2026-07-24 20:46:30 232

原创 C语言基础学习——排序

中间的值 < 要找的值:要找的值在中间值后面——吧查找范围往后缩小(begin变化)中间的值 > 要找的值:要找的值在中间值前面——把查找范围往前缩小(end变化)中间位为m=(b+e)/2,开头位为b,结尾位为e。思想:每次从中间找值,把中间的值和要找的值进行比较。通过和已经有的序列比较,找到合适的位置插入。相隔两个元素两两比较,小的在前,大的在后。中间值 = 要找的值:找到了。核心思想:给合适的位置选择合适的数。升序:1 2 3 4 5。降序:5 4 3 2 1。前提:数据必须是排好序的。

2026-07-22 20:53:15 54

原创 C语言基础学习——数组

/判断一个标识符的数据类型---去掉标识符,剩下的就是标识符对应的类型。常量表达式 //数组的长度--数组中变量(数组元素)的个数。eg:int a[]={1,2,3,4} //数组最终长度---初始化值的个数来决定。int [10] //数组类型---表示10个int型的数组。b)单一性 //数组中存放的是同一类型的数据。1、类型说明符:用于说明数组中变量的类型 //int float char。//如果都给可以使用for循环。

2026-07-21 20:33:57 236

原创 C语言基础学习——流程控制2(循环语句)

do-while //先执行再判断,do-while的循环体至少会执行一遍。语句标号用标识符表示,命名规则与变量名相同,由字母,数字,下划线组成,第一个字符必须为字母或下划线,不能用整数来作标号。真:继续执行循环体语句—>再判断表达式 //重复直到表达式为假。真:执行for下面的语句—>求解表达式3—>继续表达式2的判断。真:执行语句—>继续判断表达式—>直到表达式为假—>while语句结束。功能:跳转语句 //跳转到对应语句位置去执行。}while(表达式);

2026-07-20 20:22:58 144

原创 C语言基础学习——流程控制1(选择结构)

语义:求解表达式—>得到结果—>用结果和case后的常量结果做匹配(看是否相等)—>匹配之后—>执行该case下的语句—>遇到break或者switch语句的右}(花括号)—>结束。4.if和else配对关系:else和离他最近的if配对 //一般从最里面的else往外看。3>5 //关系运算表达式,C语言中表示真和假用1(真),0(假)表示。注意:&& 和 || 运算有短路特性 //要求先算最左边的式子。真:执行if下的语句 —> 执行完程序继续往下。

2026-07-20 20:02:07 170

原创 C语言基础学习——输入输出

X //表示将数据转换为 十六进制形式 ,结果中的字母,都转换为大写形式。%X //表示将数据转换为 十六进制形式 ,结果中的字母,都转换为大写形式。%e //表示将数据转换为科学计数法形式的小数(结果默认保留6位小数)%e //表示将数据转换为科学计数法形式的小数(结果默认保留6位小数)%f //表示将数据转换为十进制形式的小数(结果默认保留6位小数)%s //字符串 --- 将数据转换为一串(多个字符)

2026-07-18 19:28:29 251

原创 C语言基础学习——运算符与表达式

有符号短整型--->长整型 //符号位拓展,b = 0x8234,a=0xffff8234(前面全1)3.printf(“%d,%d”,i,i++);i++ //先用(表达式的结果i),后加i。++i //先加i,后用(表达式的结果)printf(“%d,%d”,i,j);eg:a = b = c = 1 //从右向左。a)高精度 ---> 低精度 //精度丢失。无符号短整型--->长整型 //统统补零。

2026-07-17 19:43:31 218

原创 C语言基础学习——数据类型

unsigned int:0|000 0000 0000 0000 0000 0000 0000 0000 (符号位 |数值位)符号位 | 指数位 (11位) | 尾数位(52位) //指数位偏移量+1023。小端模式 //高高低低---高位数据存放在高位,低位数据存放在低位。//初始化 --- 定义变量的同时赋值。大小写转换:‘A’(65) +32 =‘a’(97)ch = ’a‘ //存放的实际是’a'对应的编码值。符号位 | 指数位(8位) | 尾数位(23位)

2026-07-16 20:14:57 245

原创 Linux学习——基础命令与基础编程

mkdir (-r) 目录1/目录2/目录3/... (-r) //创建多级目录,需要使用选项 -r。eg:dir1 dir2 -r //如果源文件为目录,需要有-r选项。3.运行 ---./a.out //gcc编译文件默认名字为a.out,使用-o指定名字。rm dir1 -r //如果删除的为目录,需要加上-r,表示递归删除。ls / //查看/(根目录)下的内容。复制多行 --- Nyy //表示复制光标所在的N行。

2026-07-15 20:18:40 253

空空如也

空空如也

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

TA关注的人

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