- 博客(33)
- 收藏
- 关注
原创 操作系统-进程(2)
我们从一个常见的问题入手,我们写main函数的时候,结尾都会写一个return 0,那么这个return是返回给谁呢,为什么是返回0呢,0是退出码,退出码一般是零和非零两种情况,返回零表示程序正常结束,非零返表示程序异常结束,返回的这个退出码一般是返回给父进程,main函数的父进程一般是bash,我们可以采用 echo $?我们发现exit结束,会刷新缓冲区,_exit不会刷新缓冲区,_exit使系统接口,exit实际上底层封装的就是_exit,由此能看出,之前提出的缓冲区不是系统维护的,而是c库维护的。
2023-02-26 19:10:57
162
原创 操作系统-进程(1)
学习计算机操作系统,首先要了解一些必要的概念,首先,先谈论一下冯诺依曼体系结构,我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系我理解的操作系统就是对上,为用户提供更好的服务,对下,更好的管理硬件这里讲两个例子方便理解操作系统的管理模式。1.学校,讲个现实点的问题,大家除了开学典礼上见过校长,之后是否见过校长呢?,反正我没见到过,虽然我没没有见到过校长,但是我没好像仍然感受到在被管束下,这不禁让人觉得,是否管理一个人不需要面对面的约束?而是利用别的方式?
2023-02-22 10:39:04
345
原创 进程信号.
函数sigfillset初始化set所指向的信号集,使其中所有信号的对应bit置位,表示 该信号集的有效信号包括系。从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次,阻塞标志也是这样表示的。的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有。Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可。注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。
2023-01-08 21:13:56
143
原创 进程间通信-匿名管道
通常,一个管道由一个进程创 建,然后该进程调用fork,此后父、子进程之间就可应用该管道。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止 时要通知父进程)。一般而言,进程退出,管道释放,所以管道的生命周期随进程一般而言,内核会对管道操作进行同步与互斥。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”
2022-12-30 22:14:07
147
原创 虚函数&多态
一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数。// 首先BuyTicket虽然是虚函数,但是mike是对象,不满足多态的条件,所以这里是普通函数的调。虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的。平台可能会放到对象的最后面,这个跟平台有关),对象中的这个指针我们叫做虚函数表指针(v代。那么我们如何查看d的虚表呢?虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成。的地址要被放到虚函数表中,虚函数表也简称虚表,。
2022-10-21 09:27:05
306
原创 继承&多态
Teacher的继承Person时使用虚拟继承,即可解决问题。派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。6个默认成员函数,“默认”的意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类。基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。虚拟继承可以解决菱形继承的二义性和数据冗余的问题。持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。为了研究虚拟继承原理,我们给出了一个简化的菱形继承继承体系,再借助内存窗口观察对象成。
2022-10-16 17:36:51
117
原创 模板进阶.
向的d1显然小于p2指向的d2对象,但是Less内部并没有比较p1和p2指向的对象内容,而比较的是p1和p2指。通过观察上述程序的结果发现,对于日期对象可以直接排序,并且结果是正确的。通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结。该种实现简单明了,代码的可读性高,容易书写,因为对于一些参数类型复杂的函数模板,特化时特别给。偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版。特化之后,在运行上述代码,就可以得到正确的结果。
2022-09-28 10:58:54
94
原创 进程控制(替换原理)
事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在。用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动。这种通过参数和返回值在拥有私有数据的函数间通信的模式是结构化程序设计的基础。被调用的函数执行一定的。每个函数都有他的局部变量,不同的函数通过call/return系统进行通信。
2022-09-22 21:27:23
85
原创 vector的介绍
7. 会引起其底层空间改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代。器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是。空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,以下代码的功能是删除vector中所有的偶数,请问那个代码是正确的,为什么?
2022-09-17 21:39:32
1678
原创 进程地址空间
说了这么多,回到最开始的问题,为什么同一块的地址会有不同的数据呢,因为地址是虚拟地址,压根不是物理地址,子进程被创建的时候,对父进程的代码进行复制,拥有自己的task_struct,在子进程要对父进程的数据进行修改的时候,操作系统会给子进程在物理空间处分配一块新空间,但是虚拟空间处看起来就一样了。2.因为地址空间的存在,有页表的映射的存在,我们的物理内存中,就可以对未来的数据进行任意位置的加载(反正有一对一的映射)这样内存管理模块和进程管理模块就完成了解耦合。首先我们在linux上面执行这么一段代码。
2022-09-14 22:41:40
109
原创 模板泛型编程
比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然。类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟,然后将实例化的类型放在函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定。函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供。模板是泛型编程的基础。...
2022-08-09 08:24:41
84
原创 类和对象.
比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声。友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。如果B是A的友元,C是B的友元,则不能说明C时A的友元。友元函数可访问类的私有和保护成员,但不是类的成员函数。一个函数可以是多个类的友元函数。...
2022-08-05 20:17:08
80
原创 Linux权限的概念
换句话来讲,就是只要用户具有目录的写权限,用户就可以删除目录中的文件,而不论这个用户是否有这个文件的写。对目录来说,具有进入目录的权限。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd进入目,即使目录仍然有-r读权限(这。而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。我们用下面的过程印证一下。可写权限如果目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件.权限,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。...
2022-07-20 23:21:01
196
原创 this指针
C++中通过引入this指针解决该问题,即C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。结构体中只能定义存放数据的结构,操作数据的方法不能放在结构体中,即数据和操作数据的方式是分离开的,而且实现上相当复杂一点,涉及到大量指针操作,稍不注意可能就会出错。函数中都是通过Stack*参数操作栈的。...
2022-07-18 23:00:37
213
原创 【归并排序】
作为排序中不考虑空间复杂度,效率最高的排序方法,归并排序的时间复杂度接近logn,归并排序的主要思想是分治,将一个大的区间分成很多个小区间,然后使小的区间有序,最后将小的有序区间归并起来,使整个大的区间有序,其实跟链表中的合并有序链表是一个道理,下面来观看代码这里的思路类似于树的前序遍历,先将整个区间分成两份,然后处理左区间,左区间再次分治,周而复始,然后再处理右区间,当然,先右再左也可以,看个人习惯,图示如下。归并主要分三个大的部分1.拆分2.合并3.拷贝回去拆分已经就是依靠递归的手段,合并
2022-07-03 20:13:31
94
原创 排序-希尔排序
在这里详解一下希尔排序,在开始我们先引入插入排序。void InsertSort(int* a, int n){ int end; for (int i = 0; i < n - 1; i++) { end = i; int t = a[i + 1]; while (end >= 0) { if (a[end] > t) { a[end + 1] = a[end]; end--; } else { break;
2022-05-27 14:51:11
71
原创 PTA 7-5(括号匹配)30分
描述:假设表达式中只包含三种括号:圆括号、方括号和花括号,它们可相互嵌套,如([{}])或({[][()]})等均为正确的格式,而{[]})}或{[()]或([]}均为不正确的格式.输入一串括号如果输入的右括号多余,输出:Extra right brackets如果输入的左括号多余, 输出:Extra left brackets如果输入的括号不匹配,输出:Brackets not match如果输入的括号匹配,输出:Brackets match#include <iostream>
2022-05-15 20:40:21
1456
原创 链表&顺序表
线性表里面我们最常见的就是链表,顺序表,主要区别如下顺序表:顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的结点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。简单来说就是,用一段连续的地址存放数据元素,数据间的逻辑关系和物理关系相同。优点 1:存储密度大,空间利用度高,比链式存储节约空间优点 2:存储操作上方便操作,顺序支持随机存取,查找会比较容易缺点 1:插入或者删除元素时不方便,花费的时间更多链表:概念:链式存储结构,又叫链接存储结构。在计
2022-05-13 14:38:57
181
原创 程序的翻译环境和执行环境
再ANSI C的任何一种实现中,存在两个不同的环境第一种是翻译环境,在这个环境中源代码被转化为可执行机器指令。第二种是执行环境,它用于实际执行代码#include <stdio.h>#include <windows.h>int main(){ FILE* pf = fopen("test.txt", "w"); fputs("abcdef", pf);//先将代码放在输出缓冲区 printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容
2022-04-10 11:51:06
255
原创 宏定义,预处理
#define 替换规则在程序中拓展#define定义符号和宏时,需要涉及几个步骤1.在调用宏是,首先对参数进行检查,看看是否包含任何由#define定义的符号,如果是,他们首先被替换。2.替换文本随后被插入到程序中原来文本的位置,对于宏,参数名被他们的值所替换。3.最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。注意:1.宏参数和#define定义中可以出现其他#define定义的符号。但是对于宏,不能出现递归。2.当预处理器搜索#de
2022-04-09 20:24:49
199
原创 找单身狗.
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。此题的主要思路是异或的使用,本题考查的关键就是,如何能够将两个唯一出现的数字分到两个组。1.异或是符合交换律的。2.相同的数字异或结果是零。3.零和任何数异或结果都是另一个数。那么本题的大体思路就是,让两个单独出现的数字分别再两个组出现。首先我们让所有值异或,那么结果就是那两个单独出现的数字异或的结果那么怎么找出来分开两个数字呢举个例子我们只要找出来,两个数的二进制第一次不一样的位置就好了
2022-03-30 16:56:07
80
原创 彻底解决结构体占内存问题
struct S1{ char c1;//1 int i;//4 char c2;//1};struct S2{ char c1;//1 char c2;//1 int i;//4};int main(){ struct S1 s1; struct S2 s2; printf("%d\n", sizeof(s1)); printf("%d", sizeof(s2)); }这里两个结构体元素一样,但是所占字节数不同结构体对齐规则1.第一个成员与结构体变量
2022-03-26 22:51:01
475
原创 内存函数memcpy memmove的自我实现
当我们想要拷贝数组中元素的一部分时,我们可以用memcpy函数,具体实现如下void* my_memcpy(void* dest, const void* src, size_t count){ assert(dest && src); void* ret = dest; while (count--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } re
2022-03-25 23:07:06
194
原创 C语言指针进阶
首先来看一道指针的题,答案如下#include <stdio.h>int main(){ char* c[] = { "ENTER","NEW","POINT","FIRST" }; char** cp[] = { c + 3,c + 2,c + 1,c }; char*** cpp = cp; printf("%s\n", **++cpp); printf("%s\n", *-- * ++cpp + 3); printf("%s\n", *cpp[-2] + 3); pri
2022-03-18 07:47:23
681
原创 PTA 7-4一元多项式的加法(20分)
这里是写了很多遍才过的,注意审题,要不然会有得分点过,第一个,零次多项式,就是系数全部为零的多项式,还有整形范围内,coef系数这个地方要处理成int ,严蔚敏著的《数据结构》上面用的float,但在这会显示一个点不过。#include <stdio.h>#include <iostream>using namespace std;typedef struct PNode{ int coef; int expn; struct PNode* next;}PNode,
2022-03-06 21:05:02
3311
2
原创 C语言内存管理陷阱
我们都知道C语言中整形是以补码的形式存在的,正整数的源 反 补码,三码相同,但是负数的存储就不一样了,需要由源码得到反码来存储,现在我们来做一道题。#include <stdio.h>int main(){ char a=-1; signed char b=-1;unsigned char c=-1; printf("%d %d %d",a,b,c);}这里的答案是a=-1 b=-1 c=255,好像和我们想象的不一样,我们一点点来分析,a为char
2022-02-25 22:56:48
519
原创 扫雷小游戏,可展开
这里写目录标题初始化棋盘显示棋盘放置地雷记录周围地雷数目展开判断条件格局构造整体实现初始化棋盘这里的大体思路还是创建两个棋盘,一个它用来存放地雷判断条件,另一个用来看,假设要9×9的棋盘一定要创建11*11的,方便计数。void initqipan(char a[ROW1S][COL1S], int row, int col, char set){/*这里的a数组是显示棋盘,并且未展开前,全部初始化为‘*’ */ for (int i = 1; i < row; i++) { for
2022-01-23 23:01:25
2421
原创 三子棋,和人工“ZZ”的较量,学完数组就可以写啦
1.棋盘的构建2.棋盘初始化3.玩家移动4.电脑移动5.输赢判断6.基本框架7.代码实现1.棋盘构建void qipan(char a[ROW][COL], int row, int col){ for (int i = 0; i < row; i++) { for (int z = 0; z < col; z++) { printf(" %c ", a[i][z]); if (z != col - 1) printf("|"); } p
2022-01-22 21:49:21
160
原创 递归经典问题,青蛙跳台阶。
想必看过《少年班》的观众们都对这一幕记忆犹新把,老师来到农村,找到王大法,问了个问题,一共二十层台阶,一次只能跳一阶,或者两阶,一共有多少种跳法,王大法拿着龟壳,摇了几下,看着地上的铜钱,便得出了答案。这里其实是经典的递归问题。如果只有一个台阶,那么一共只有一种跳法,如果有两个台阶,那么就有两种跳法(分两次跳,或者一次),那么不妨写一个函数计算跳法。int tiao(int n){ 设一共有n节台阶 第一次跳一个,那么还剩n-1个,因为函数计算的是跳的次数,剩下台阶的跳法就还有t
2022-01-19 17:14:50
430
原创 猜数字游戏,猜错要自动关机哦
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <Windows.h>#include <time.h>void game(){ int guess; int ret, count=5, z = 0; /*如果觉得次数太少,可以把count的值更改为更大的数字*/ ret = rand().
2022-01-16 16:56:44
2823
原创 初始C语言
编写一个简单的C语言程序:在 Kernighan 和 Ritchie编写的经典C语言著作《C语言设计语言》中,第一个程序是极其简短的。它仅仅输出了一条hello world消息,这里我将用采用,显示双关语,下面是一条双关语。To C, or not to C: that is the question.下面的这个名为pun.c的程序将会在每次运行的时候显示上述信息。#include <stdio.h>#include <stdlib.h>#include...
2022-01-15 22:05:38
504
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人