自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 进程的异常终止、子进程的回收、管道

对于子进程的结束而言,都希望父进程能够知道并作出一定的反应,通过 wait、waitpid 函数可以知道子进程是如何结束的以及它的结束状态码。什么是进程间通信:是指两个或多个进程之间交互数据的过程,因为进程之间是相互独立的,为了进程间协同工作就必须实现进程间交互数据。管道是UNIX系统中最古老的进程间通信技术,古老意味着所有系统都支持,早期的管道是半双工通信,现有的系统管道是全双工通信。注意:无论进程是如何结束的,它们最后都会执行同一段代码,会关闭所有打开的文件,并释放所有的内存。...

2022-09-01 09:20:21 703

原创 Linux进程管理

注意:vfork创建的子进程一定先返回,此时子进程并没有创建成功,需要加载一个可执行文件替换当前子进程当前的所有资源,当替换完成后子进程才算创建成功,此刻父进程才返回。孤儿进程:父进程先于子进程结束,子进程就变成了孤儿进程,孤儿进程会被孤儿院(init守护进程)领养,init就是孤儿进程的父进程。一个进程可以被另一个进程创建,创建者叫做父进程,被创建者叫子进程,子进程被父进程创建后会在操作系统的调度下同时运行。僵尸进程:该进程已死亡,但是它的父进程没有立即回收它的相关资源,该进程就进入僵尸态。...

2022-09-01 09:19:12 107

原创 Linux信号处理

2、当信号处理完后可能会返回产生信号的代码继续运行,如果我们捕获并处理段错误、算术异常等信号可能会产生死循环,正确的处理段错误、算数异常信号应该是备份数据并直接结束程序。当程序执行到一些特殊操作时,不适合处理信号,此时可以让内核先屏蔽信号,等操作执行完成后再解除屏蔽重新发送信号。6、捕获并处理 (在信号发生前,先向内核注册一个函数,当信号来临时系统会自动执行该函数)当信号产生时,内核会在其维护的信号表中为对应的进程设置与该信号对应的标记,这个过程叫做递送。// 不附带其他信息的信号处理函数。...

2022-09-01 09:18:41 384

原创 文件同步、文件属性

每个文件必须拥有唯一一个inode以及若干个block块,读写文件需要借助目录的block中记录的文件名和inode号找到该文件的inode,通过inode读取block。硬链接:硬链接文件没有自己的inode和block,只是在不同目录下复制了一份源文件的inode信息,通过inode信息访问源文件的block。软链接:软链接会建立自己的新的inode和block,软链接的block存储的是源文件的inode信息、文件名。...

2022-09-01 09:18:11 181

原创 系统调用:(系统API)

结论:使用标准IO比直接使用系统IO更快,原因是标准IO有缓冲区机制,在写入数据时并不是立即直接调用系统IO进行写入,而是先把缓冲区写慢后,再调用系统调用写入到文件中。每个打开的文件都有一个记录读写位置的指针,叫做文件位置指针,所有对文件的读写操作都是从该指针的位置进行的,该指针会随着文件的读写自动往后移动。4、内核中有一张打开文件的表格,文件描述符是访问这张表的下标,因此也称为"句柄",相当于访问已打开文件的凭证。注意:其中一个文件描述符关闭,不影响复制出来的文件描述符,但是他们共享同一个文件位置指针。.

2022-09-01 09:17:30 564

原创 内存管理、进程映像

注意:sbrk/brk 属于POSIX标准中的内存映射函数,都可以单独映射、取消映射,但是配合使用最方便(sbrk映射、brk取消映射)4、每个进程都有4G的虚拟地址空间,虚拟地址只是虚假的地址编号,并不是真实物理内存地址编号,虚拟地址必须与物理内存进行映射后才能使用。1、sbrk/brk底层维护了一个指针,该指针记录这映射内存的结尾,移动该指针就会映射、取消映射,映射的内存属于堆内存。2、mmap/munmap 底层不维护任何东西,如果mmap映射成功返回映射后的内存首地址,映射的内存属于堆内存。...

2022-09-01 09:16:56 406

原创 Linux环境编程

Minix操作系统是一种基于微内核架构的类UNIX计算机操作系统,并开放全部源代码给大学教学和研究工作,Linux之父林纳斯正是收到Minix的启发,才开发了第一个版本的Linux内核。相当于带入口的可执行文件,当运行程序时,会把共享库一起加载到内存中,调用共享库函数,函数名就是记录了它在共享库中的位置,本质上是跳转到共享库中对应的位置执行。每个程序执行时操作系统都会分配一张环境变量表,该表中记录了操作系统所有的环境变量,这些环境变量反映了操作系统的配置情况,以及程序所处于的操作系统环境情况。...

2022-09-01 09:16:26 208

原创 查找算法.

找到一个标杆p,备份标杆p的值val,一面从左找比val大的数据,找到后赋值给p,更新标杆p的位置到左标杆,然后从右边找比val小的数,找到后也赋值给p,同样更新p到右标杆,反复执行直到左右标杆相与停止,最后把val赋值回p的位置,最终会形成p左边的数都比它小,右边的数都比它大;根据数据的值存储到不同的桶中,然后再调用其它的排序算法,度桶中的数据进行排序,然后再从桶中依次拷贝回数组中,从而降低排序的规模以此提高排序的速度,是一种典型的以空间换时间的算法。...

2022-09-01 09:15:03 70

原创 图的遍历:

是一种数据处理的思想,不是一种特定的算法,当数据量非常多时,可以先把数据进行分块处理,然后再根据分块的条件进行查找,例如英文字典。可行性:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性)注意:对于一个算法而言,其时间复杂度与空间复杂度往往是相互影响的,没有唯一的标准,需要结合实际综合考虑。分而治之,把一个大而复杂的问题,分解成很多小而简单的问题,利用计算机强大的计算能力来解决问题。注意:由于不存在自己到自己的边,左对角线上的值一定为0。.

2022-08-26 08:40:20 64

原创 数组与矩阵

度:依附于顶点的边的数量称之为该顶点的度,有向图中,度分为出度(从该顶点出发的弧的数量)、入度(指向该顶点的弧的数量)生成树:顶点数为n,仅需要n-1条边的连通图,称之为生成树,如果给边配上权重,权重和最小的生成树称之为最小生成树。通常表示: G(V,E) G表示一个图,V是图中顶点集合(元素),E是图中所有边(元素之间的关系)的集合。注意:不讨论顶点到自身的边,且不讨论重复的边,这种图统称为简单图,数据结构中只研究简单图。边的权重:图中的边附带有意义的数据,这些数据叫做边的权重,带权重的图也称为网。..

2022-08-26 08:39:40 132

原创 平衡二叉搜索树

b、规定哈夫曼树的左分支为0,右分支为1,则从根节点到叶子节点经过的路径分支所组成的0、1序列为该对应字符的哈弗曼编码。2、从F中选取权值最小的两个节点作为左右子树构建成一棵新的二叉树,且新的根节点的权为左右子树的权值之和。也是一种自平衡的树,它不是根据子树的高度差来调整平衡的,而是给节点设置一种颜色,来达到平衡。普通带权二叉树的WPL:5*1+15*2+40*3+30*4+10*4=315。把祖父节点当做当前节点,继续向上讨论调整。节点的权:若将树中节点赋予一个有某种意义的数值,该数值称为该节点的权。..

2022-08-26 08:39:02 91

原创 各种二叉树

是一种完全二叉树,待比较的数据都存储在最后一层,根节点是根据左右子树其中一个生成,因此根节点是最大或者最小的,选择树的功能是快速地找出最大值或最小值。6、请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。有序链式二叉树中有很多的空指针,可以让这些指针指向下一个、前一个节点,这样在遍历时可以不用递归而可以使用循环遍历,可以提高树的遍历速度。右子树指针标志位 (假表示指向真的右子树,真表示右子树指向下一个节点)...

2022-08-26 08:38:29 50

原创 二叉树特点

完全二叉树:深度为k,有n个节点的二叉树当且仅当其每一个节点都与深度为k的满二叉树中编号从1到n的节点一一对应时,称为完全二叉树。左子树的数据小于根,右子树的数据大于等于根,这种树称为有序二叉树、二叉搜索树、二叉排序树。性质3:若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1。双亲和孩子(父节点、子节点):节点的子树被称为孩子节点,该节点就是它们的双亲。若2i+1≤n,则有编号为2i+1的右节点,否则没有右节点。若2i≤n,则有编号为2i的左节点,否则没有左节点。...

2022-08-26 08:37:55 301

原创 树型结构:

二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。完全二叉树:深度为k,有n个节点的二叉树当且仅当其每一个节点都与深度为k的满二叉树中编号从1到n的节点一一对应时,称为完全二叉树。双亲节点和孩子节点:节点的子树被称为该节点的孩子节点,该节点就是孩子节点的双亲节点。节点的层次:根节点的层次为1,它的孩子层次为2,孩子的孩子层次为3,以此类推。祖先:从根节点出发到该节点,路径上经过的所有节点都称为该节点的祖先。...

2022-08-26 08:37:11 49

原创 双向链表..

链表的最后一个结点的next不再指向NULL,而是指向头结点,这种链表称为单向循环链表,简称循环链表,它好处是可以通过任意结点来遍历整个链表。牺牲了随机访问的功能、也没达到链表动态申请内存的效果,只是给没有指针的编程语言实现链表的一种方式,适用范围不大。这种链表在插入删除时时需要修改游标的值,而不用申请、释放结点内存就可以达到类似链式结构的效果。3、已知结点位置,可以选择从前往后或者从后往前遍历,提高链表的访问效率。静态链表的结点存储在连续的内存中,通过游标来访问下一个结点。5、Linux内核通用链表。..

2022-08-26 08:36:23 198

原创 封装链表:

链表的最后一个结点的next不再指向NULL,而是指向头结点,这种链表称为单向循环链表,简称循环链表,它好处是可以通过任意结点来遍历整个链表。牺牲了随机访问的功能、也没达到链表动态申请内存的效果,只是给没有指针的编程语言实现链表的一种方式,适用范围不大。顺序结构:数据存储在连续的内存中,可以使用数据的相对位置来表示数据之间的关系。注意:栈、队列的功能受限、只能操作栈顶或队头队尾,除此之外操作其他任何元素都是非法的。创建、销毁、清空、添加、删除、查询、访问、修改、排序、遍历。栈2不空,栈1不能到栈2。...

2022-08-26 08:35:35 160

原创 链式表xx

由一维数组+队头下标front+队尾下标tail组成,入队tail++,出队front++,为了让队列能够反复使用,我们把队列想象成一个环,因此当front和tail加1后都需要用队列容量求余再重新赋值。缺点:添加、删除结点时,可能修改指向第一个结点的指针,参数需要使用二级指针,才能更改指针的指向,比较麻烦。创建、销毁、入队、出队、队空、队满、查队头、查队尾、数量。创建、销毁、入栈、出栈、栈顶、栈满、栈空。创建、销毁、队空、入队、出队、队头、队尾。创建、销毁、入栈、出栈、栈空、栈顶。...

2022-08-26 08:34:50 47

原创 什么是数据结构

数据元素存储在彼此相互独立的内存中,每个独立的元素也叫做结点,每个结点中增加一项数据项用于存储其它相关结点的地址,以此表示结点之间的关系。缺点:添加、删除结点时,可能修改指向第一个结点的指针,参数需要使用二级指针,才能更改指针的指向,比较麻烦。第一个结点的数据域不存储有效元素,仅仅只是使用它的指针域永远指向链表的第一个数据有效的结点。创建、销毁、清空、插入、删除、访问、查询、修改、排序、遍历。数据元素:组成数据的有一定含义的基本单位,也叫做结点、节点、记录。数据项:有独立含义的数据的最小单位,也称为域。..

2022-08-26 08:33:51 62

原创 0726文件

枚举就是一种数据类型,把可能出现的所有值罗列出来,并起一个有意义的名字表示这些值,除此之外给该类型的变量赋其他值,是非法的(愿望)内存对齐假设第一个成员从零地址开始,每个成员使用的内存编号,必须是它字节数的整数倍,如果不是则需要填充一些空白字节。与结构的区别是联合的所有成员共用一块内存,一个成员的值发生改变,其他成员也随之改变。如果不给成员值,那么枚举中的值第一个默认从0开始,逐渐+1,如果设置了某个值,后面的成员在它的基础上+1。成员的数据不同会影响结构体的总字节数,如何顺序安排合理可以节约内存。...

2022-07-27 08:58:39 50

原创 0725结构体

由于结构变量的字节数一般都比较大,普通的值传递效率非常低,因此传递结构变量的地址,也即是传递结构指针变量,此时想要通过结构指针变量访问成员时借助->,如果不需要修改指针变量的成员值,可以使用const保护。练习1设计一个教师结构体类型,类型中要有成员姓名、性别、工号、工龄,定义一个教师结构变量,使用scanf输入每个成员的值并显示job4\1.c。不是真正函数,只是带参数的宏,使用宏函数,先替换成宏函数后面的代码,提供的参数会替换代码中相应的位置。...

2022-07-27 08:57:58 41

原创 0723-2048

在终端执行make命令,就会自动执行Makefile脚本文件中的编译指令,它可以根据文件的最后修改时间来判断哪些文件需要重新编译、哪些不需要重新编译,从而提高编译效率。3.如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的c文件,并链接目标程序。2.如果这个工程的某几个c文件被修改,那么我们只编译被修改的c文件,并链接目标程序。1.如果这个工程没有编译过,那么我们的所有c文件都要编译并被链接。执行目标依赖a.ob.oc.o。被依赖的目标1依赖文件。...

2022-07-27 08:57:08 319

原创 0722预处理

1、当想要从缓冲区中读取整型、浮点型数据,而缓冲区中的数据是字符、字母时,此次读取会失败,而且不会从缓冲区中拿走该数据,导致接下来所有数据的读取都出问题。3、先输入其他类型数据,再输入字符、字符串数据,那么其他类型数据输入时最后按下的'\n'或者空格就会被字符、字符串接收,影响正常的输入。在终端输入的数据,按下回车后,会从终端存储进输入缓冲区中,再执行输入函数时,会从输入缓冲区中读取相应的数据。翻译的过程叫做预处理,负责翻译的程序叫做预处理器,被翻译的语句叫做预处理指令,以'#'开头的都是预处理指令。...

2022-07-27 08:56:21 145

原创 0721字符串相关操作函数

返回值needle在haystack中首次出现的位置,如果找不到则返回NULL。功能比较两块内存的值,按照字节比较,一旦比较出结果后面不再比较。4、查找联系人,按照电话或者姓名,支持模糊查找。功能从src位置拷贝n个字节到dest的位置。功能把各种类型的数据输出给字符串str。功能字符串转longlong类型。功能从str中解析读取数据到变量中。返回值s1==s20。3、按名字修改联系人信息。功能字符串转double类型。功能字符串转long类型。功能字符串转int类型。...

2022-07-21 19:07:01 28

原创 0720字符串

程序并不是立即从键盘获取输入的内容,而是当按下回车后,终端输入的内容会先存储到输入缓冲区中,然后输入函数再从输入缓冲区中读取数据到内容中。1、当想要读取整型或浮点型数据,但是缓冲区中的数据是符号或字母时,读取会失败,数据会残留在缓冲区中,影响接下来所有数据的读取。从头开始,每个字符一对一进行比较,按照字典序,谁出现在前谁小,一旦比较出结果,立即返回结果,后面的不再比较。从缓冲区中读任意数据并丢弃,如果不是'\n',继续读取,直到遇到'\n',停止读取(正则表达式)...

2022-07-21 08:56:57 48

原创 0719堆内存

1、当首次向malloc申请内存,malloc会向操作系统申请内存,操作系统会直接分配33页(1页=4096字节)内存交给malloc管理,但是并不意味着可以越界访问,因为malloc可能把其他的内存分配给"其他人",这样就会产生脏数据。2、每个内存块之间会有空隙(4~12字节),一部分空隙是为了内存对齐,其中一定有4字节记录了malloc的维护信息,这些维护信息决定了下一次malloc分配内存的位置,如果破坏了维护信息,会影响下一次malloc或者free的过程。...

2022-07-19 20:10:02 46

原创 0718指针

NULL一般作为一种错误标志,返回一种错误结果,当一个函数的返回值是指针类型时,可以使用NILL作为函数执行出错的返回结果。当我们为了提高传参效率而使用指针作为函数参数时,传参效率提高了,但是变量被共享存在被修改的风险,可以使用const保护指针所在的内存。指针变量中存储的是整数,理论上整数可以使用的运算符它都可以使用,但是绝大多数运算符是无意义的。指针-指针(指针-指针)/指针类型宽度计算两个指针之间间隔了多少个指针元素。1、当函数的参数是指针,别人传给你的指针可能是空指针。...

2022-07-18 16:43:50 29

原创 0715函数递归、指针

递归函数每一次调用都会在栈内存产生一份自己的拷贝,直到执行到达出口,才会释放这一层递归函数,因此与循环相比,递归非常耗费内存、速度很慢,因此如果能用循环解决的问题就不要使用递归。指针是一种特殊的数据类型,使用它可以定义指针变量,指针变量存储的是整型数据,代表了内存的编号,通过这个编号可以访问对应的内存。通过指针变量中记录的内存的编号去访问对应的内存,该过程可能会产生段错误,原因是里面存储的内存编号是非法的。2、指针的类型表示指向的内存存储的是什么类型变量的地址,它决定了通过这个指针变量可以访问的字节数。..

2022-07-18 16:42:38 101

原创 0714小项目:五子棋

返回值return语句不是把数据之间传递给调用者,而是放入到都能访问的一个公共区域内,如果没有return语句,那么该区域的数据就是一个不确定的垃圾值。注意局部变量可以和全局变量同名,在函数内,局部变量会屏蔽同名的全局变量,块变量在语句块内会屏蔽同名的全局、局部变量,址传递数组,函数之间可以共享同一个数组,数组长度会丢失,需要增加一个参数传递数组的长度。const修饰初始化过的全局变量、静态局部变量,变成了常量,强制修改会段错误。值传递普通变量,实参与形参单项值传递,函数之间不能共享同名变量。...

2022-07-15 08:44:19 66

原创 0713函数传参

复习: 进制转换: 十进制转二进制:对2求余,直到商为0,过程中余数的逆序就是二进制 二进制转十进制:2^(n-1)每位结果相加 二进制转八进制:三位二进制对应一位八进制 二进制转十六进制:四位二进制对应一位十六进制 代码中0开头是八进制数,0x/0X开头是十六进制 %o 八进制 %x 十六进制 原码、反码、补码: 正数、无符号数的原、反、补一致 负数:转换成二进制,除符号位外,其他位按位求反,得到反码,反码+1得到补码

2022-07-13 20:31:12 114

原创 0712进制转换

一、进制转换 二进制、八进制、十进制、十六进制 现在的CPU只能识别高低电平,只能对二进制的数据进行计算 虽然二进制的数据可以直接被CPU识别计算,但是不方便书写、记录,把二进制的数据转换成八进制是为了方便记录到文档中 对于CPU的位数的发展不断增加,由8位逐渐发展到现在的64位,因此八进制就不能满足需求了,所以发展出了十六进制,但是由于历史原因八进制还不能完全淘汰 十进制转二进制:(转其他进制) 求余法:用2对数据求余,然后继续对商求余,直到商为0结束,该过程中

2022-07-12 18:53:50 426

原创 0711小项目推箱子走迷宫

1、先在windows系统下把getch.h放入共享文件夹2、在Ubuntu终端输入cd /media/sf_Share/ 进入共享文件夹3、复制getch.h到C标准库中 sudo cp getch.h /usr/include/4、加读权限 sudo chmod +r getch.h5、导入getch.h头文件,使用getch()函数获取键值 Ubuntu下的键值: 方向键上:183 下:184 右:185 左:186走迷宫: day04/maze.c 数

2022-07-12 08:43:41 574

原创 0708跳转语句

跳转语句 goto 可以在函数内任意跳转 标签名: ... goto 标签名; 它可能会破坏已经设计好的分支或者循环结构,因此绝大多数公司禁止使用goto 但是在驱动变成时特别适合处理异常 计算阶乘 5! 1*2*3*4*5 break 1、在switch中关闭case执行开关 2、跳出循环,只能跳出当前一层循环 comtinue

2022-07-08 20:48:24 33

原创 0707标准C语言

类型转换 只有相同类型的数据才能运算,如果类型不相同的数据需要先转换相同类型后再进行计算 自动类型转换: 转换规则:以不丢失数据为基础,可以适当地牺牲一些空间 1、字节少的向字节多的转(优先级最高) char int 2、有符号的向无符号的转 3、整型向浮点型转 注意:char shotr 如果与不同类型的数据运算时,会先提升为int类型后参与运算 强制类型转换: (新类型名)数据;

2022-07-07 20:17:25 66

原创 0706C语言简介2

C语言中以分好作为一行代码的结束,使用大括号划分区域编译器 负责把人能看得懂的记录着代码的文件,翻译成计算机能看得懂的二进制文件,由预处理器、编译器、链接器组成 gcc是由GNU社区为例编译Linux内核代码而开发的一款免费的编译器 gcc常用的编译参数: -E 只显示预处理结果到终端 -std=gnu99 设置C99语法标准 -c 只编译不链接 -o 指定编译结果的名字 -oname -o name -S

2022-07-06 20:33:41 232

原创 0705C语言简介

C语言简介 BCPL->new B->C语言->UNIX->Minix->Linux->gcc C语言诞生于1970~1973,在肯·汤姆逊和丹尼斯·里奇的编写下完成,归属于美国贝尔实验室。 C语言专门用于编写操作系统而发明的编程语言,所以天生适合对硬件编程,也以运行速度快而著称,也非常适合实现数据结构和算法。 嵌入式硬件工程师,嵌入式软件工程师 由于出现的时间过早,有很多缺陷,也存在很多陷阱,但是我们的前辈给总结了一些避免陷阱的经验教训。《C陷阱与缺陷》 C语言语法很自

2022-07-05 18:36:38 44

原创 0705Linux系统命令2

Ubuntu使用小技巧: Ctrl+l 等同于清理屏幕 clear命令 up/down 方向键调出历史命令 Tab 自动补全系统命令、文件名 Ctrl+Alt+t 快速打开新终端 Ctrl+Shift+t 新建终端标签页终端修改配置文件: 1、gedit ~/.bashrc 打开终端配置文件 2、一定要在末尾添加修改 # 精简命令提示符 PS1="\u@\w$ " # 创建目录并进入目录

2022-07-05 18:35:57 36

原创 Linux系统介绍

Linux管理硬盘的能力非常强,所以我们只能看到一个分区 UNIX/Linux系统 一切皆文件

2022-07-04 19:44:00 64 1

空空如也

空空如也

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

TA关注的人

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