自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 进程学习--04

在线程间同步操作可基于信号量实现,信号量代表某一种资源,其值表示某一资源在系统中的数量,信号量是一个受保护的量且值为非负整数,只能通过三种方式进行访问——初始化:sem_init,P操作:sem_wait(申请资源)、V操作:sem_post(释放资源)。当系统资源不足时,其他正常运行的线程或进程可能会受到影响,导致性能下降或甚至崩溃。回收线程一般使用pthread_join和pthread_detach函数,前者显示回收线程,可以接收线程的返回值,后者将线程的状态设置为“分离(detached)”状态。

2024-03-17 14:32:41 650

原创 进程学习--03

此外,守护进程是孤立的,它们必须与其运行前的环境隔离开来,包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等。常见的守护进程包括系统日志进程syslogd、Web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。在Linux系统中创建守护进程一般操作如下:1、创建子进程、父进程退出;2、在子进程中创建新会话;5、关闭所有文件描述符。守护进程(Daemon)是一种特殊的进程,在Linux系统中作为后台服务进程,通常在系统启动时开启,系统结束后关闭。

2024-03-17 13:26:05 585

原创 进程学习--02

PCB中主要包括以下信息:pid(进程标识符),进程状态,程序计数器(PC,用于记录下一条要执行的指令地址),寄存器值(保存进程在执行过程中的寄存器值),内存管理信息(记录进程的内存分配情况,包括代码段、数据段、堆栈等),文件描述符表,优先级,父进程标识符(PPID),子进程列表,信号处理器。僵尸进程是一个已经终止但尚未被父进程回收的进程,它仍然占用进程表中的一个条目。在C语言中,一般使用fork函数开辟进程,这个函数开辟进程后会返回一个进程号,在子进程中会返回0,在父进程中会返回子进程的进程号。

2024-03-16 22:47:34 1675

原创 进线程学习--01

进程在运行过程中,存在创建态(进程正在被创建,但尚未到达就绪状态)、就绪态(进程已经获得了除CPU之外的所有所需资源,一旦得到CPU即可执行时)、运行态(进程正在CPU上执行)、阻塞态(进程正在等待某一事件而暂停运行的状态)、结束态(进程正在从系统中消失),此外还有僵尸态(进程终止运行,但仍保留一些信息,无法终止)、挂起态(进程被挂起,暂停执行)。正文段存放程序代码;程序来说进程是静态的,它是保存在磁盘上的有序的指令集合,没有任何执行的概念。进程是一个动态的概念,它是程序的执行过程,包括创建,调度和消亡。

2024-03-14 22:21:11 565

原创 静/动态库的学习

使用gcc -fPIC -Wall -c hello.c和gcc -shared -o libhello.so hello.o。-fPIC表示编译为位置独立的代码,即可执行的程序装载他们的时候可以放在程序内存的任何位置。静态库的命名规范是以lib开头紧跟库名,扩展名为.a。动态库在编译时并不会被连接到代码中,而是在运行时才被载入,因此程序执行时需要动态库的存在,文件编译后体积较小。静态库在编译时会被连接到目标代码中,程序执行便不再需要静态库,所以相对文件体积较大。

2024-03-12 15:54:18 563

原创 IO学习--02

例如,数字“2001”在文本流中需要用其ASCII码表示为四个字符,即'2'、'0'、'0'、'1',共占4字节。使用fopen函数打开文件,第一个参数为文件的路径名,第二个参数对文件操作的权限,对文件进行只读操作时,使用r(文件必须存在),只写,使用w(文件不存在时则创建,会擦除文件内容),追加使用a(文件不存在则创建)。当第二个参数有b时,表示以二进制方式打开。FILE指针:每个被使用的文件都在内存中开辟一个区域,用来存放文件的相关信息,这些信息保存在一个结构体中,该结构体由系统定义命名为FILE。

2024-03-12 15:11:39 1118 1

原创 IO学习--01

lseek的原型为lseek(int fd, off_t offset, int whence),第一个参数是文件描述符,第二个参数是偏移量,可以向前或者向后偏移,最后一个是文件位置(可以是当前位置SEEK_CUR、文件开头SEEK_SET、文件末尾SEEK_END)。文件描述符是一个非负整数,当打开一个文件时,内核向进程返回一个文件描述符。文件IO,在程序中文件以文件描述符的形式承载,文件描述符是顺序分配的非负整数,内核用以一个表示特定进程访问的文件,也是socket、pipe的访问标识。

2024-03-11 23:31:59 663 1

原创 数据结构学习--06

排序也可分为内排序和外排序,对于内排序,排序文件在内存中、排序过程也在内存中进行。外排序,排序中的文件存入外部存储器,排序过程借助内外数据交换(归并)来完成。在每一次排序中,从未排序的数据元素中选择最小(或最大)的一个元素,存放到排序序列的起始位置,直到全部待排序的数据元素排完。对于排序可分为稳定排序和非稳定排序,稳定排序是指在任意元素间在满足排序规则时,排序前后相对位置不做改变。目前常见的排序方式有:插入排序(直接插入、折半插入、希尔),交换排序(冒泡、快排),选择排序,归并排序,基数排序等。

2024-03-10 20:32:13 326 1

原创 数据结构学习--05

这篇文章将讲解查找算法,查找是在指定集上寻找特定元素的过程,常见的查找方法有顺序查找、折半查找、分块查找、hash表查找等。折半查找,折半查找的前提是数据在存储结构中排列有序,每次查找将搜索空间折半,直到找到对应值。分块查找,将表记录为一定数量的块,块与块存在一定的顺序,查找时先找到对应的块,再在块中查找对应元素。hash表又称散列表,按照一定方法计算出值在表中对应的位置直接返回,算法的时间复杂度为O(1)。顺序查找,即按照顺序依次查找比对是否为特定元素。算法的时间复杂度为O(n)。

2024-03-10 18:53:16 396 1

原创 数据结构学习--04

边链表的每个结点代表一条边,称为边结点,每个边结点有两个域:该边终点的序号以及指向下一个边结点的指针。可用两个数组储存图,一个数组储存顶点集(一维数组),另一个数组储存关系集(二维图),该二维图就是邻接矩阵。此外N个顶点组成的图边最多为0.5*N*(N-1),当边数为0.5*N*(N-1)时,该图被称为无向完全图。简单路径是指当经过途中顶点到顶点间的路径中没有重复顶点则为简单路径,若在路径中只有最后一个顶点与第一个顶点相同,则称为简单环或简单回路。无向图是一种由顶点和边组成的图,其中边没有方向性。

2024-03-09 23:46:51 409 1

原创 数据结构学习--03

二叉树遍历分为先序遍历(先访问树根再访问左节点,最后访问右节点)、中序遍历(先访问左节点,再访问树根,最后访问右节点)、后序遍历(先访问左节点,再访问右节点,最后访问树根)。一个子树的根节点称为该节点的父节点,父节点称其为子节点,父节点的其他节点称为兄弟节点。度数为0的节点被称为叶子节点(树叶)或终端节点,度数不为0的节点称为分支节点,除根节点以外的节点被称为内部节点。每个节点最多只有两个节点的,且严格区分左右节点的树被称为二叉树,二叉树即使只有一个节点也严格区分左右节点。树中节点层数的最大值称为。

2024-03-08 21:51:55 450 1

原创 数据结构学习--02

线性表的主要特点是数据元素之间存在一对一的线性关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。这种一对一的线性关系体现了数据元素之间的位置关系,使得线性表中的数据元素呈现出一种有序的、连续的排列方式。当n=0时,称为空表;,an),其中a1称为线性表的首结点,an称为线性表的尾结点。顺序表在内存中占用一段连续的存储空间,存储密度高,通过下标来访问元素,操作效率较高,但对表的插入和删除的效率较低。由于顺序表使用的是一段连续的存储空间,所以当数据足够大时,也可能会造成空间元素不够的问题。

2024-03-08 20:20:19 475 1

原创 数据结构学习--01

数据结构是计算机存储、组织数据的方式,它指的是相互之间存在一种或多种特定关系的数据元素的集合。逻辑结构:表示数据运算之间的抽象关系(邻接关系,从属关系等),按每个元素可能具有的直接前驱和直接后继,将逻辑结构分为线性结构和非线性结构。存储结构:逻辑结构在计算机中的具体实现方法,分为顺序存储法、链接存储法、索引存储法、散列存储法等。散列存储(hash):根据数据元素的特殊字段,计算数据元素的存放位置,然后数据元素按对应地址存放。链式存储:将数据中各元素分布在储存器的不同点,通过地址的方式建立他们之间的联系。

2024-03-07 20:20:16 519 1

原创 Linux学习--04

对于数值测试一般有-eq(等于)、-ne(不等于)、-gt(大于)、-ge(大于等于)、-lt(小于)、-le(小于等于)。对文件的检查有-e(文件存在)、-r(存在且可读)、-w(存在且可写)、-x(存在且可执行)、-s(文件中至少有一个字符)、-d(目录文件)、-f(普通文件)、-c(字符设备文件)、-b(块设备文件)。shell脚本的执行一般分为三步:建立shell文件,赋予shell文件执行权限,命令行直接执行shell脚本(也可以不赋予执行权限,显示使用解释器执行)。

2024-03-06 23:31:14 439 1

原创 Linux学习--03

mkdir命令用来创建一个目录,如下所示,使用ls -l查看目录中文件的详细信息,使用"|"管道符将ls本该输出到终端的信息作为grep的输入(grep是Linux系统中常见的文本搜索工具)。ls命令用来打印当前目录的所有文件,它的常用选项有a(打印包括隐藏文件的所有文件)、l(按行输出目录所有文件的详细信息),d打印当前目录一般为".",所有选项均可组合使用也可以一起使用。su命令可以变更使用者的身份,一般用来将普通用户变更为超级用户以获得超级用户的权限,如su -l root。

2024-03-05 23:08:11 1982 1

原创 Linux学习--02

从某方面来说Linux起源于UNIX,因为最早的Linux系统是大神Linus Torvalds在大学期间想要在校外使用UNIX系统(“白嫖”),所以借鉴UNIX系统开发了自己的系统,Linux系统,而Linux系统全称为Linux is not UNIX。关于Linux的logo是一个企鹅,有人说是因为企鹅是南极大陆的代表性动物,而根据国际公约,南极洲为全人类共同所有,不属于世界上的任何国家,任何国家都无权将南极洲纳入其版图。内核中的操作都是对用户隐藏的,这样可以有效避免因用户的错误操作造成的严重影响。

2024-03-04 22:30:33 497 1

原创 Linux学习--01

此外我在抖音上看过一则搞笑视频,好像讲述的卫星发射正在进入轨道,这个时候工作人员的电脑突然进行系统自动更新,虽然是个段子,但是也反应出过于依靠他人的系统在某一时刻是非常致命的。由于Linux系统可裁剪,所以很多产品不需要的功能就没必要加上,好比我的计算器,只需要简单的加减乘除,那么对于系统的网络、蓝牙、多媒体部分压根就不需要,在制作内核的时候就没必要添加了。我们在日常生活中使用电脑用的是Windows系统,但是除了Windows系统还有很多计算机系统,在这里我将会介绍我学到的关于Linux系统的相关知识。

2024-03-03 20:19:47 486

原创 C语言学习--08

函数传参分为地址传递和值传递,形参为地址时被称为地址传递,反之为值传递,地址传递常常用于需要对外部变量本身进行改变的操作,而值传递相当于对外部变量的值进行了一个拷贝,在函数内部进行处理时不改变外部变量的值。其实本质上C语言中函数传参都是对实参的值进行传递,只是传递的如果是地址的值,那么对地址保存数据进行操作时,外部拥有同一地址的变量的数据也会改变。对于函数的返回值,不能是函数中局部变量的指针,这是因为函数在执行结束后会回收函数执行过程中开辟的空间,只进行返回值的返回。内置函数是C语言库提供的函数,如。

2024-03-03 19:42:38 343

原创 C语言学习--07

指针和数组有很多相似的地方,数组和指针都可以用来访问存储在同一内存区域的一系列数据,可以通过数组名和下标来访问数组元素,也可以通过指针和其偏移量来访问。在很多情况下,数组名和指针可以互相转换,数组名可以被解释为指向其第一个元素的指针,而指针也可以被解释为指向一个具有特定大小的数组的指针。不过也有很多不同的地方,数组是一个具有固定大小的数据结构,它包含了一系列同类型的数据元素。其中元素存储是一维的,按行顺序优先。0x7ffcf813480c为a变量的地址,也为指针变量p的值,10为地址p中存储的变量的值。

2024-03-02 22:55:50 352

原创 C语言学习--06

goto语句可以直接跳转到标记的位置,可以向前或者前后跳,非常的灵活。if后条件为真,运行if模块的代码,如果为假继续向下判断,如果都不成立,则运行else模块中的代码。switch后面接变量或者式子,如果该变量等于case变量(常量)的值则执行该case后的模块,如果没有一个case成立则执行default后代码。上述代码输出都为“0123456789”,上面没有介绍do-while,其实do-while和while循环类似,知识前一个会先进行一次循环体内部的代码在进行判断。还是一样的举例说明。

2024-03-02 17:47:41 336

原创 C语言学习--05

此外还有,++、--,即加加、减减,它们是单目运算符,顾名思义是指一个变量进行的运算,他们的作用是在本身+1(-1)。||符号两边只要有一个为真则为真,&&符号两边只要有一个为假则为假,在这里涉及到一个短路法则——从左往右开始计算,只要能够确定判断为真或为假,则后续不需要继续进行,即||左边为真则不会运行右边的代码,同样&&左边为假后不需要运行右边的代码。位运算符,~、|、&、^、>>、<<,分别时位逻辑反、位逻辑或、位逻辑与、位逻辑异或、左移、右移,这些都是以二进制形式进行的运行。

2024-03-02 16:43:06 409

原创 C语言学习--04

开头的特殊字符序列,它们定义了如何格式化接下来的参数。一般%d打印十进制整数,%f打印浮点数,%s打印字符串,%c打印字符,%p打印指针地址,%x以十六进制打印。这只是printf函数的基础知识,想了解更多的朋友可查阅相关资料。了解了printf,我们就可以实时查看数据在程序中的运行状态。printf函数用于格式化输出数据到控制台,那么说到格式化输出那么就不得不说格式化说明符,格式说明符是以。接下来我们来介绍一下C语言中的打印函数printf。

2024-03-01 23:15:55 419 1

原创 C语言学习--03

寄存器存储(Register),寄存器存储类型的变量是一种特殊的局部变量,它们被存储在计算机的寄存器中,而不是内存中。但是,由于寄存器的数量有限,因此不能声明过多的寄存器变量,由于寄存器可能还参与程序其他部分的运行,所以即便使用了寄存器类型也不一定能提速。数组类型可以存储相同类型的多个数据元素,结构体类型可以存储不同类型的数据元素,共用体类型可以存储多个不同类型的数据元素,但同一时刻只能使用其中的一个,枚举类型则是将一组整数值赋予有意义的名称。空类型,主要用于函数返回值的类型声明,以及指针类型的声明。

2024-02-29 22:23:16 340 1

原创 C语言学习--02

在这里我用的是vim,这是一个很简洁的工具。预处理阶段是为了处理预处理指令(#后面的内容),在这里是将include后面文件中内容包含入我们的程序中来,还处理注释等内容(这里我们没有注释)。其中"./"表示当前目录,后面为我们的文件名,最终也是得偿所愿打印输出一行代码——hello world。链接阶段是将所有的目标文件和所需的库文件合并为一个可执行文件,这里我们只有一个文件和stdio一个库。这里首先要创建一个空白文件,一般后缀为".c",比如"a.c",之后我们打开该文件就可以进行编写了。

2024-02-29 21:50:37 409

原创 C语言学习--01

符号通常用于预处理指令(Preprocessing Directives)的开头,后面include,中文含义包含,顾名思义,用于在这个文件中包含后面<stdio.h>,表示包含stdio.h文档,其中有我们后面所用到的函数printf。解释一下stdio,前三个字母是标准的缩写,后两个是输入(in),输出(out)的缩写,.h是后缀表示头文件。在了解几家培训机构后,最终在一位朋友的朋友推荐下,以及培训机构的推荐,入了培训班(培训费用还挺贵的),学习嵌入式。(有时候不得不感叹C语言寿命的强大)。

2024-02-28 22:16:13 447 1

空空如也

空空如也

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

TA关注的人

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