- 博客(43)
- 收藏
- 关注
原创 数据结构 栈 队列
数据的插入--->入栈 数据的删除----->出栈。函数的调用关系(保护现场,恢复现场操作,遵循先进后出,后进先出)缓存数据:主要使用队列,类似于缓冲区,防止数据丢失。允许从一端插入数据,另一端删除数据的线性存储结构。只允许从一端进行数据的插入和删除的线性存储结构。增栈 减栈:用栈顶的增长方向区分(移动方向)顺序队列:假溢出------>循环队列。满栈 空栈:栈顶所在位置是否存有元素。增栈:从内存低地址向高地址移动。减栈:从内存高地址向低地址移动。链式队列:用链表方式构造队列。
2024-09-06 19:52:51
793
原创 数据结构 内核链表
通过宏来获取结构体的首地址:offsetof,contianer_of。结构体第一个成员的地址即为结构体的首地址。内核链表:有头的双向循环链表。指针函数:返回值为指针的函数。将节点存入要存储的数据中。函数指针:指向函数的指针。
2024-09-05 18:06:59
465
原创 数据结构 数据结构
空间不连续 访问数据不方便(需要遍历) 插入和删除比较方便 不需要预分配,动态增长。空间连续 访问数据方便 插入和删除需要移动大量数据 需要预分配存储空间。数据的物理结构:数据的逻辑结构在计算机内存中的存储方式。线性结构:一对一的元素关系(数组,链表。图形结构:元素之间的多对多的关系(网状结构)数据的逻辑结构:数据元素与元素之间的关系。树型结构:一对多的元素关系(二叉树)链式存储:一段非连续的空间。程序:数据结构 + 算法。顺序存储:一段连续的空间。数据与数据之间的关系。
2024-09-03 17:41:42
573
原创 sqlite3 数据插入效率
结束commit:sqlite3_exec();3.执行准备:事先将sql语句编好,提高执行速度。开启begin:sqlite3_exec();
2024-08-30 20:49:20
1415
原创 sqlite3 数据库
条件查找:select * from 表名 where 列表头 + 关系运算符 + “某一个值”;模糊查找:select * from 表名 where 列表头 + like + “值的部分”;select * from 表名 order by 列表头 asc(升序)/desc(降序);update 表名 set 列名 = “新值” where 列 = “某值”;delete from 表名 where 表头 = “某值”;查询表:select * from + 表名;.tables 查看数据库中的表。
2024-08-29 17:56:03
1349
原创 IO多路复用实现并发
1.创建文件描述符集合:epoll_create(int size)成功返回句柄,失败返回-1。select 只能工作在水平触发模式(低速模式),无法工作在边缘触发模式(高速模式)select 监听的文件描述符在用户层,需要在应用层和内核层互相传递数据。4.根据返回的结果做对应的操作(对io进行读或者写操作)2.添加fd到对应集合:int epoll_ctl();参数4:exceptfds 其他 : 一般null。参数1:int nfds :fds最大值 + 1。参数3:writefds 写事件。
2024-08-28 18:02:46
789
原创 系统编程 网络 cjson解析
解析JSON数据的过程,其实就是剥离一个一个链表节点(键值对)的过程。③ 根据键值对的名称从链表中取出对应的值,返回该键值对(链表节点)的地址。解析JSON数据的过程,其实就是剥离一个一个链表节点(键值对)的过程。根据键值对的名称从链表中取出对应的值,返回该键值对(链表节点)的地址。/* 依次根据名称提取JSON数据(键值对) *//* 解析嵌套json数据 *//* 解析整段JSO数据 *//* 解析布尔型数据 *//* 解析数组 */
2024-08-26 19:14:02
2087
原创 系统编程 网络 http协议
--------------------------------------表示了资源所在的路径。意思:域名解析=>把对应的域名解析为对应的ip。<协议>://<主机>:<端口>/<路径>万维网:http解决万维网之间互联互通。http:应用层协议,底层是tcp协议。http协议------应用层的协议。1.如何在万维网中表示一个资源?http协议加密:tls,ssl。计算机web端网络只能看到文字。<http>只是协议的一种。html 超文本标记语言。http 超文本传输协议。
2024-08-24 17:04:30
1916
原创 系统编程 网络 协议问题总结
解决:1.规定一些数据与数据之间的间隔符,eg:"\aa","\r\n"原因:tcp流逝套接字,数据与数据之间没有边界,导致多次的数据粘在一起。recv和send函数中的int flag参数意思是指接收的方式。写数据,与函数write();3.自己将数据打包(利用结构体)读数据,与函数read();2.可以指定要发送的数据长度。函数:recv();函数:send();
2024-08-23 18:13:56
602
原创 系统编程 网络 基于tcp协议
等待完成accept();操作,与客户端连接建立完成。绑定作用(在客户端可选可不选)参数1:sockfd,参数2:数据队列的长度。用于接收listen函数所监听的数据。客户端:函数connect();用于监听客户端发送过来的信号数据。connect();函数listen();函数accept();客户端与服务器之间的。
2024-08-22 18:00:20
349
原创 系统编程 day14 进程6
参数1:要处理的信号的编号(不能被忽略阻塞处理的信号:sigstop,sigkill)信号-----软中断------软件层面上------实现一个类似中断的过程。无名管道:可以用于有亲缘关系的进程间,在fork()之前创建好管道。管道文件(fifo),都不支持·定位操作(lseek,fseek)参数2:mode_t mode,创建权限:0666。参数1:pid,给某进程发信号此进程的pid。参数2:要对这个信号做怎么样的处理。功能:信号处理函数的注册函数。参数2:sig,要发送的信号。
2024-08-17 17:28:48
342
原创 系统编程 day13 进程5
参数:pipefd,用来获取管道的两端// 读端:pipefd[0] 写端: pipefd[1] 读端和写端都是固定的。参数1:&sem 参数2:0,表示线程间的信号量 参数3:定义了几个类资源。p操作逻辑:尝试获取资源,有资源可用,直接使用,资源减1,如果没有,继续等待。写端存在,读管道:可以读管道,但是管道中如果没有数据,此时读操作阻塞。写端不存在,读管道:可以读管道,如果管道中没数据,此时读操作,不阻塞。p操作:使用这个资源,表示资源个数减1。
2024-08-16 18:10:59
872
原创 系统编程 day12 进程(线程)4
--------------------------------------------------------------------------------------------------------------------------------总结:锁就是一种线程间都同步机制。定义:pthread_mutex_t(互斥锁类型) mutex(互斥锁变量,内核对象)定义互斥锁-----初始化锁-----加锁-----解锁-----销毁。解锁:pthread_mutex_unlock();
2024-08-15 20:52:43
482
原创 系统编程 day11 进程(线程)3
2.非阻塞:父进程会去查看子进程状态发生改变,但是如果没有发生改变,父进程不阻塞,继续往下执行。参数3:options:可以不阻塞------不阻塞传宏WNOHANG,不传是默认为阻塞。参数2:attr:线程属性,一般是NULL,表示默认属性(可结合性+分离属性)参数3:start_routine-------线程执行函数(线程回调函数)参数2:retval------用来保存退出状态值所在空间的地址。2.回收资源------会让僵尸态的子进程销毁。参数1:thread------线程tid。
2024-08-14 18:10:36
783
原创 系统编程 day10 进程2
3 _exit() 系统调用 不会刷新缓冲区,让进程立即结束。2.父进程创建出子进程之后,子进程做的与父进程完全不同。p,表示寻找可执行文件,是通过PATH环境变量之中寻找。能够改变子进程的执行效果的函数是exec函数族。1.任务-----子进程与父进程干的活差不多。多个atexit(),打印顺序跟注册顺序相反。shell程序-----bash-----以上为进程运行的过程中,典型的两种应用场景。e,表示给要执行的程序,传递一个环境变量。函数wait(),回收子进程的资源。atexit()退出清理函数。
2024-08-13 17:59:35
434
原创 系统编程 day9 进程1
多道程序:为了描述和管理程序运行的动态过程,操作系统为了管理程序的动态运行过程。功能:创建一个子进程 child process,通过复制调用进程的子进程。killall命令,可以指定进程名称,这种方式发信号不需要写pid号。程序的一次执行的过程,进程是由程序运行而来,是跑起来的程序。返回值:成功:在父进程中返回子进程pid号,在子进程中返0。进程:进行中的程序---正在运行的程序。父子进程间,数据相互独立,不受影响。程序---静态---存储在硬盘。进程---动态---存储在内存。
2024-08-12 18:23:40
501
原创 系统编程 day8 文件7
函数fseek();函数readdir(),只读目录内容,返回值为info*,info指针指向目录中的每一个文件包括目录。函数fileno()与函数fdopen(),前者将FILE *型转为int,后者反之。函数lseek(),是对fseek,ftell,remind,三个函数的封装。函数fgetc(),fgets(),都是只读函数,前者单字符读,后者每行读。函数fputc(),fputs(),都是只写函数,前者单字符写,后者每行读。函数ftell();函数closedir(),关闭函数,传参dir。
2024-08-11 19:21:00
507
原创 系统编程 day7 文件6
今天还是对昨天的文件操作命令程序minishell进行优化:代码展示:部分命令操作实现展示:ll命令:ls命令:cat命令:跳出minishell程序 quit命令:
2024-08-10 15:02:23
276
原创 系统编程 day6 文件5
今天编写小程序实现minishell(简易版文件操作命令函数编写以及实现)终端实现minishell部分功能展示。编写过程,以及部分代码展示。
2024-08-09 19:34:46
658
原创 系统编程 day5 文件4
函数ctime(const time_t *timep),返回值为获得时间字符串首地址,char*软链接 函数 symlink(传参:被链接,新链接);命令行:ln -s +链接目标(绝对路径) +链接位置(快捷方式)(绝对路径)改文件大小 函数 truncate(文件,要改的大小(可扩充,可缩小剪裁))重命名 函数 rename(aaa,bbb),将aaa重命名为bbb。函数time(time_t *tloc),返回值为time_t;命令行:ln 链接文件 被链接文件。link(链接文件,被链接文件)
2024-08-08 17:56:51
532
原创 系统编程 文件
传参 const char *path 文件名 返回值为int,0代表成功,-1代表失败。函数stat(const char *path,strust stat *buf)获得当前工作路径,传参buf,与sizeof(buf),返回值为char *注意type,目录里是文件还是目录,返回值为info*,意思为目录中的某项。函数fdopen(int fd,const char*mode)获得文件属性,返回值为int,为0则完成,为-1则失败。获得一个目录流指针,返回值为Dir* = dir。
2024-08-07 17:42:29
673
原创 系统编程 文件
作用是将内存中高速读写的数据存起来,存够一定量,输入到硬盘(为了匹配高速设备和低速设备)函数lseek(),封装了标准io的(fseek,remind,ftell)ftell(),求偏移过程中所偏移的字节,可求文件大小。Remind(),将读写指针复位到开始。低速设备(例如硬件),读写速度特别慢。函数:fseek(),文件偏移。前提:高速设备读写速度特别快。行缓冲:数据显示到屏幕上。全缓冲:主要用于读写文件。在c库封装下的系统调用中。返回值为实际读写的字节数。无缓冲:错误信息的输出。
2024-08-06 17:50:02
464
原创 系统编程 文件
linux操作系统当中心的IO都是对文件的操作,头文件都在/user/include下。需了解fgetc,fputc,fgets,fputs等函数的用法。读写一行字符串(fgets,fputs),重要使用,要牢记。读写单个字符(fgetc,fputc)bzero函数,清空,但只能清0。w:只写不读,在写之前会清空。标准的IO,stdio.h。stat函数,查看图片大小。stderr,标准错误输出。以计算机为中心的输入输出。memset函数,清空。stdout,标准输出。stdin,标准输入。
2024-08-05 19:06:20
341
原创 系统编程 day1 shell脚本
1.代表作者2.代表组用户3.代表其他人 r代表可读,w代表可写,x代表有执行权限。3.写好脚本给.sh一个执行权限x(chmod + x(777)xx.sh)ls ----> bash(linux)---->kernel(内核)shell脚本是将自己所需要执行的命令统一写入一个文件中,之后统一执行。通过env可查看操作系统底下所有的环境变量(类似于c中的全局变量)shell脚本中的echo 类似于c中的printf 可打印。“``”反单引号,将中间的字符串按照命令打印。注意进去要顶格写#!
2024-08-04 18:08:02
328
原创 共用体,位运算符和位运算
按位与‘&’,的作用为指定位清零,位运算要求操作数为整型或与整型相兼容的数据类型。按位异或‘^’,如果比特位相同,置0,如果不相同则置1,作用为指定位翻转。算数右移,signed型,左面补1或者补0,取决于与被移变量的符号。共用体中的成员会共同占用相同的内存空间,为了节省空间。左移位运算符‘<<’,判断某个bit位是0,或者是1。逻辑右移,unsigned型,左面全都补0。共用体的变量可以通过函数参数传递(指针)取反位运算符‘~’,作用为按位取反。按位或‘|’,作用为指定位置1。共用体(共用体内存空间)
2024-08-02 19:19:25
593
原创 结构体与链表
节点之间不像数组元素之间连续,所以不能节点地址+1操作进行下一个节点的寻找,应该通过指针域。链表由大量的节点构成,节点分为两个部分:值域和指针域,节点内存空间都来自于堆区。当链表为空链表时(无节点),需将pHead置为NULL。任意由程序员定义出的新类型,由已有数据类型组合构造。链表中的首节点来自于栈区,它不属于链表中的有效节点。用指针处理链表(为了储存大量相同类型的东西)'.'是结构体成员运算符,通过其给成员赋值。链表不管加节点还是减节点,算法复杂度都是1。结构体是一个声明,不是一个定义。
2024-08-01 18:26:10
497
原创 指针plus
当我们定义一个指向指针的指针,指针的指针指向指针的地址。int *p[10]是指针数组(其中装了10个野指针),sizeof(p)= 80。形参为数组首元素地址,元素个数,一个元素的字节数,函数指针(任意两个元素相比较)例:int a[10] = {1,2,3,4,5,6,7,8,9,0}函数的第一条指令就是函数的入口地址,函数的函数名即为函数的入口地址。定义的函数指针的类型必须与函数相同(形参个数和类型与返回值类型)对a取地址&a,是指指向长度为10的一维数组的指针。指向函数的指针(降低程序的耦合性)
2024-07-31 19:36:40
489
原创 字符型指针
当函数返回值为指针的时候,返回值为一个地址,它不可以返回局部变量的地址,不能返回生存期为动态生存期的地址。函数:malloc,原型:void *malloc(size t,size)可申请需要的内存空间,字节量。申请的size大小一定是连续的,如果申请成功,会返回首字节地址,如果申请失败,会返回一个NULL指针。修饰变量的时候,无法通过直接访问对其修饰的变量进行更改,可以通过指针进行间接修改。地址不可以求和,指针可以进行减法运算,不可以进行加法运算。指针可以进行比较,存放的为地址,地址是有顺序的。
2024-07-30 20:55:06
481
原创 指针---
对指针进行加法运算(+n),最后的值与原本的基类型有关,新地址指向变量末地址后偏移的n * sizeof(基类型)(在数组里很有作用)利用指针可以在被调函数中间接访问主调函数中的变量,从而修改主调函数中的变量。一般形式:基类型 * 指针变量名 这里的*指的是类型说明符。NULL空指针,将指针置为空指针,表示当前指针不可被访问。指针是用来装地址的数据类型,指针变量指向某变量(地址)*p 这里的*指的是指针运算符,间接访问某对应的变量。这里为了前后类型相等,用了强制修改类型(类型 *)
2024-07-29 17:53:36
437
原创 标识符的作用域与可见性 预处理命令
局部作用域:在花括号里的就是局部作用域,所定义的东西只能在自己所处的局部作用域生效(称为局部变量)(栈区)全局作用域:不在任何花括号里的就是全局作用域《所定义的变量称为全局变量(全局区),能够代替函数实现参数传递。3.在两个或两个具有包含关系的不同作用域中定义的同名标识符,外层标识符在内层不可见(就近原则)不带参宏定义:一般形式:#define 标识符(全局作用域,通常全部大写字母)字符串。条件编译:#if 0(表达式,非0即为真)#endif,之间的代码均为有效可编译代码。
2024-07-28 19:22:41
387
原创 数组作为函数参数
sizeof函数读取的是数据类型,如果定义数组s[]或者s[][],输出sizeof(s)只有8个字节,因为这里的s代表数组名又代表首元素地址,所以在一维数组中传参,需要手动传递数组长度len。二维int,char型数组需要传递rows长度,不需要传递cols,需要把列数写死,例如int s[][4],数组传参是指针传参,可以被传递过去,可以在被调函数中修改主调函数。例:strlen,strcpy,strcat,strcmp。c语言中函数传参,参数如果是一个数组时,只传了数组的地址。
2024-07-26 19:41:54
630
1
原创 函数的调用
assert函数意义为中止,形参为输入逻辑或关系运算符,如果为假,则中止程序;无条件直接调用本身函数,会导致栈区空间被用尽,导致系统崩溃。函数允许嵌套使用,先调用函数需先返回,后调用函数需后返回。函数的形参相当于实参的复制品,两个不同的内存空间。栈(栈区):专门用来保存函数中的形参和变量。函数的嵌套调用(本质上是函数的跳转)c语言中默认的函数传参都是自右向左。入栈:先进后出,出栈:后进先出。恢复函数:函数回到原来的位置。即函数直接或间接调用自己本身。保护现场:保护调用的函数。
2024-07-25 19:00:35
451
原创 二维数组 函数
但是要注意strlen,strcpy,strcat,strcmp等函数的使用。(函数名就是为函数所赋的名字,符合标识符命名规则,不能与库函数同名)在二维数组里行数可以被省略,例:a[3][4] => a[][4]类型说明符 数组名[常量表达式][常量表达式];即&a = &a[0] = &a[0][0]所有的函数都是平行的,不能函数中定义函数。第一个[]中代表行,第二个[]中代表列。从函数角度出发分为:无参函数,有参函数。提高代码的复用性,提高代码的耦合性。二维数组a的首元素为a[0]
2024-07-24 19:19:42
618
原创 字符数组啊啊啊啊
函数char*strcpy(char*dest(目标数组) conster char*src(源数组));函数 strlen (const char*s)用来查看字符串的有效字符个数。输出字符串函数:int puts (const char*s)比较字符数组大小,不能使用关系运算符,只能使用strcmp();输入字符串函数:char* gets (char*s)同上,strlen(s),打印具体数值用%lu。Int strcmp (数组1,数组2)同上,strcat(目标数组,源数组)
2024-07-23 18:26:01
399
原创 一维数组啊啊啊啊啊啊
在定义数组时的[]不是下标运算符,是类型说明符,为了说明n为数组。类型说明符可以是已有的数据类型(唯独不能是void)可以通过sizeof(a)/sizeof(a[0])地址为一个地址值常量不能作为左值不能对数组整体赋值。数组在内存中存放的单一性:每个元素占字节数均等。数组在内存中存放的连续性:紧密排列,没有间隔。相邻两个元素两两比较,小的放前,大的放后。数组的数组名代表数组的首元素的地址。访问数组之外被称为数组的越界访问。在数组合适的位置上放上合适的数。数组在内存中存放的有序性。[]是下标,下标运算符。
2024-07-22 20:55:10
582
原创 循环控制 循环语句
循环控制goto语句以及goto语句构成循环Goto语句是无条件转向语句(给一行代码命名代码名符合标识符用法)Goto + 被命名代码 直接跳转循环语句三要素设置循环变量初始化设置循环的循环条件设置循环趋于结束的语句用while语句实现循环格式:while(表达式)(逻辑或关系表达式)语句(循环体)While()格式后面不能加分号‘;’While和循环体之间不能+空行,加空行也不能写任何代码do....while语句do 循环体语句while(表达式);
2024-07-20 23:30:20
260
原创 选择结构程序设计
当从一段关系表达式的开头就可以立即判断出为0或1,则后面将不再计算。else if不能独立出现,同样else if()后不能加分号;在c语言中不能写出连续比较形式的关系表达式 例:i <-4<j。先出真,再出假,则例表达式意思为若a > b,则为真a为max。两边必须同为真,则输出真,反之任一假,则输出假。6级关系运算符:< <= > >=2.If(表达式)1 else 语句 2。else if(表达式2)语句2。case 常量表达式2: 语句2。7级关系运算符:==!
2024-07-19 19:24:08
362
原创 顺序程序设计
函数原型为int printf (const char*format...) const char*表示形参format的数据类型。函数原型为int(返回值类型) putchar(函数名) (int c)(形参)%o 表示八进制 %x或X表示十六进制 %u 表示无符号。后面的变量要加取地址运算符&,例scanf(“%d”,&i);%s表示 const char*字符串常量后双引号中的字符串。%d表示占位符,表示printf中的下一个参数。%G或g,表示Ff或Ee表示,遵循谁短用谁。
2024-07-18 19:20:25
187
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人