- 博客(22)
- 收藏
- 关注
原创 【无标题】
进程空间是独立的,共享内存是开辟一段内核空间,进程都映射到这一片空间上,实现空间的。(4)每个IPC对象可以创建一个消息队列、一个共享内存、一个信号灯。ipcrm -q/m/s 消息队列/共享内存/信号灯的ID。用于线程间通信的信号量称为无名信号量,信号灯是有名信号量。ipcrm -Q/M/S IPC对象的Key值。(2)在操作系统关闭的情况下数据会被回收掉。3. 将进程空间地址映射到共享内存空间中。4. 读写共享内存空间实现进程间通信。信号灯是一组信号量,即信号量的数组。查看消息队列/共享内存/信号灯。
2025-08-19 20:19:03
215
原创 进程间通信
1. 概念:Linux系统中的信号主要实现应用层和内核层之间的信号通知。4. 管道中没有读端:写入数据时,会产生管道破裂的信号导致进程任务异常退出。2.多个进程没有共享的用户空间,进程是操作系统资源分配的最小单元;读取数据时,如果管道中没有数据则阻塞等待有数据写入才能读出。3. 两个进程可以通过向管道文件中读写数据实现进程的通信。3. 捕捉:信号来了,按照用户自己定义的方式处理信号。1.进程空间是独立的,包含文本段,数据段,系统数据段;2. 忽略:信号来了,不处理信号,忽略信号。
2025-08-18 20:28:56
272
原创 【无标题】
原型:int pthread_mutex_unlock(pthread_mutex_t *mutex);2. 使用pthread_mutex_trylock替换pthread_mutex_lock。如果信号量资源数为0,申请资源会阻塞等待,直到占用资源的任务释放资源,资源数不为0时。如果信号量资源数为0,则会阻塞等待,直到有任务释放资源,才能拿到资源并继续向下。c/一个进程中的多个线程独享栈空间,文本段、数据段、堆区进程多线程共享。b/每个进程空间独立的,包含文本段+数据段(全局变量)+系统数据段。
2025-08-17 17:20:05
303
原创 【无标题】
(2)exec常搭配fork使用,fork创建新的子进程,exec负责让子进程执行自己的代码。线程和进程不完全一致,轻量指空间,进程空间和线程空间管理方法不同。1. 线程本质是进程,线程是任务创建、调度、回收的过程。一个进程中的所有线程共享文本段+数据段+堆区,独享栈区。线程必须位于进程空间内部,没有进程,线程无法独立存在。2. 进程空间:文本段 + 数据段 + 系统数据段。一个进程中的多个线程切换调度任务时,资源开销比较小。(1)利用进程空间执行另一份代码。线程是一个轻量级的进程。线程本质就是一个进程。
2025-08-16 01:22:41
170
原创 进程和线程
(4)字符串常量、已初始化全局变量/静态变量,未初始化全局变量/静态变量5)系统数据段:堆区(malloc空间),栈区(局部变量,函数运行);(2)进程用户空间:文本端(文本区)+数据段(数据区)+系统数据端(堆区,栈区);(5)系统数据段:堆区(malloc空间),栈区(局部变量,函数运行);(1)每个程序运行起来之后,操作系统开辟0-4G虚拟空间内存;(1)进程:是程序动态执行的过程,包括创建,调度,消亡;(3)进程空间:用户空间+内核空间(不允许用户访问);1)多个进程空间在存储时空间是独立的;
2025-08-14 11:16:24
196
原创 IO编程(2)
a.1970-1-1到现在的秒数。1)file.txt:文件名;2)./file.txt:路径。2)struct tm类型时间。3)char *字符串类型时间。b.一般用于时间计算相关逻辑。a.包含年月日时分秒信息。a.由时间拼接的字符串。2)读取目录文件中的。
2025-08-13 20:33:25
147
原创 IO编程(2)
2.库函数:是对系统调用的封装,可以在不同操作系统中安装并且使用,库函数最终还是要调用系统调用来完成对应功能;1.标准IO是有缓存的IO,文件IO没有缓存,适合于通信,硬件设备操作;1.系统调用:是Linux内核中的代码,只能在linux系统中使用;有三个特殊的文件描述符:标准输入(0)、标准输出(1)、标准错误(2)2.标准IO是库函数,文件IO是系统调用;文件描述符是有上限的,到达上限后再打开会报错误。取尚未被占用的最小的非负整数。2.系统调用与库函数。3.文件IO函数接口。
2025-08-12 19:59:16
172
原创 io操作文件
2. 二进制文件:文件中的所有内容均为数据对应的二进制形式存放(包含一些不能在界面上显的内容)ASCII码文件也是二进制文件,图片、音视频、压缩包均为二进制文件。1. ASCII码文件:文件中的所有内容均为能够在屏幕上显示的ASCII码字符程序、文本文件均为ASCII码文件。按块扫描信息的文件,称为块设备文件。按字符扫描信息的文件,称为字符设备文件。与终端建立的缓存一般为行缓存(stdin、stdout均为行缓存)2.c(character,字符设备文件)操作文件等价于操作文件指向的文件。
2025-08-11 22:26:33
690
原创 数据结构-二叉树
二叉树的编号(如果节点编号为n,左孩子编号:2n,右孩子编号为:2n+1)展开后是连续的,4)层:根节点的层数为一,后续每引申出的一个节点就在该节点层数加一;2)非线性结构:描述数据一对多(树),多对多(图)的关系;5)树的层数:由层数最高的节点对应的层数表示树的层数;3)后继(后辈):该节点后续可以访问到哪些节点;1)节点:组成树形结构的一个小的单元称为节点;2)前驱(祖先):由哪个节点可以访问到该节点;6)高度:由该节点到最远的叶子节点的距离。8)树的高度==树的深度==树的层数;
2025-08-07 19:56:34
271
原创 栈和队列111
(4)链表,栈和队列都是一种线性结构(一对一)(3) 栈只允许在栈顶位置入栈和出栈元素。(5)栈和队列只允许在指定位置插入元素和删除。(3)栈底:不允许入栈和出栈的一段称为栈底。(5) 出栈(弹栈):将栈顶元素取出。(2)栈顶:允许入栈和出栈的一段称为栈顶。(4)入栈(压栈):将元素放入栈顶位置。(2)栈和队列是一种特殊的表状结构。(4)入队:将元素放入队列末尾。概念:(1)链表可以在任意位置插入和删除元素。(1)顺序栈:a.增栈:栈的方向自低向高增长。(2)队头:出队的一段。(3)队尾:入队的一段。
2025-08-06 19:49:27
114
原创 数据结构-单向链表和双向链表
例如,在实现链表中间节点删除操作时,需要先找到要删除节点的前一个节点,然后调整指针来跳过要删除的节点。这种结构在某些操作上比单链表更具优势,比如在已知节点的情况下删除节点,双向链表可以直接通过前后指针进行操作,而单链表可能需要从头开始遍历。通过使用快慢指针的方法,让快指针每次移动两步,慢指针每次移动一步,如果链表存在环,那么快慢指针必然会相遇。- 链表的合并:合并两个有序链表时,需要比较两个链表当前节点的值,然后将较小值的节点添加到新链表中。- 在实现各种链表操作的过程中,我的编程思维得到了极大的锻炼。
2025-08-04 19:27:35
604
原创 数据结构-链表
存储结构:通过节点存储数据,每个节点包含数据和指向下一节点的指针。- 双链表:每个节点有两个指针,分别指向前一个和后一个节点。- 优点:插入和删除操作效率高,不需要移动大量元素。- 循环链表:最后一个节点指向第一个节点,形成循环。- 单链表:每个节点只有一个指向下一节点的指针。- 缺点:查找操作效率较低,需要遍历链表。- 使用结构体定义节点,包含数据和指针。- 包括数据的逻辑结构和物理存储结构。- 操作包括插入、删除、查找等。- 线性结构:如数组、链表等。- 非线性结构:如树、图等。
2025-08-04 01:09:35
239
原创 C语言-结构体-共用体-枚举-位运算符
枚举常量均为int类型,且第一个枚举常量的值默认为0,后续枚举常量的值总是前一个常量的值加1。返回值:成功返回申请堆区空间首地址,失败返回NULL。小端存储:内存低地址存放低数据位,内存高地址存放高数据位,内存小端。大端存储:内存低地址存放高数据位,内存高地址存放低数据位,内存大端。只申请空间,使用完毕后,不释放空间,导致可用空间越来越少,这样会产生内存泄露。功能:释放申请的堆区空间。让数据变大,等价于*2^n;让数据变小,等价于/2^n;移位运算符高于其余位运算符。1.malloc函数。
2025-07-30 21:16:14
256
原创 C语言-指针(完结)-构造数据类型
数组初始化也是关键内容,像 int a[5] = {1, 2, 3, 4, 5};从结构体的定义开始,如 struct student {...} 这种形式,我明白如何将相关的数据整合起来,便于处理复杂的数据场景。在二维数组方面, int a[2][3] = {{1, 2, 3}, {4, 5, 6}};2.void*转换成int*,char*,double*不用进行类型转换,直接赋值即可。3.char*,int*,double*转换成void*时,需要强制转换;数据类型2 成员变量2;
2025-07-29 21:22:08
258
原创 C语言-指针
int *a[5]:一个有五个元素,都是指针的数组,占40字节,每个元素都是int *型。int (*a)[5]:定义一个指针,占8字节,指针变量名为a,指向数组20个字节空间。int **q,定义一个指针变量q,占八个字节,指向一个指针变量空间。(2)对指针数组*:值不变,类型降级为指向数组第一个元素的指针;1,指针数组是每个元素都是指针的数组,数组指针是指向数组的指针。存放字符串数组使用二维字符型数组,操作字符串使用指针数组。存放字符串使用字符型数组,操作字符串使用指针。4.二维数组和数组指针的关系。
2025-07-28 20:12:13
117
原创 C语言-指针与数组
指针可以用于动态内存分配,例如 malloc() 、 calloc() 和 realloc() 函数。可以通过指针来访问数组元素,例如 *(p + i) 等价于 p[i]。有两种形式:指向 const 对象的指针和 const 指针本身。指针的加减运算实际上是根据指针所指向的数据类型的大小进行偏移。函数指针是指向函数的指针,可以用于回调函数等场景。间接访问运算符 * 用于访问指针所指向的变量的值。const 指针可以防止通过指针修改所指向的值。&a[1]=a+1;指针是一个变量,其值为另一个变量的地址。
2025-07-27 22:39:44
153
原创 嵌入式-指针
指针加1,移动的字节数取决于指针类型。例如,int*类型指针加1,移动4字节(假设int占4字节)。可以比较两个同类型指针的大小,常用于判断指针是否指向同一数组。指针变量有类型,存在指针类型(如int*、char*等)。地址是内存单元的编号(范围:0 - 2^32 - 1)。指针变量是存放地址的变量,指针变量是一种数据类型。两个同类型指针相减,结果是它们之间元素的个数。间接访问运算符(*):通过指针访问变量。可以将一个变量的地址赋给同类型的指针。取地址运算符(&):获取变量的地址。指针:存放地址的变量。
2025-07-25 20:30:28
175
原创 嵌入式学习日志(五)
代码执行超过变量作用域,回收变量空间。(3)字符串常量区(.rodata),区域中的内容不能修改,修改的话会导致错误。a.使用形式:函数名(实参1,实参2,。(2)全局变量:变量作用域在整个工程代码中,任意位置都可以使用。(1)局部变量:变量作用域在定义该变量最近的大括号内。(1)局部变量:执行到变量定义时,为变量开辟内存空间。(1)已初始化全局变量/静态变量区域(.data)(2) 未初始化全局变量/静态变量区域(.bss)(2)全局变量:编译时分配全局变量空间。b.变量从开辟空间到空间被回收的过程。
2025-07-24 22:28:26
463
原创 嵌入式日志(四)
(3)字符串常量区(.rodata),区域中的内容不能修改,修改的话会导致错误。a.使用形式:函数名(实参1,实参2);(2)全局变量:变量作用域在整个工程代码中,任意位置都可以使用。(1)局部变量:变量作用域在定义该变量最近的大括号内。(1)局部变量:执行到变量定义时,为变量开辟内存空间。(1)已初始化全局变量/静态变量区域(.data)(2) 未初始化全局变量/静态变量区域(.bss)a. 实参将值传递给形参,形参是实参的副本。b.变量从开辟空间到空间被回收的过程。a.作用域:能够使用变量的范围。
2025-07-23 22:31:28
146
原创 嵌入式学习日志(三)
(3)注意:字符串比较原则:从左到右依次比较字符,不相同的字符谁的ASCII码值大,字符串就大。1,字符串的拷贝:将字符串开头到\0中间的内容拷贝到目的空间。有序性:存放数据有序存放(先存第0行,再存第1行,...)(2).注意:拼接后的目的空间必须能够存放下拼接后的字符。存放字符串数组使用字符型数组的数组,即二维字符型数组。(1). strcpy:字符串拷贝函数。(1). strcat:字符串拼接函数。第一个字符串大于第二个字符串返回>0。第一个字符串小于第二个字符串返回<0。两个字符串相等返回0。
2025-07-22 22:54:37
145
原创 嵌入式学习日志
(5)维字符型数组;(4)二维字符型数组;(3)一维字符型数组;(2)二位整型数组;1.数组是一组相同类型有限数据的集合。(1)一维整形数组;以及对一维字符型数组进行练习;
2025-07-21 21:48:23
191
原创 嵌入式学习日志(一)
if后面必须加表达式,else后面不能加表达式 if可以脱离else单独使用,但是else不能脱离if单独使用 if和else不加大扩号默认控制一句代码,最好加上大括号。(1)关系运算符: 表达式只有两种值:1真、0假 为了避免 == 和 = 混淆,一般 == 常量放在左边。>大于 <小于 >= 大于等于 <= 小于等于 == 等于!if分支 实现判断逻辑,用if分支 同一类数据执行不同操作,用if分支。逻辑与左边为假,右边不再计算。顺序结构 分支结构 循环结构。
2025-07-18 20:25:46
146
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅