- 博客(51)
- 收藏
- 关注
原创 进程通信(命管道)
是系统或应用程序在运行过程中生成的记录文件,用于追踪事件、状态变化、错误信息等。通过分析日志,可以监控系统行为、排查故障、审计安全事件等。
2025-03-24 11:09:01
893
原创 进程间通信(匿名管道)
匿名管道(无名管道)特点:仅用于具有亲缘关系的进程(如父子进程),数据单向流动(半双工),基于内存实现。实现方式:通过pipe()系统调用创建,返回两个文件描述符(读端和写端)命名管道(FIFO)特点:允许无关进程通信,通过文件系统中的路劲名标识,支持阻塞和非阻塞模式。实现方式:使用mkfifo()创建,通过open()和文件读写操作进行通信。注:匿名管道的默认大小通常为64 KB,这意味着它可以缓存最多 64 KB 的数据。如果超过此大小,写入操作会被阻塞,直到管道中的数据被读取并释放空间场景行为。
2025-03-20 13:38:48
690
原创 STL(vector的使用与基础实现)
1.vector是可变大小数组的序列容器(顺序结构)。2.vector采用连续空间来存储元素,这就意味着可以像数组一样用下标访问,但vector可动态改变,它的大小也可被容器自动分配。3.空间不足,插入新元素时,会重新申请空间,将数据拷贝到新空间,释放旧空间。就时间而言。这是一个相对代价较高的任务,因为每当一个新的元素加入容器中,都会有一定几率触发扩容。4.vector分配空间策略:vector会分配一些额外的空间以适应可能得增长,因为存储空间比实际需要的存储更大。
2025-03-14 11:10:56
788
原创 了解string
(4).string类是basic_string模版类的一个实例, 它使用char来实例化basic_string模版类, 并用char_traits和allocator作为basic_taring的默认参数。(5). 注意:这个类独立于左右的编码来处理字节,如果用来处理多字节或变长字符(如UTF-8)的序列, 这个类的做优成员(如长度或大小)以及她的迭代器, 将任然按照字节(而不是实际编码的字符)来操作。(2)在Oj题或者平常工作使用中,String的出现会让对字符串的操作更加检点,方便和快捷。
2025-02-21 17:21:26
657
原创 linux - 软硬链接
Unix/Linux 系统中一种特殊的文件类型,类似于 Windows 中的快捷方式。它是指向另一个文件或目录的引用,允许你在文件系统中创建一个指向目标文件或目录的路径。ls -li 查看软连接指向路径指向路径:软连接保存的是目标文件或目录的路径,而不是直接保存文件内容。它实际上是一个包含目标路径的文本文件。可跨文件系统:软连接可以跨文件系统创建,因为它保存的是目标文件的路径(可以是相对路径或绝对路径)。不同于硬链接,硬链接只能在同一文件系统内创建。符号链接指向。
2024-12-18 17:09:55
1373
2
原创 linux - 存储管理
LBA(Logical Block Addressing,逻辑块寻址)是一种硬盘存储设备的数据寻址方式,它将硬盘的数据视为一个逻辑上的连续块,而不是依赖于物理位置(如柱面、磁道和扇区)。在LBA方式下,硬盘上的每个数据块都有一个唯一的逻辑地址(LBA),这一地址用于标识存储数据的物理位置。LBA 使用单一的逻辑块编号来表示硬盘上的每个数据块,消除了柱面、磁头、扇区之间的物理结构映射,使得硬盘可以支持更大的存储容量。硬盘通常每个盘片都有两个磁头(一个用于盘片的上面,另一个用于盘片的下面),这些磁头通过。
2024-12-13 17:24:55
1266
原创 解析缓冲区
缓冲区(Buffer)实际上是一段临时存储数据的内存区域,用于在不同设备或系统组件之间传输数据时,平衡数据处理速度的不匹配。它通常用于临时存储数据,以便更有效地进行数据读取或写入操作。简单来说,就是临时存储数据的一块内存。那么这块内存,是由谁来维护的呢?两种情况,1.操作系统级别的缓冲区,一般是由操作系统本身来维护,在特定情况下,硬件和应用程序也会参与缓冲区的分配与维护。2.用户级缓冲区,主要是由应用程序和其依赖的库来完成,操作系统提供底层的内存管理支持。
2024-12-09 14:33:47
1038
原创 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
962
3
原创 理解SHELL
Shell是一种命令行界面(CLI)工具,提供了用户与操作系统之间的交互方式。通过 Shell,用户可以执行操作系统的命令、运行脚本、管理文件和系统进程。Shell 通常作为操作系统的一个程序运行在终端窗口中。注: shell本身就是一个进程。
2024-11-29 11:13:03
897
原创 linux进程控制
当进程调用exec函数的时,该进程的用户空间代码和数据将完全被新进程取代,从新进程的启动历程开始执行,并不是创建新进程,所以进程id并不会发生改变。当父子进程其中一方想要修改数据时,OS会触发页表的“缺页中断”,从而为其重新申请物理内存并映射到页表中,将只读修改读写,原始的物理页面中的数据复制到新的物理页面中。arg0 通常是程序本身的名称,后续参数是程序的命令行参数。非阻塞方式等待,如果只是为回收子进程其实跟阻塞等待,并没有区别,我们可以让父进程在等待的时候做一些轻量级的任务,做一个dome来看看吧。
2024-11-22 14:43:53
928
原创 进程地址空间
我们来看一段代码int main()return 0;//child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取g_val=100;sleep(1);return 0;fork为什么会同时返回两个值,打印出来的地址是相同的,而当子进程修改数据后,父子打印出来了不同的值?
2024-11-15 17:13:00
754
1
原创 linux进程概念
但是到我们手里的数据会很杂乱,有很多我们并不需要的属性也会掺杂其中,为了解决这个问题,我们就想到能不能把我们所需要的数据属性“描述”一下,比如(学生的姓名,学号,性别等),然辅导员按照我们“描述的模板”进行数据收集,这时候对我们会很方便的进行管理。操作系统(校长)对底层硬件的管理(学生),也是先描述,用struct结构体,通过驱动(辅导员)获取我们所需的数据,最后将这些获得数据以特定的结构组织管理起来,这就使得我们的操作系统很好的管理我们的软硬件资源。可父进程如果一直不读取,那子进程就一直处于Z。
2024-11-08 17:39:39
1124
1
原创 linux环境变量
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时,需要用extern声明。如果想让我们的命令也可以和系统命令一样,不需要携带路径直接运行,我们也可以将我们的可执行路径配置到我们的环境变量中。我们可以通过echo $PATH 命令来查看其系统配置的路径,而像“PATH”就是我们系统配置的环境变量之一了。发现没有,执行我们的自己写的程序需要指定路径,而执行系统命令却不需要。环境变量具有全局属性,可以被子进程继承下去,还记得我们是如何定义环境变量的吗?
2024-11-01 15:14:06
940
1
原创 linux工具的使用
在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通常包管理器可以很方便的获取到这个编译好的软件包,直接进行安装,软件包河软件包管理器,就好比"App"和"应用商店"这样的关系.
2024-09-10 14:29:44
1123
原创 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
1507
5
原创 组播(UDP)
组播(Multicast)是一种允许数据从源地址发送到多个目标地址的通信方式,它介于单播和广播之间。组播数据报并不是基于IP数据报的目的地址,而是通过RTF(Reverse Path Forwarding)逆向路径转发的方式转发数据包,确保数据只发送到需要接受的组播组成员。组播提高了数据传输效率,减少了骨干网络出现拥塞的可能性,特别适用于一对多的通信场景。
2024-08-27 17:43:19
3492
4
原创 C++(模版)
函数模版代表了一个函数家族,该函数模版与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。类模版的实例化与函数模版实例化不同,类模版实例化需要再类模版后面跟<>, 将需要实例化的类型放入<>中。在编译器编译阶段,对于模版函数的,编译器会根据传入的实参类型进行类型推演,生成对应的类型以供调用。函数模版不是函数,是编译器使用方法产生特定具有类型函数的模具。注: 类模版类名不是真正的类, 而实例化后的结果才是类。用不同类型的参数使用函数模版时,成为函数模版的实例化。模版参数调用匹配原则。
2024-08-16 14:52:37
307
1
原创 c++(内存管理)
malloc/free 和 new/delete 共同点:都是从堆上申请空间,需要用户手动释放不同点:malloc和free是函数,new和delete是操作符malloc申请的空间不会进行初始化,new申请的空间会调用构造函数进行初始化malloc申请空间时需要手动计算其大小,new只需要后面跟类型即可,如果是多个元素,只需[]中指定对象数即可malloc返回的是void* 使用时必须强转,new使用时不需要,因为new后面跟的是空间类型。
2024-08-15 11:01:37
1297
1
原创 类和对象(下)
注:内部类就是外部类的友元类(内部类可以定义在外部类的public, protected, private都是可以的, 内部类可以直接访问外部类的static成员,不需要外部类的对象/类名, 使用sizeof计算外部类时, 和内部类没有任何关系)一个类定义在另一个类的内部, 这个内部类就叫做内部类,内部类是一个独立的类, 它不属于外部类,更不能通过外部类的对象去访问内部类的成员。注:尽量使用初始化列表,因为无论你是否使用初始化列表,对于自定义类型的成员变量,一定会先使用初始化列表初始化。
2024-08-14 10:42:28
1072
原创 类和对象(中)
注:赋值运算符,只能重载为成员函数,不能重载为全局函数(因赋值运算符如果不显示实现,编译器会自动生成一个默认的,此时用户再类外自己实现一个全局的赋值运算符重载,就会和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数)生成s1的时候,使用s拷贝构造,而Stack类并没有显示定义拷贝构造函数,则编译器会给Stack类生成一份默认的拷贝构造函数,默认拷贝构造函数是值拷贝,即将s的内容原封不动的拷贝给s1,因此s和s1指向同一块空间,拷贝构造的调用场景:1.使用已存在对象创建新对象。
2024-08-12 16:52:39
1028
原创 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
1135
3
原创 Linux【文件权限的理解】
常见的Shell命令包括文件和目录操作命令(如ls、cp、mv、rm等)、系统管理命令(如ps、top、kill等)、文本处理命令(如grep、awk、sed等)、以及其他一些用于网络、用户管理、进程控制等方面的命令。这些人和实体不仅贡献代码,还提供支持、教育和培训,构建了一个强大的生态系统,推动了 Linux 的普及和发展。总体而言,操作系统在计算机科学中扮演着极为重要的角色,它不仅仅是一个连接硬件和软件的桥梁,更是整个计算机系统的管理者和协调者,为用户和应用程序提供了一个安全、高效、友好的工作环境。
2024-07-15 11:21:32
1024
原创 QT(超详细从0开始)
/生成一个button,指定它的父元素this,也就是Widgetbutton->setText("按钮");delete ui;//定义槽函数widget.hQ_OBJECTpublic:~Widget();//槽函数声明,在QT5以上版本可不写slots,但为区分还是可以将其写上private:我们将上面的代码进行修改,让它每次点击发送一个信号,通过关联这个信号去打印一段文字。
2024-06-17 13:45:49
4649
2
原创 类和对象(上)
移动构造函数是C++11新增的一种构造函数,它接受一个右值引用作为参数,并且将其内部状态移动到新创建的对象中。: 拷贝构造函数是用于复制一个对象的构造函数,它接受一个同类型的对象作为参数,并且会创建一个新的对象,该对象的成员变量与参数对象相同。构造函数可以用来初始化对象的成员变量,确保对象在创建时拥有合适的状态。: 默认构造函数是没有参数的构造函数,如果没有定义任何构造函数,则编译器会自动生成一个默认构造函数。: 带参数的构造函数是可以接受参数的构造函数,可以通过它来初始化对象的成员变量。
2024-06-04 16:52:06
933
原创 C++(入门基础版本)
C++ 是一种通用的、面向对象的编程语言,是 C 语言的一个超集,也就是说,任何有效的 C 程序都是有效的 C++ 程序。C++ 通过添加诸如类和对象、继承和多态等概念,扩展了 C 语言的功能,使其更适用于大型软件项目和复杂系统的开发。以下是 C++ 的一些重要特性和概念:1.面向对象编程(OOP):C++ 是一种面向对象的编程语言,支持类和对象的概念。通过封装、继承和多态,可以实现更清晰、模块化的代码结构,并提高代码的可重用性和可维护性。
2024-05-30 17:13:48
2164
原创 makefile 编写规则
Makefile 是一种文本文件,用于描述软件项目的构建规则和依赖关系,通常用于自动化软件构建过程。它包含了一系列规则和指令,告诉构建系统如何编译和链接源代码文件以生成最终的可执行文件、库文件或者其他目标文件。
2024-05-24 17:31:31
1545
1
原创 普通二叉树
二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。每个节点包含一个值,并且可能有一个指向其左子节点和右子节点的指针(引用)。二叉树具有以下特性:1.根节点(Root): 树的顶部节点,没有父节点。2.节点(Node): 树中的每个元素。3.父节点(Parent): 一个节点的直接上级节点。4.子节点(Child): 一个节点的直接下级节点,分为左子节点和右子节点。5.叶节点(Leaf): 没有子节点的节点称为叶节点或叶子。
2024-05-21 16:08:56
976
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
1372
5
原创 树形数据结构---堆
我们能够看得出来这是一个大堆,这颗像树一样的图是它的逻辑结构,而底下的数组是它的物理结构,也就是说,我们真正操作的是数组。堆的特点是每个节点都满足堆的性质,即父节点的键值总是大于或等于(小于或等于)任何一个子节点的键值。堆分为最大堆和最小堆两种类型,其中最大堆的根节点键值是所有节点中最大的,最小堆的根节点键值是所有节点中最小的。堆在计算机科学中有着广泛的应用场景,其中最常见的应用之一是优先队列。5. **堆在操作系统中的应用**:堆内存管理是操作系统中的一个重要部分,用于动态分配内存给进程。
2024-05-09 18:22:20
1165
原创 二叉树的(前,中,后序)遍历
7. **二叉搜索树(Binary Search Tree)**:二叉搜索树是一种特殊的二叉树,其中每个节点的值大于其左子树中的所有节点的值,且小于其右子树中的所有节点的值。9. **完全二叉树(Complete Binary Tree)**:对于深度为d的二叉树,除了第d层之外,其他层的节点都必须是满的,并且第d层的节点从左到右填入,称为完全二叉树。这些子节点分别称为左子节点和右子节点。叶子节点的高度为0。1. **根节点(Root)**:二叉树的顶端节点称为根节点,它没有父节点,是树的起始点。
2024-04-22 10:29:56
1489
1
原创 【游戏专区】贪吃蛇
Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤ 的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启 视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application), 所以便 称之为 Application Programming Interface,简称 API 函数。7. **分数计算**:游戏通常会记录玩家的得分,得分的计算方式可以是蛇吃到食物的数量,也可以是蛇移动的步数等。
2024-04-19 14:35:13
1140
1
原创 【游戏专区】飞机大战
想想我们飞机需要哪些结构,坐标,血量还有什么呢//创建飞机结构int x;//飞机坐标int y;bool isDie;//是否健在int width;//宽度int height;//长度int frame;//当前帧int hp;//血量int type;//敌机类型}Plane;有了飞机的结构以及初始化,我们是不是还需要将其加载进入飞机图片。
2024-04-17 17:34:10
1119
4
原创 C语言【编译和链接】
在包含头文件的时候,我们有很大的可能会对同一个头文件,进行多次包含,在预编译的时候将你所包含的头文件全部替换成文本,给代码的编译,链接等增加不必要的负担。至于这些符号具体在项目中有没有用,很有用,你完全可以用它们去找到你的程序具体在哪个代码,哪一行出现了问题,并且很多大型项目中,都会用它写一个名叫日志系统的模块。链接:链接器将目标文件与其他必要的库文件进行链接,生成最终的可执行程序。注意:宏只是将内容替换,很可能因为你在定义宏的时候没有明确给出括号,而导致运行的结果和你期待的结果完全不同。
2024-04-05 15:54:31
519
4
原创 【文件操作API的使用】
在很多编程语言中,文件操作符被用于打开、关闭、读取和写入文件,以及对文件进行其他操作。读取文件时,文件操作符会根据指定的位置读取特定数量的数据,并将数据传递给程序进行处理。:使用文件操作符可以打开一个文件,使得程序能够访问文件的内容。:除了读取文件外,文件操作符也可以用于向文件中写入数据。:在文件使用完毕后,应该及时关闭文件,释放文件相关的资源。而在Python等高级语言中,文件操作符则可能是通过内置的文件对象来实现的。在不同的编程语言和操作系统中,文件操作符的具体实现方式可能会有所不同。
2024-04-02 16:49:23
685
4
原创 cJSON(API的详细使用教程)
JSON 对象是一个无序的键值对集合,键值对之间使用冒号 `:` 分隔,不同键值对之间使用逗号 `,` 分隔,整个对象使用花括号 `{}` 包围。- 每个键值对由一个键(key)和一个值(value)组成,中间使用冒号 `:` 分隔,不同键值对之间使用逗号 `,` 分隔。- JSON 字符串是以双引号 `"` 包围的文本序列,可以包含任意字符,包括转义字符(如 `\n` 表示换行)。- JSON 数组是一个有序的值的集合,值之间使用逗号 `,` 分隔,整个数组使用方括号 `[]` 包围。
2024-04-01 13:28:27
3378
4
原创 C语言(结构体,联合体,枚举的讲解)
灵活性:宏定义可以定义更复杂的常量,如带参数的宏、条件编译等,具有更大的灵活性。无类型约束:宏定义不受类型限制,可以用于定义任何类型的常量,包括字符串、表达式等。
2024-03-25 13:59:45
1165
2
原创 深入了解C语言中浮点数的存储方式
总的来说,浮点数和整数在内存中存储的区别主要在于数据类型、存储方式、精度和范围上的不同。- 浮点数的范围和精度受到单精度(float)和双精度(double)表示的限制,一般可以表示较大或较小的数值,但是精度会随着数值大小的增加而减少。根据IEEE 754标准,浮点数的存储方式使得计算机能够以近似的方式表示和处理实数,但也因此带来了一些浮点数精度上的限制和问题,比如舍入误差和表示范围。- 浮点数采用IEEE 754标准定义的格式进行存储,包括符号位、指数位和尾数位,以实现对小数的表示和计算。
2024-03-21 17:44:40
782
1
原创 C语言(字符串函数的模拟实现)
1.strlen1.1 用法我们模拟实现第一步是不是应该先了解它的用法呢strlen是 C 语言标准库中的一个函数,用于计算字符串的长度(即字符个数)。它的原型定义在头文件string.h中。下面是strlen其中,str是需要计算长度的字符串,返回值是size_t类型,表示字符串的长度。strlen函数会从字符串的开头开始遍历,直到遇到字符串结束符\0才停止,并返回遍历过程中统计的字符个数(不包括结束符)。1.2 模拟实现然我们来验证一下呗。
2024-03-18 17:31:20
981
1
原创 [高并发网络通信架构]实现tcp的高并发服务端
I/O多路复用(IO Multiplexing)是一种并发编程技术,用于同时监视多个I/O事件并选择就绪的事件进行处理。它可以通过一个线程或进程同时处理多个I/O操作,而不需要为每个I/O操作创建一个独立的线程或进程。I/O多路复用可以提高系统的并发性能,减少资源的消耗。在传统的编程模型中,每个I/O操作通常都需要一个独立的线程或进程来处理。这种方式在面对大量的并发连接时,会导致系统资源的浪费和性能下降。
2024-03-15 16:46:50
3309
1
原创 嵌入式sqlite3库API的使用
还记得我们上期讲了什么吗,没错,我们上期讲到了sqlite的使用,通过对比sqlite3和MySQL进一步了解了sqlite的使用场景,然后我们也讲了如何通过在linux终端执行命令行的方式去操作数据库增,删,改,查。我想大家应该对其有了一定的了解,今天我们来了解如何通过代码的方式去实现它的,增,删,改,查。我们通过这个函数,以及上一期我们讲到的在linux终端执行的SQL命令行就已经可以实现其增,删,改,查了。首先,我们想去操作数据库,就必须去打开它,才能进行下一步操作,当我们结束之后,是不是应该。
2024-03-13 15:53:20
437
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人