- 博客(44)
- 收藏
- 关注
原创 linux重定向
系统打开文件接口参数说明pathname:要打开的文件的路径。flags:打开文件时的操作模式,用于指定文件如何被打开。O_RDONLY:以只读方式打开文件。O_WRONLY:以只写方式打开文件。O_RDWR:以读写方式打开文件。O_CREAT:如果文件不存在,则创建文件。必须同时指定文件权限(mode)。O_TRUNC:如果文件已存在,并且以写方式打开,则文件内容会被截断为零长度(清空文件)。O_APPEND:文件操作会从文件的末尾开始。O_EXCL:如果指定了O_CREAT。
2024-12-05 15:51:14 653
原创 理解SHELL
Shell是一种命令行界面(CLI)工具,提供了用户与操作系统之间的交互方式。通过 Shell,用户可以执行操作系统的命令、运行脚本、管理文件和系统进程。Shell 通常作为操作系统的一个程序运行在终端窗口中。注: shell本身就是一个进程。
2024-11-29 11:13:03 824
原创 linux进程控制
当进程调用exec函数的时,该进程的用户空间代码和数据将完全被新进程取代,从新进程的启动历程开始执行,并不是创建新进程,所以进程id并不会发生改变。当父子进程其中一方想要修改数据时,OS会触发页表的“缺页中断”,从而为其重新申请物理内存并映射到页表中,将只读修改读写,原始的物理页面中的数据复制到新的物理页面中。arg0 通常是程序本身的名称,后续参数是程序的命令行参数。非阻塞方式等待,如果只是为回收子进程其实跟阻塞等待,并没有区别,我们可以让父进程在等待的时候做一些轻量级的任务,做一个dome来看看吧。
2024-11-22 14:43:53 890
原创 进程地址空间
我们来看一段代码int main()return 0;//child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取g_val=100;sleep(1);return 0;fork为什么会同时返回两个值,打印出来的地址是相同的,而当子进程修改数据后,父子打印出来了不同的值?
2024-11-15 17:13:00 719 1
原创 linux进程概念
但是到我们手里的数据会很杂乱,有很多我们并不需要的属性也会掺杂其中,为了解决这个问题,我们就想到能不能把我们所需要的数据属性“描述”一下,比如(学生的姓名,学号,性别等),然辅导员按照我们“描述的模板”进行数据收集,这时候对我们会很方便的进行管理。操作系统(校长)对底层硬件的管理(学生),也是先描述,用struct结构体,通过驱动(辅导员)获取我们所需的数据,最后将这些获得数据以特定的结构组织管理起来,这就使得我们的操作系统很好的管理我们的软硬件资源。可父进程如果一直不读取,那子进程就一直处于Z。
2024-11-08 17:39:39 1096
原创 linux环境变量
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时,需要用extern声明。如果想让我们的命令也可以和系统命令一样,不需要携带路径直接运行,我们也可以将我们的可执行路径配置到我们的环境变量中。我们可以通过echo $PATH 命令来查看其系统配置的路径,而像“PATH”就是我们系统配置的环境变量之一了。发现没有,执行我们的自己写的程序需要指定路径,而执行系统命令却不需要。环境变量具有全局属性,可以被子进程继承下去,还记得我们是如何定义环境变量的吗?
2024-11-01 15:14:06 863
原创 linux工具的使用
在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通常包管理器可以很方便的获取到这个编译好的软件包,直接进行安装,软件包河软件包管理器,就好比"App"和"应用商店"这样的关系.
2024-09-10 14:29:44 1099
原创 SQLite数据库(备份)
除了SQLITE_OK和SQLITE_DONE,调用sqlite3_backup_step()可能会返回SQLITE_READONLY、SQLITE_NOMEM、SQLITE_BUSY、SQLITE_LOCKED或SQLITE_IOERR_XXX扩展错误代码。如果没有sqlite3_backup_step()错误发生,sqlite3_backup_step()是否完成,sqlite3_backup_step()返回的值是SQLITE_OK。如果在调用sqlite3_backup_step()
2024-09-03 16:53:28 1131 5
原创 组播(UDP)
组播(Multicast)是一种允许数据从源地址发送到多个目标地址的通信方式,它介于单播和广播之间。组播数据报并不是基于IP数据报的目的地址,而是通过RTF(Reverse Path Forwarding)逆向路径转发的方式转发数据包,确保数据只发送到需要接受的组播组成员。组播提高了数据传输效率,减少了骨干网络出现拥塞的可能性,特别适用于一对多的通信场景。
2024-08-27 17:43:19 2352 3
原创 C++(模版)
函数模版代表了一个函数家族,该函数模版与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。类模版的实例化与函数模版实例化不同,类模版实例化需要再类模版后面跟<>, 将需要实例化的类型放入<>中。在编译器编译阶段,对于模版函数的,编译器会根据传入的实参类型进行类型推演,生成对应的类型以供调用。函数模版不是函数,是编译器使用方法产生特定具有类型函数的模具。注: 类模版类名不是真正的类, 而实例化后的结果才是类。用不同类型的参数使用函数模版时,成为函数模版的实例化。模版参数调用匹配原则。
2024-08-16 14:52:37 297
原创 c++(内存管理)
malloc/free 和 new/delete 共同点:都是从堆上申请空间,需要用户手动释放不同点:malloc和free是函数,new和delete是操作符malloc申请的空间不会进行初始化,new申请的空间会调用构造函数进行初始化malloc申请空间时需要手动计算其大小,new只需要后面跟类型即可,如果是多个元素,只需[]中指定对象数即可malloc返回的是void* 使用时必须强转,new使用时不需要,因为new后面跟的是空间类型。
2024-08-15 11:01:37 1219 1
原创 类和对象(下)
注:内部类就是外部类的友元类(内部类可以定义在外部类的public, protected, private都是可以的, 内部类可以直接访问外部类的static成员,不需要外部类的对象/类名, 使用sizeof计算外部类时, 和内部类没有任何关系)一个类定义在另一个类的内部, 这个内部类就叫做内部类,内部类是一个独立的类, 它不属于外部类,更不能通过外部类的对象去访问内部类的成员。注:尽量使用初始化列表,因为无论你是否使用初始化列表,对于自定义类型的成员变量,一定会先使用初始化列表初始化。
2024-08-14 10:42:28 1058
原创 类和对象(中)
注:赋值运算符,只能重载为成员函数,不能重载为全局函数(因赋值运算符如果不显示实现,编译器会自动生成一个默认的,此时用户再类外自己实现一个全局的赋值运算符重载,就会和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数)生成s1的时候,使用s拷贝构造,而Stack类并没有显示定义拷贝构造函数,则编译器会给Stack类生成一份默认的拷贝构造函数,默认拷贝构造函数是值拷贝,即将s的内容原封不动的拷贝给s1,因此s和s1指向同一块空间,拷贝构造的调用场景:1.使用已存在对象创建新对象。
2024-08-12 16:52:39 1004
原创 QT(2.0)
QTextEdit表示多行输入框,也是一个富文本&markdown编辑器,并且能在内容超出编辑框范围时自动提供滚动条。核心属性属性说明markdown输入框内持有的内容,支持markdown格式,能够自动的对markdown文本渲染成htmlhtml输入框持有的内容,可以支持大部分html标签,包括img和table等输入框为空时提醒的内容readOnly是否是只读的是否开启undo/redo功能按下ctrl+z触发undo按下ctrl+y触发redo开启自动格式化。
2024-08-07 18:00:15 1094 2
原创 Linux【文件权限的理解】
常见的Shell命令包括文件和目录操作命令(如ls、cp、mv、rm等)、系统管理命令(如ps、top、kill等)、文本处理命令(如grep、awk、sed等)、以及其他一些用于网络、用户管理、进程控制等方面的命令。这些人和实体不仅贡献代码,还提供支持、教育和培训,构建了一个强大的生态系统,推动了 Linux 的普及和发展。总体而言,操作系统在计算机科学中扮演着极为重要的角色,它不仅仅是一个连接硬件和软件的桥梁,更是整个计算机系统的管理者和协调者,为用户和应用程序提供了一个安全、高效、友好的工作环境。
2024-07-15 11:21:32 999
原创 QT(超详细从0开始)
/生成一个button,指定它的父元素this,也就是Widgetbutton->setText("按钮");delete ui;//定义槽函数widget.hQ_OBJECTpublic:~Widget();//槽函数声明,在QT5以上版本可不写slots,但为区分还是可以将其写上private:我们将上面的代码进行修改,让它每次点击发送一个信号,通过关联这个信号去打印一段文字。
2024-06-17 13:45:49 3842 2
原创 类和对象(上)
移动构造函数是C++11新增的一种构造函数,它接受一个右值引用作为参数,并且将其内部状态移动到新创建的对象中。: 拷贝构造函数是用于复制一个对象的构造函数,它接受一个同类型的对象作为参数,并且会创建一个新的对象,该对象的成员变量与参数对象相同。构造函数可以用来初始化对象的成员变量,确保对象在创建时拥有合适的状态。: 默认构造函数是没有参数的构造函数,如果没有定义任何构造函数,则编译器会自动生成一个默认构造函数。: 带参数的构造函数是可以接受参数的构造函数,可以通过它来初始化对象的成员变量。
2024-06-04 16:52:06 920
原创 C++(入门基础版本)
C++ 是一种通用的、面向对象的编程语言,是 C 语言的一个超集,也就是说,任何有效的 C 程序都是有效的 C++ 程序。C++ 通过添加诸如类和对象、继承和多态等概念,扩展了 C 语言的功能,使其更适用于大型软件项目和复杂系统的开发。以下是 C++ 的一些重要特性和概念:1.面向对象编程(OOP):C++ 是一种面向对象的编程语言,支持类和对象的概念。通过封装、继承和多态,可以实现更清晰、模块化的代码结构,并提高代码的可重用性和可维护性。
2024-05-30 17:13:48 2018
原创 makefile 编写规则
Makefile 是一种文本文件,用于描述软件项目的构建规则和依赖关系,通常用于自动化软件构建过程。它包含了一系列规则和指令,告诉构建系统如何编译和链接源代码文件以生成最终的可执行文件、库文件或者其他目标文件。
2024-05-24 17:31:31 1442 1
原创 普通二叉树
二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。每个节点包含一个值,并且可能有一个指向其左子节点和右子节点的指针(引用)。二叉树具有以下特性:1.根节点(Root): 树的顶部节点,没有父节点。2.节点(Node): 树中的每个元素。3.父节点(Parent): 一个节点的直接上级节点。4.子节点(Child): 一个节点的直接下级节点,分为左子节点和右子节点。5.叶节点(Leaf): 没有子节点的节点称为叶节点或叶子。
2024-05-21 16:08:56 952 1
原创 应用层协议【HTTP和HTTPS】
也可以是基于软件的,譬如维基百科用到的就是Nginx。那采用HTTPS后,到底会多用多少服务器资源,2010年1月Gmail切换到完全使用HTTPS, 前端处理SSL机器的CPU负荷增加不超过1%,每个连接的内存消耗少于20KB,网络流量增加少于2%,由于Gmail应该是使用N台服务器分布式处理,所以CPU负荷的数据并不具有太多的参考意义,每个连接内存消耗和网络流量数据有参考意义,这篇文章中还列出了单核每秒大概处理1500次握手(针对1024-bit 的 RSA),这个数据很有参考意义。
2024-05-16 11:09:31 1316 5
原创 树形数据结构---堆
我们能够看得出来这是一个大堆,这颗像树一样的图是它的逻辑结构,而底下的数组是它的物理结构,也就是说,我们真正操作的是数组。堆的特点是每个节点都满足堆的性质,即父节点的键值总是大于或等于(小于或等于)任何一个子节点的键值。堆分为最大堆和最小堆两种类型,其中最大堆的根节点键值是所有节点中最大的,最小堆的根节点键值是所有节点中最小的。堆在计算机科学中有着广泛的应用场景,其中最常见的应用之一是优先队列。5. **堆在操作系统中的应用**:堆内存管理是操作系统中的一个重要部分,用于动态分配内存给进程。
2024-05-09 18:22:20 1117
原创 二叉树的(前,中,后序)遍历
7. **二叉搜索树(Binary Search Tree)**:二叉搜索树是一种特殊的二叉树,其中每个节点的值大于其左子树中的所有节点的值,且小于其右子树中的所有节点的值。9. **完全二叉树(Complete Binary Tree)**:对于深度为d的二叉树,除了第d层之外,其他层的节点都必须是满的,并且第d层的节点从左到右填入,称为完全二叉树。这些子节点分别称为左子节点和右子节点。叶子节点的高度为0。1. **根节点(Root)**:二叉树的顶端节点称为根节点,它没有父节点,是树的起始点。
2024-04-22 10:29:56 1448 1
原创 【游戏专区】贪吃蛇
Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤ 的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启 视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application), 所以便 称之为 Application Programming Interface,简称 API 函数。7. **分数计算**:游戏通常会记录玩家的得分,得分的计算方式可以是蛇吃到食物的数量,也可以是蛇移动的步数等。
2024-04-19 14:35:13 1032 1
原创 【游戏专区】飞机大战
想想我们飞机需要哪些结构,坐标,血量还有什么呢//创建飞机结构int x;//飞机坐标int y;bool isDie;//是否健在int width;//宽度int height;//长度int frame;//当前帧int hp;//血量int type;//敌机类型}Plane;有了飞机的结构以及初始化,我们是不是还需要将其加载进入飞机图片。
2024-04-17 17:34:10 1093 4
原创 C语言【编译和链接】
在包含头文件的时候,我们有很大的可能会对同一个头文件,进行多次包含,在预编译的时候将你所包含的头文件全部替换成文本,给代码的编译,链接等增加不必要的负担。至于这些符号具体在项目中有没有用,很有用,你完全可以用它们去找到你的程序具体在哪个代码,哪一行出现了问题,并且很多大型项目中,都会用它写一个名叫日志系统的模块。链接:链接器将目标文件与其他必要的库文件进行链接,生成最终的可执行程序。注意:宏只是将内容替换,很可能因为你在定义宏的时候没有明确给出括号,而导致运行的结果和你期待的结果完全不同。
2024-04-05 15:54:31 495 4
原创 【文件操作API的使用】
在很多编程语言中,文件操作符被用于打开、关闭、读取和写入文件,以及对文件进行其他操作。读取文件时,文件操作符会根据指定的位置读取特定数量的数据,并将数据传递给程序进行处理。:使用文件操作符可以打开一个文件,使得程序能够访问文件的内容。:除了读取文件外,文件操作符也可以用于向文件中写入数据。:在文件使用完毕后,应该及时关闭文件,释放文件相关的资源。而在Python等高级语言中,文件操作符则可能是通过内置的文件对象来实现的。在不同的编程语言和操作系统中,文件操作符的具体实现方式可能会有所不同。
2024-04-02 16:49:23 622 4
原创 cJSON(API的详细使用教程)
JSON 对象是一个无序的键值对集合,键值对之间使用冒号 `:` 分隔,不同键值对之间使用逗号 `,` 分隔,整个对象使用花括号 `{}` 包围。- 每个键值对由一个键(key)和一个值(value)组成,中间使用冒号 `:` 分隔,不同键值对之间使用逗号 `,` 分隔。- JSON 字符串是以双引号 `"` 包围的文本序列,可以包含任意字符,包括转义字符(如 `\n` 表示换行)。- JSON 数组是一个有序的值的集合,值之间使用逗号 `,` 分隔,整个数组使用方括号 `[]` 包围。
2024-04-01 13:28:27 3055 3
原创 C语言(结构体,联合体,枚举的讲解)
灵活性:宏定义可以定义更复杂的常量,如带参数的宏、条件编译等,具有更大的灵活性。无类型约束:宏定义不受类型限制,可以用于定义任何类型的常量,包括字符串、表达式等。
2024-03-25 13:59:45 1146 2
原创 深入了解C语言中浮点数的存储方式
总的来说,浮点数和整数在内存中存储的区别主要在于数据类型、存储方式、精度和范围上的不同。- 浮点数的范围和精度受到单精度(float)和双精度(double)表示的限制,一般可以表示较大或较小的数值,但是精度会随着数值大小的增加而减少。根据IEEE 754标准,浮点数的存储方式使得计算机能够以近似的方式表示和处理实数,但也因此带来了一些浮点数精度上的限制和问题,比如舍入误差和表示范围。- 浮点数采用IEEE 754标准定义的格式进行存储,包括符号位、指数位和尾数位,以实现对小数的表示和计算。
2024-03-21 17:44:40 689 1
原创 C语言(字符串函数的模拟实现)
1.strlen1.1 用法我们模拟实现第一步是不是应该先了解它的用法呢strlen是 C 语言标准库中的一个函数,用于计算字符串的长度(即字符个数)。它的原型定义在头文件string.h中。下面是strlen其中,str是需要计算长度的字符串,返回值是size_t类型,表示字符串的长度。strlen函数会从字符串的开头开始遍历,直到遇到字符串结束符\0才停止,并返回遍历过程中统计的字符个数(不包括结束符)。1.2 模拟实现然我们来验证一下呗。
2024-03-18 17:31:20 961 1
原创 [高并发网络通信架构]实现tcp的高并发服务端
I/O多路复用(IO Multiplexing)是一种并发编程技术,用于同时监视多个I/O事件并选择就绪的事件进行处理。它可以通过一个线程或进程同时处理多个I/O操作,而不需要为每个I/O操作创建一个独立的线程或进程。I/O多路复用可以提高系统的并发性能,减少资源的消耗。在传统的编程模型中,每个I/O操作通常都需要一个独立的线程或进程来处理。这种方式在面对大量的并发连接时,会导致系统资源的浪费和性能下降。
2024-03-15 16:46:50 3048 1
原创 嵌入式sqlite3库API的使用
还记得我们上期讲了什么吗,没错,我们上期讲到了sqlite的使用,通过对比sqlite3和MySQL进一步了解了sqlite的使用场景,然后我们也讲了如何通过在linux终端执行命令行的方式去操作数据库增,删,改,查。我想大家应该对其有了一定的了解,今天我们来了解如何通过代码的方式去实现它的,增,删,改,查。我们通过这个函数,以及上一期我们讲到的在linux终端执行的SQL命令行就已经可以实现其增,删,改,查了。首先,我们想去操作数据库,就必须去打开它,才能进行下一步操作,当我们结束之后,是不是应该。
2024-03-13 15:53:20 422
原创 嵌入式sqlite3库的使用
1. **性能受限:** 对于大规模数据或高并发环境(高并发是指系统在同一时间内接收并处理大量的并发请求,对于数据库而言,高并发意味着大量的并发读写操作),SQLite 的性能可能不如其他专业的数据库系统。当然这些我们都可以不用特意的记,用到的时候可以搜索。说人话呢,就是你将数据存入数据库,就像你的钱存入银行,会更加的安全,高效,能够快速查询余额,也能够存储更久的时间。*到这里,我们通过命令操控终端去增,删,改,查数据库已经完成了,那我们怎么通过代码的方式去实现呢,话说贪多嚼不烂,我们下期再见。
2024-03-13 11:05:29 1121
原创 C语言“巨简单”——指针
那么再想一下,你的好朋友住在这栋楼里面,你要去找他玩,你能通过什么去确认他的房间,然后找到他呢,没错,就是房间号。例如,如果你有一个指向数组开头的指针,你可以使用指针加上一个偏移量来访问数组中的元素,这个偏移量将会与指针的大小相乘。这么说吧,数组能做的事情,我指针基本都能做,数组不能做的事情,我指针依旧可以做,这就是我。没想到吧,指针也是可以进行算术运算的,不过最好是指向同一块空间的指针,不然它们的加减没有意义。我们在学习C语言的时候,是不是觉得指针这章节“巨简单”,一听就会,一写就废。
2024-03-07 15:17:19 473 1
原创 【游戏专区】扫雷
这时候,我们运行程序,你就会发现有一道黑影一闪而过,那是因为我们计算机处理数据特别快,我们肉眼很难捕捉,所以我们要阻塞一下,让其停止,等待我们下一步操作。我们了解了扫雷的规则,那我们要怎么写它呢,首先,我们看到它的很多格子,能想到我们所学C语言的什么,没错啦,就是二维数组。我们现在基本什么都有了,但是这样还不行,因为我们现在是明文,玩家可以看到我们的雷,所以就没什么可玩性,为了我们游戏的可玩性,我们有两套方案。我们玩过扫雷的都知道,当我们点击空白也就是0的时候,我们就展开一片,我们应该怎么做呢,让我们。
2024-01-31 16:24:29 1330
原创 欢迎走进C语言-(通讯录小项目)
很多细心地小伙伴已经发现了,我们在打开文件和增加成员的函数中都调用了增容函数会不会有冲突,导致多次增容呢,其实,仔细想一想我们在程序执行的时候只调用一次初始化函数,在获取数据的时候会不会出现数据大于我们申请的空间,我们是不是需要申请空间用于加载我们的数据,以免数据丢失。我们有了增加成员的函数,为了验证我们写的函数是否有问题,我们可以写一个显示成员函数,将我们存入的数据打印出来,来判断我们写的是否正确。那如果有一天我们存入的人员惹我们不高兴了,我们想跟他们同归于尽或者销毁他们,我们能做到吗,
2024-01-30 10:11:30 964 1
原创 “巧妙的”栈和队列(2)
熟悉我们套路的小伙伴应该都清楚,接下来就是我们出数据了,还记得我们的函数声明吗,我们设计了,队头出数据和队尾出数据,但我们队尾出数据只能出队尾本身数据,而无法出队尾的上一个数据。那可能有人就会有疑问了,为什么让他们指向NULL,而不是malloc一个新节点,让他们指向新节点呢,这也是可以的,至于怎么做,那就交给你们喽,让我们接下实现队列的入数据。那是不是很好的发挥出了我们链表的优势呢,那我们一起来写一个吧,老规矩,先写结构体呗。好啦,那我们来实现它,给我们今天的学习画上句号吧。今天我们要实现的接口,如下。
2024-01-25 14:31:21 440 1
原创 “巧妙的”栈和队列(1)
栈的最后一个元素称为栈顶元素,栈顶元素可以通过栈顶指针来访问和修改栈的插入和删除操作通常在栈顶进行,因此插入和删除操作的效率比较高。在写之前,我们应该先了解用我们所学到的顺序表和链表那个实现好,按照栈的先进后出的特性,很明显顺序表比较更容易满足其要求,大家都应该知道链表尾删,是需要先找尾并记住它的前一个,这不利于我们出数据。哈哈,开个玩笑,我们要去学习栈和队列,我们是不是也应该去了解它的概念,那什么是栈,又什么是队列呢,那么接下来,就让我们一起看看。接下来我们要实现,插入,删除,取栈顶数据的接口。
2024-01-25 10:54:48 450 1
原创 “复杂的”双向带头循环链表
在这里很多小伙伴应该都想明白了,我们写的是带头双向循环链表,那这个头怎么来的,难道创建结构体附赠的吗,显然不是。这种链表的特点是链表的头结点和尾结点都是同一个节点,并且头结点只存储一个指针,指向链表的第一个节点,而链表的最后一个节点的指针指向头结点。哈哈,有没有问题,我们有了头插,尾插,头删,尾删。很多朋友可能想到了,我们既然有了任意位置的插入和删除,那我们能不能把尾插和头插,尾删和头删利用任意位置的插入,删除搞定呢。感觉好复杂啊,应该很不容易实现吧,其实,它是只纸老虎,善于伪装。
2024-01-23 14:21:44 538 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人