- 博客(27)
- 收藏
- 关注
原创 嵌入式学习---DAY27:信号量、进程间的通信
信号量(semaphore)是操作系统用来解决并发中的互斥和同步问题的一种方法。信号量 (个数) --- 反映的是资源的数量信号量的分类:信号无名量 ==》线程间通信有名信号量 ==》进程间通信1.信号量的定义 (为全局变量)sem_t semsem_t:信号量的类型,sem:信号量的变量例如: sem_t sem_w;2.信号量的初始化功能:将已经定义好的信号量赋值。参数:sem 要初始化的信号量,pshared = 0;表示线程间使用信号量,!=0;
2024-08-16 19:56:19
943
原创 嵌入式学习---DAY26:线程---锁
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。当多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前进,这种情况就是死锁。很显然,如果没有外力的作用,那么死锁涉及到的各个进程都将永远处于封锁状态。
2024-08-15 20:53:40
364
原创 嵌入式学习---DAY25:线程
进程的产生 ----- fork线程 --- 轻量级的进程 进程 --- 重量级的进程线程 成为 CPU执行的最小单位 ,进程 成为 资源分配的基本单位线程 创建 和 调度 时空开销都比进程小线程组成:线程tid //thread ,程序计数器 ,寄存器集合,栈线程与进程的关系:线程 是 存在于 进程中的线程 共享了进程的资源 (代码段,数据段,打开一些文件,信号等)线程结束,不一定导致进程结束线程的编程 :类似与进程过程。
2024-08-14 20:01:23
842
原创 嵌入式学习---DAY24:进程--二
用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。
2024-08-13 20:26:30
1093
原创 嵌入式学习---DAY23:进程
进程:(进行中的程序)--正在运行的程序 (动态的) ---内存程序的一次执行过程进程是程序的一个实例进程是跑起来的程序,一个程序可以对应多个进程。程序----静态---硬盘 进程---动态---内存操作系统为了管理程序的动态运行过程----进程程序 = 代码(代码区) + 数据(栈区,堆区,字符串常量区,静态区)进程 = PCB(进程控制块) + 进程实体(text | data | bss | 堆区 | 栈区)
2024-08-12 21:08:15
854
原创 嵌入式学习---DAY22:文件属性的获取
功能:根据用户id到/etc/passwd文件下解析获得结构体信息参数:uid:用户id返回值:成功返回id对应用户的信息,失败返回NULL。
2024-08-08 19:34:57
1129
原创 嵌入式学习---DAY21:文件属性,目录
功能:获得一个文件流指针中的文件描述符参数:stream:文件流指针返回值:成功返回文件描述符,失败返回-1功能:将文件描述符转化为文件流指针参数:fd:已经打开的文件描述符和转之前的fd类型一致返回值:成功返回文件流指针,失败返回NULL。注:没有特殊要求关闭文件用调用度高的。read函数使用是将文件看作二进制,不含'\0',所以正常读的数据要比整体数据少一个,留一个位置放'\0',而fgets()函数自带'\0'。
2024-08-07 20:14:04
840
原创 嵌入式学习---DAY20:缓冲区和文件IO
feof 检测文件是否到达结尾feof() 函数判断int feof(FILE *stream);功能:判断当前参数stream的文件流指针是否到达文件结尾。如果到达文件结尾则返回真,否则返回假。注意:该操作一定要在一次IO操作之后判断。参数:stream 要判断结尾的文件流对象返回值:成功到达结尾是 真 否则 是假ferror 检测一个流是否出错。
2024-08-06 20:46:23
1401
原创 嵌入式学习---DAY18:shell脚本
shell脚本是一系列shell命令的集合。shell 命令解释器shell编程:解释型语言、边翻译边执行、擅长文件处理,操作系统管理、开发效率高 cp 1 2、执、效率低、移植性好C语言:编译型语言、先编译再执行、擅长数据计算和数据处理、开发效率低、执行效率高、移植性差。
2024-08-03 19:22:32
844
原创 嵌入式学习---DAY16:结构体
声明一个结构体类型:struct 结构体名. 结构体成员运算符 一级 自左向右-> 指向结构体成员运算符 一级 自左向右(*s). id s->id,看左边为指针还是变量,指针就可以写为s->id上面输出也可改为s->id, s->score, s->name结构体对齐原则1、结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;
2024-08-01 19:25:36
548
原创 嵌入式学习---DAY15:数组指针、函数指针、指针数组和指向指针的指针(难点)
第二行的含义为指向一个长度为10一维整型数组。它的sizeof(p)为8。对于数组指针而言,如果指向为二维数组,它的p+ 1为表示到下一行。以下为二维数组求每一行的平均值。
2024-07-31 19:42:16
666
原创 嵌入式学习---DAY14:深入了解指针
用指针*begin来表示数组的首元素地址。用指针*end代表数组最后一个元素的地址。用迭代器实现二分查找用迭代器实现选择排序。
2024-07-30 20:53:41
608
原创 嵌入式学习---DAY13: 指针
如果有一个数组a [ ] = {1,2,3,4,5,6,7,8,9,0},int *p = a,p = p + 1;执行完毕后p的地址为a[1]的地址,打印*p为a[1]的值2。倘若不是数组,进行p + 1 ,结果为在该地址向后偏移了sizeof(基类型)。如果传的是地址则可以进行修改,所以产生了指针的用法,一个变量的地址称为该变量的“指针”。6.函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。由此,我们也可以用指针来写出数组的一系列的代码,如排序,二分查找等。基类型 * 指针变量名。
2024-07-29 18:19:08
409
原创 嵌入式学习--DAY12:标识符的作用域与可见性、预处理命令
分为不带参数的宏定义和带参的宏定义。不带参的宏定义 带参数的宏定义#define 标识符 字符串 #define 宏名(参数表) 字符串在预处理阶段将宏名替换为具体数值。要加够括号防止出现错误。带参宏定义效率高于函数。宏定义后不加“;
2024-07-27 17:39:27
913
原创 嵌入式学习--DAY11:数组作为函数参数
一维数组被调函数形参应为(int a [ ], int len);需要其他的再进行添加。三大排序主函数。
2024-07-26 19:17:33
193
原创 嵌入式学习--DAY10:函数的调用
1.在定义函数中指定的形参,在未出现函数调用时,它们并不占用内存中的存储单元,只有在发生函数调用时,函数中的形参才会被分配内存单元。在调用结束后,形参所占的内存单元也会被释放。2.实参可以是常量、变量或表达式。在被定义的函数中,必须指定形参的类型,实参与形参的类型应当相同或赋值兼容。3.实参向形参的数据传递是“值传递”,单向传递,只能有实参传给形参。函数的形参相当于实参的复制,对形参进行修改不会对实参产生影响。解决办法为传地址。4.无法在被调函数中修改主调函数的参数。5.函数传参默认自右向左。
2024-07-25 18:55:24
1031
原创 嵌入式学习--DAY9:二维数组与函数
二维数组定义一般形式为:类型说明符 数组名[常量表达式][常量表达式]例如 int a[3][4];表示为3(行)*4(列)的数组。二维数组元素的表示形式为:数组名 [下标][下标]数组名不可以整体赋值。以下代码为给二维数组进行赋值并打印出结果。求出二维数组的所有项之和。行数:rows = sizeof(a) / sizeof(a[0]);列数:cols = sizeof(a[0]) / sizeof(a[0][0]);上式三者都代表数组的首元素地址,三者值相等。
2024-07-24 18:57:01
415
原创 嵌入式学习--DAY8:字符数组
用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。基本形式为: char s[100] = "Hello world!'\0'代表结束字符,不是一个可以显示的字符。如果一个字符串前面九个字符都不是(‘\0’),而第十个为‘\0’,则此字符的有效字符为9个。相当于此字符串在内存中占用了十个字节,最后一个字节‘\0’是系统自己加上的。在程序中往往用‘\0’来判断字符串是否结束。用printf()输出字符串时,它的输出项是字符数组名,而不是数组元素名。
2024-07-23 19:05:27
362
原创 嵌入式学习----DAY7:数组
一维数组的定义方式为类型说明符 数组名 [常量表达式0例如:int a[10] 定义了一个整型数组,数组名为a,此数组有10个元素。说明:1.数组名的命名规则和变量名相同,遵循标识符命名规则。2.在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。3.用变量当元素个数时,不能进行初始化。4.数组的数组名代表数组中的首元素地址。例如: printf ("%p\n",&a[0]);和printf ("%p\n",a);二者相等。
2024-07-22 19:02:51
226
原创 嵌入式学习---DAY4: 输入与输出
1.给表达式后加上“;”变为语句。用“{}”把语句框起来变为复合语句2.所谓输入输出是以计算机主机为主体而言的。从计算机向外部输出设备(如显示器、打印机等)输出数据称为输出,从输入设备(如键盘、鼠标、扫描仪等)向计算机输入数据称为输入。
2024-07-18 20:06:58
281
原创 嵌入式学习---DAY3:赋值运算符
int i = 10;初始化i = 10;赋值以下为一些基础运算符分为单目、双目、多目运算符,与其操作数有关,有几个操作数则是几目运算符。任何表达式都有数据类型,与打印结果类型相同。在运算编译过程中,编译器只做类型检查,在进行除法运算时,如果除数为零不报错,但是在运行过程中会出现错误。特说明求余(%):左右必须为整型或与整型相兼容,结果的正负与左操作数有关,与右无关。函数:long int random (void);类型 函数名 形参(返回值)(标识符)
2024-07-17 19:12:29
242
原创 嵌入式学习---DAY2:数据类型
如果为有符号整型,首位为符号位,正负决定首位,0为正1为负,正数就写出其对应的原码,如果为负数,则将该数取绝对值,将该绝对值取反加一。阶码 8bit 将十进制数化为二进制,在变为科学计数法,得到其指数加127,该数的二进制为阶码。例:int i = 654321,先化为十六进制9FBF1,小端存储为:F1 FB 09 00。整型在内存中的实际存放情况,分为大端和小端,小端存储末尾对应小地址,大端末尾对应大地址。十进制:日常生活所用的,如123,1,202。
2024-07-16 18:44:33
554
原创 嵌入式学习---DAY1:Linux基础指令
vim编辑器 进入为命令模式,按i可切换为插入模式,命令模式可进行复制(yy),粘贴(p),剪贴(dd),需要剪贴或复制几行则在其前加入对应的数字,按o可以插入空白行并转换到插入模式,O在前插入,o在后插入。cp 复制 复制在前,被复制在后 例如将a复制到b,cp a b,如果复制为文件夹,则需要在其后加上-r 表示将该目录下所有文件复制。bit---比特 byte----字节 1byte=8bit。绝对路径 包含有根目录信息的目录表示方法。
2024-07-15 18:57:58
366
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人