自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【网络编程】

大方向一共四个功能:注册登录查询单词查询历史记录单词和解释保存在文件中,单词和解释只占一行,一行最多300个字节,单词和解释之间至少有一个空格也可以先写个程序,将文件中的内容先都插入到数据库中。实现TCP并发 --多进程 多线程 io多路复用 均可建表语句:–在sqlite3终端执行即可。

2023-03-16 17:45:00 125

原创 【网络编程】

如果不打开数据库文件,直接通过sqlite3的终端操作,所有的操作都是在内存上操作,并没有把数据落到硬盘上,所以当数据库程序退出时,数据就没了。在终端输入 sqlite3 ,直接回车,如果能看到下面的sqlite3的命令行,就说明已经装好了。sqlite3数据库的系统命令是以 . 开头的 结尾不能加分号。注意:数据库文件名随便起,一般都以 .db 结尾。例子都在下面使用数据库实现学生管理系统的例子中。不同的数据库软件 一般系统命令都是不一样的,只要是关系型数据库,SQL语句都是通用的。

2023-03-15 16:30:00 347

原创 【网络编程】

前面介绍的数据包发送方式只有一个接受方,称为单播如果同时发给局域网中的所有主机,称为广播如果同时发给局域网中的部分主机,称为组播注意:同一个套接字只能发单播、广播、组播中的一种如果项目中三种通信方式都需要用到,可以创建多个套接字来处理。

2023-03-14 22:00:00 279

原创 【网络编程】

以读操作为例,如果缓冲区有内容,则正常读走执行如果没有内容,则一直阻塞,直到有内容了再读走执行以读操作为例,如果缓冲区有内容,则正常读走执行如果没有内容,则立即返回一个错误介于阻塞和非阻塞之间以读操作为例,如果缓冲区有内容,则正常读走执行如果没有内容,且还在设定的超时时间内,则阻塞等待如果设定的超时时间到了,还没有内容,则立即转变为非阻塞。

2023-03-14 12:15:00 351

原创 【网络编程】

最常用、最简单、效率最低可防止进程阻塞在I/O操作上,需要轮询允许同时对多个I/O进行控制一种异步通信模型。使用多线程、多进程、IO多路复用、poll函数实现TCP并发服务器

2023-03-13 17:45:00 188

原创 【网络编程】

1.客户端一般不需要绑定自己的网络信息结构体因为操作系统会自动给客户端的ip地址和端口号赋值,也方便用户操作。如果想要手动指定,也可以,需要调用bind()函数即可。2.服务器端accept函数的后两个参数即使设置成NULL,服务器也可以给客户端回复消息,原因是,服务器侧不是依赖于手动给定的IP地址和端口号来联系客户端的,而是给每个客户端都分配一个独立的文件描述符 acceptfd,来专门用于和该客户端通信,也就是说TCP的服务器,acceptfd和客户端是一一对应的关系。

2023-03-13 12:00:00 280

原创 【网络编程】

c/s 模型 客户端服务器模型b/s 模型 浏览器服务器模型。TCP服务器端和客户端代码,TCP的粘包问题,TCP练习,控制机械臂

2023-03-13 08:00:00 214

原创 【网络编程】

如果多台主机在通信的过程中,字节序不一样,那么就有可出现,接收到的数据和实际发送的数据不一致的情况,所以保证数据在网络中的一致性,就发明了网络字节序,网络字节序是大端序。也就是说,发送方在发送数据之前,需要将数据转换成网络字节序再发送接收到接到数据,默认也认为是网络字节序的数据,需要转换成主机字节序再做处理。每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。MAC地址是网卡的物理地址,理论上讲应该是全球唯一的,但是现在有很多虚拟化的技术,已经不保证全球唯一了,但是同一局域网中一定唯一。

2023-03-12 20:30:00 168

原创 【IO进程线程】

假如A进程和B进程想要通信,按照之间讲解的进程的原理是无法完成的,A和B进程的内存空间是独立的0-3G。如果想要实现通信就必须借助内核空间才能完成,因为内核空间是共用的。在linux系统中进程间通信的方式有7种。​ 1.无名管道​ 2.有名管道​ 3.信号​ 1.消息队列​ 2.共享内存​ 3.信号灯集​ 1.套接字通信(通过网络实现进程间通信)​ 1.binder机制。

2023-03-12 14:45:53 66

原创 【IO进程线程】

IPC进程间通信:(1)消息队列(2)共享内存(3)信号灯集。

2023-03-12 14:44:27 58

原创 【IO进程线程】

线程(LWP):线程就是轻量级的进程,相当于是比进程更小的粒度的执行程序的单位。线程是共享进程的资源的,在一个进程内可以创建多个线程。这些线程共享进程的资源。进程是分配资源的最小的单位,而线程是调度的最小的单位。进程的安全性比线程的高,因为进程间空间相互独立,线程是共用同一个进程的资源,其中一个线程导致进程崩溃,那么这个进程内所有的线程都将终止执行。多线程程序执行的效率是比多进程的效率是要高的。(线程本身不占用资源,共享进程资源)。线程的函数是由第三方库提供的。

2023-03-09 20:45:00 102

原创 【IO进程线程】

守护进程:守护进程是后台运行的进程,脱离了终端,信息向日志文件中输出。可以随着系统的启动而启动,可以随着系统的终止而终止。

2023-03-09 13:15:00 101

原创 【IO进程线程】

进程:程序的一次执行过程就是一个进程,进程是一个正在执行的任务。进程是分配资源的最小单位。只要一个进程在系统上执行它就分配自己的0-3G的用户空间。在系统中所有需要运行的进程会被放到系统的运行队列上随着时间片轮询依次执行,对用户来说所有的进程看起来都是在并行执行的。用户的0-3G的空间是虚拟内存,程序可以使用任意内存空间,但是在一个正在执行的程序中不一定全部使用完。这些虚拟内存其实对应的是物理内存空间,程序在使用%p打印地址的时候看到的是虚拟地址,但是变量在物理内存上存储着。

2023-03-09 08:45:00 53

原创 【IO进程线程】

fd是一个大于等于0的整数,这个整数就代表打开的文件。在使用open打开文件的时候成功就返回fd。以后在操作这个文件的时候就通过fd完成。在一个正在运行的程序中默认已经有三个文件描述符了0,1,2。如果在一个正在运行的程序中打开文件文件描述符的最小值是3。在一个程序中打开文件的个数默认1024( ulimit -a),文件描述符的范围[0-1023]。但是在一个程序中可以修改打开文件的个数(ulimit -n 2048)

2023-03-08 21:45:00 35

原创 【IO进程线程】

全缓存:和文件相关的缓冲区就是全缓冲行缓存:和终端相关的缓冲区就是行缓存无缓存:标准出错(stderr)是没有缓冲区的。

2023-03-08 17:45:00 59

原创 【IO进程线程】

标准IO:库函数文件IO:系统调用系统调用:就是linux内核给用户提供的进入内核的接口,只要调用对应的函数就会从用户空间进入到内核空间。系统调用效率比较低(没有缓冲区),系统调用的移植性差。但不是说系统调用不重要,它有自己独特的使用场景,例如读取鼠标上报的键值就不需要缓冲区。库函数:库函数=缓冲区+系统调用。库函数的效率比较高,库函数的移植性比较强。FILE是应用层的一个结构体,这个结构体是调用fopen的时候产生的,FILE是用来记录fopen打开时候的各种信息的结构体(只读,光标,缓冲区)。

2023-03-08 12:45:00 69

原创 【数据结构】

设初始时,图中各顶点均未被访问,从图中某顶点(设为V0)出发,访问V0,然后搜索V0的一个邻接点Vi,若Vi未被访问,则访问之,再搜索Vi的一个邻接点(深度优先)……设 Vi、Vj为图中的两个顶点,若关系****存在方向性,即:< Vi,Vj>≠,则称相应的图为有向图。R是顶点之间的关系集,P(Vi,Vj)为顶点Vi与Vj之间是否存在路径的判定条件,即若Vi与Vj之间的路径存在,则关系< Vi,Vj >∈R。关系用(Vi,Vj)或(Vj,Vi)表示,

2023-03-08 09:00:00 72

原创 【数据结构】

递归:在函数内部调用自己,递归函数的设计主要就是要考虑清空结束条件eg:求n!的递归实现

2023-03-07 20:00:00 353

原创 【数据结构】

原理:以第一个数作为轴线,先保存这个值到tmp中,从右向左比较,如果后者小就将当前的数赋值到第一个位置,如果遇到赋值就变换方向,从左向右比较,如果左侧值大于轴线值就赋值,并在此改变比较方向。第一轮比较完之后把tmp赋值到中间的位置,第一轮比较的结果为轴线左边的全部小于轴线值,轴线右边的全部大于轴线值。ASL与n有关是因为记录在存储器中的存放是随机的,或者说记录的key与记录的存放地址无关,因而查找只能建立在key的“比较”基础上。链表虽然没有成员个数的限制,但是查找的时候挨个比较效率比较低。

2023-03-07 16:00:16 75

原创 【数据结构】

队列:是先进先出的数据结构体(FIFO),队列有队头和队尾的概念。队尾是入队的位置,队头是出队的位置。

2023-03-07 15:59:20 236

原创 【数据结构】

2023-02-26 22:45:00 46

原创 【数据结构】

双向链表

2023-02-26 11:45:00 59

原创 【数据结构】

单链表最后一个节点的next指针指向的NULL,但是单向循环链表的next指针指向了头节点,这样它就形成了一个环状的效果。通过这个环可以一直获取next的成员,而不用每次都记录h节点的位置。

2023-02-26 08:00:00 44

原创 【数据结构】

线性表的链式存储就是所谓的单链表//这个指针指向的是下一个节点,节点是结构体类型,所以指针也要定义成结构体指针 } linklist_t;int//这个指针指向的是下一个节点,节点是结构体类型,所以指针也要定义成结构体指针 } linklist_t;

2023-02-25 20:30:00 62

原创 【数据结构】

线性表的顺序存储就叫做顺序表。

2023-02-25 18:00:00 62

原创 【数据结构】

数据:描述信息的载体,数据能够被计算机识别并存储,能够参与计算机内部的运算。结构:描述的是数据与数据之间的关系,数据和数据之间存在逻辑关系:线性关系(链表),层次关系(树),网状关系(图)。​线性结构:头节点只有后继节点,尾节点只能有前驱节点,其它的节点都是有一个前驱节点和一个后继节点的。层次结构:根节点没有前驱节点,其它的节点一定会有一个前驱节点,后继节点可以有0、1、多个网状结构:节点可以有多个前驱节点也可以有多个后继节点。数据结构指的是数据元素及数据元素之间的相互关系,或组织数据的形式。

2023-02-25 12:15:00 142

原创 【shell编程】

1 . 格式: function 函数名() {函数体 } 2 . 注意事项 1 > shell中定义的函数一般使用function进行修饰,但是也可以把function省略,一般再shell中定义函数时不省略function关键字。2 > 再shell中定义的函数也要遵循先定义后似乎用的原则。3 > shell中的函数再小括号中不需要写形参列表,函数是否具有参数最终由书写函数时决定。4 > shell中的函数,函数名之前不需要写任何内容,表示函数是否具有返回值,

2023-02-25 09:45:00 65

原创 【shell编程】

1 . test是一个shell命令,可以使用man test查看test命令的帮助手册。2 . test命令也可以用于字符串的判断和比较,整数的判断,文件类型的判断,test命令将此和if语句配合使用。test命令也可以写成 "[]" , 中括号最终表示的就是test命令。

2023-02-23 20:00:00 179

原创 【shell编程】

shell翻译成中文:贝壳shell是用来对linux系统起到保护的作用,通过输入命令,shell解析器解析输入的命令,根据命令的功能最终实现硬件的控制,并将结果回显到终端之上。shell脚本文件shell脚本文件的名字一般以.sh结尾.在shell脚本文件中本质上就是很多liunx命令的集合,并不是简单的将命令在shell脚本文件中罗列,会有一定的代码的逻辑。当执行脚本文件时,脚本文件中的命令会按照逻辑依次执行,并完成一个特定的功能。格式:变量名 = 初始值。

2023-02-23 08:00:00 139

原创 【C语言】

Makefile是一个文件,能体现出我们是否具备大型项目开发的能力。Makefile文件里面存储的是项目的编译规则,它会根据文件的时间戳来推导本次编译的时候某些源文件是否需要重写编译。make是一个可执行程序,在 /usr/bin 下存放。是专门用来make是解析Makefile文件的可执行程序。如果系统中没有make 就是用指令安装一下即可。

2023-02-22 17:30:00 47

原创 【C语言】

写法 1 : struct Stu {int age;char sex;//如果是指针操作 必须先明确指针的指向 struct Stu * p1 =(struct Stu *) malloc(sizeof(struct Stu));写法 2 : struct Stu {int age;char sex;写法 3 : struct Stu {int age;char sex;} s1;写法 4 : struct Stu {int age;

2023-02-22 09:30:00 46

原创 【C语言】

格式 1 : struct 结构体类型名 结构体变量名;格式 2 : struct 结构体类型名 {数据类型 1 成员 1;数据类型 2 成员 2;. . . 数据类型n 成员n;} 变量 1 , 变量 2;格式 3 : struct {数据类型 1 成员 1;数据类型 2 成员 2;. . . 数据类型n 成员n;} 变量 1 , 变量 2;typedef struct 结构体类型名 {数据类型 1 成员 1;数据类型 2 成员 2;. . . 数据类型n 成员n;

2023-02-21 10:00:00 50

原创 【C语言】

1.宏定义是在预处理阶段完成替换的,而typedef是类型的重定义,在编译阶段检查;linux系统中,signal函数中就是使用了回调函数来实现的。3.typedef是给类型起别名,而宏定义只是一个简单的替换;本质是一个数组,数组中的每个元素都是一个函数指针。本质是一个指针,指向一个函数指针数组。typedef 是用来给类型起别名的。本质是一个函数,返回值是一个指针类型。把变量名去掉,剩下的就都是类型名了。原来的变量名 就变成了新的类型名。本质是一个指针,指向一个函数。3.由参数传递过来的地址。

2023-02-21 09:00:00 20

原创 【C语言】

enum 枚举类型名 {成员 1 , 成员 2 , 成员 3 = 100 , 成员 4 , 成员n };//枚举类型名 也是一个标识符 需要符合标识符的命名规范1. enum 枚举类型名 枚举变量名;2. 在定义枚举类型的同时 定义枚举变量 enum Color {3. 省略枚举类型名的方式定义枚举变量 -- 这种方式就没法再定义其他的变量了 enum {enum {//--这种方式就没法再定义其他的变量了 boy , girl } sex;c1 = green;c2 = blue;

2023-02-21 06:30:00 51

原创 【C语言】

返回值类型 函数名(函数的参数列表) {//函数体 -- 也就是实现功能的代码块 }

2023-02-20 21:30:00 61

原创 【C语言】

二级指针是用来保存一级指针的地址的。二级指针多用于函数传参,将一级指针的地址作为参数传递时。**q *p a //操作的都是 黄色的空间。*q p //操作的都是 蓝色的空间。数组指针一般多用于函数传参,二维数组作为参数传递时。本质是一个指针,指向一个二维数组,也叫作行指针。本质是一个数组,数组中每个元素都是一个指针类型。2.使用指针实现 strcpy 函数的功能。上面的代码执行完之后,有如下的等价关系。q //操作的是 粉色的空间。

2023-02-20 17:00:00 57

原创 【C语言】

CPU和操作系统不同,对多字节数据存储的方式也不同。小端存储:地址低位存储数据低位,地址高位存储数据高位大端存储:地址低位存储数据高位,地址高位存储数据低位有一个以空格分隔的字符串 "this is a book"要求以单词为单位进行翻转"book a is this"

2023-02-20 14:00:00 91

原创 【C语言】

然后第2个元素和第3个元素进行比较,将较大的放在第3个位置上…依此类推,直到第一趟排序结束,最大的元素就在整组数据的最后一个位置上了。然后第2个元素和第3个元素进行比较,将较大的放在第3个位置上…初始化的数据随便指定,找出数组中最大的元素,及最大元素所在的行号、列号,并输出。第1元素和第2个元素进行比较,将较大的值放在第2个位置上,第1元素和第2个元素进行比较,将较大的值放在第2个位置上,数组中的每个数据叫做数组的元素,或者叫做数组的成员。头文件:#include

2023-02-19 22:03:45 85

原创 【C语言】

C语言的程序结构一共有三种:顺序结构、分支结构(选择结构)、循环结构。

2023-02-19 20:43:10 180

原创 【C语言】

【代码】【C语言】

2023-02-18 15:34:01 27

空空如也

空空如也

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

TA关注的人

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