- 博客(36)
- 收藏
- 关注
原创 线程(三) 线程的互斥
本文介绍了线程中的互斥机制。互斥是确保同一时间只有一个线程执行特定代码段,防止多个线程同时修改共享资源。解决方式包括使用条件变量、线程信号量等。示例展示了在多线程环境下操作共享账户的风险,通过互斥锁可以有效避免数据不统一的问题。文章还详细解释了互斥锁的创建、销毁以及上锁和解锁的方法,以及读写锁的创建和使用。同时介绍了为什么要使用读写锁,读写锁的应用场景等
2024-09-21 18:25:51 1418
原创 线程(二) 线程清理和控制、线程的属性
本文主要介绍了线程的清理和控制函数,包括`pthread_cleanup_push`和`pthread_cleanup_pop`。这些函数允许在线程退出时执行特定的清理任务,通过注册和撤销清理处理程序来管理资源。文章还比较了进程和线程的创建、退出、资源回收和终止方式,并详细介绍了线程属性的初始化和销毁,特别是如何设置和获得分离属性以实现线程资源的自动释放。
2024-09-18 17:08:58 710
原创 线程(一) 线程的分类、创建、终止
本文主要介绍了线程的基本概念、创建和终止方法。线程是程序执行的最小单位,负责处理进程中的某个事务。文章详细解释了线程与进程的关系,以及如何通过`pthread_create`函数创建线程和`pthread_exit`或`pthread_cancel`函数终止线程。同时,还讨论了线程同步和互斥的重要性,以及如何在多线程环境中管理资源。最后,通过示例代码展示了线程的创建、运行和终止过程。
2024-09-18 17:02:17 968
原创 进程之信号
本文详细介绍了Linux系统中的信号机制,包括信号的概念、来源、处理方式以及相关函数。信号是进程间通信的一种方式,可以用于中断进程的执行或改变其状态。文章解释了硬件中断和软件中断的区别,并指出信号是一种软件中断。信号的来源可以是硬件操作(如按下键盘)或软件操作(如系统调用)。信号的处理方式有三种:忽略信号、执行默认操作和捕获信号。文章还介绍了signal函数及其使用方法,以及如何使用kill和raise函数发送信号。以及最后的alarm和setitimer来设置定时器的函数
2024-09-17 09:27:16 743
原创 进程相关的系统调用
本文介绍了进程相关的系统调用,包括`wait`、`waitpid`和`exec`族函数。`wait`函数用于等待子进程退出并回收资源,防止僵尸进程的产生。`waitpid`函数可以等待指定的子进程退出并提供更多选项,如非阻塞模式和检测子进程暂停状态。`exec`族函数用于在子进程中执行其他程序,替换当前进程的代码段、数据段、堆和栈。通过这些系统调用,可以实现父子进程间的通信和资源共享,提高程序的功能性和可扩展性。
2024-09-17 09:21:26 650
原创 进程状态、进程创建和进程分类
这篇文章详细介绍了进程的基本概念、状态及其管理。首先,解释了程序与进程的区别,并展示了如何通过`ps`指令查看进程信息。接着,文章深入探讨了进程的生命周期,包括创建、执行、终止等过程,以及进程间通信(IPC)的机制。此外,还讨论了进程调度策略和虚拟内存的管理,强调了分时操作系统中时间片的概念。最后,文章通过示例代码演示了如何使用`fork`函数创建子进程,并分析了父子进程之间的关系和属性继承情况。
2024-09-16 14:42:03 909
原创 进程启动和进程终止
本文详细介绍了进程的基本概念、创建、管理和终止过程。首先,解释了程序与进程的区别,强调进程是程序的运行实例,具有独立的权限和职责。接着,介绍了如何通过`ps`命令查看系统中的进程信息,并详细讨论了进程ID及其在Linux系统中的重要性。进一步,文章深入探讨了进程表项的内容及其在虚拟内存中的分布。此外,还分析了C程序的启动过程,包括预处理、编译、汇编和链接四个步骤,以及启动例程的作用。最后,讨论了进程的终止方式,包括正常终止和异常终止,并通过示例展示了不同终止方式对资源释放的影响。
2024-09-16 14:38:32 543
原创 make和Makefile
本文介绍了如何使用Makefile和make工具来管理编译过程,提高软件开发效率。通过将编译指令写入Makefile,可以自动执行编译、链接等操作,避免了手动输入大量命令的繁琐。文中还介绍了Makefile的基本编写规则,包括目标、依赖项和命令列表,并展示了如何利用变量和内置变量简化Makefile的内容。最后,通过一个实际例子演示了Makefile的使用方法和注意事项。
2024-09-01 20:29:43 1281
原创 静态库和共享库
本文介绍了库的概念、函数库和库函数,以及静态库与共享库(动态库)的创建与使用。静态库在程序链接时将所用函数代码复制到可执行文件中,使得文件较大但运行时无需额外文件。共享库则在运行时加载所需函数,导致可执行文件更小,但依赖动态库的存在。创建静态库使用`ar`工具,而创建共享库则用`gcc -shared`。使用这些库时,需在编译命令中指定库的路径和名称。静态库删除后不影响已生成的可执行文件运行,但删除共享库会导致依赖它的可执行文件无法运行。
2024-09-01 20:25:34 984
原创 Linux文件编程(进阶)
本文介绍了Linux文件编程中的文件操作基本元素,包括目录结构、索引节点和文件数据。同时详细解释了软链接和硬链接的原理、创建方式以及它们在不同情况下的表现。文章还提供了使用link、unlink、remove、rename、symlink和readlink等函数的代码示例,展示了如何在C程序中操作这些链接。
2024-08-26 18:23:56 738
原创 Linux文件编程(进阶)
Linux文件编程涉及内核数据结构、重定向、文件描述符操作和I/O处理方式。内核通过文件描述符表、文件表项和i节点来管理文件。重定向包括输入重定向、输出重定向和追加输出重定向,使用``, `>>`符号实现。`dup2`函数用于复制文件描述符,常用于文件重定向。`fcntl`函数允许对已打开的文件描述符进行多种操作,如复制文件描述符、获取或设置文件描述符标志等。此外,还介绍了如何使用`O_APPEND`标志位保证原子操作。
2024-08-26 18:21:13 1033
原创 Linux文件编程(系统API调用)
Linux文件编程涉及输入输出缓存、系统调用和文件操作。输入输出缓存类型包括全缓存、行缓存和无缓存,通过`fflush`函数可强制清空缓存。文件I/O系统调用如`open`, `read`, `write`, `lseek`等不带缓存功能,而标准C库函数如`fgets`, `fputs`, `fprintf`等提供带缓存的文件访问。文件描述符是系统调用中用于标识文件的非负整数,与标准输入、输出、错误相关联。文件指针和文件描述符可相互转换。此外,还介绍了如何实现cp操作的代码示例。
2024-08-26 18:15:27 1034
原创 一个C程序变为一个可执行程序的过程
C程序变为一个可执行程序的过程主要包括预处理、编译、汇编和链接四个步骤。在预处理阶段,头文件被展开,宏定义被替换,条件编译指令得到处理,并移除注释。编译阶段涉及词法分析、语法分析和语义分析,优化代码,并生成汇编语言代码。汇编阶段将汇编代码转换为机器指令,生成目标文件。链接阶段合并段表信息,解析符号引用,分配虚拟地址,并最终生成可执行文件。整个过程需要借助工具如GCC编译器,通过特定命令实现各阶段的处理,如预处理使用`gcc -E`,编译使用`gcc -S`,汇编使用`gcc -c`,链接则直接使用`gcc`
2024-08-21 15:01:40 920
原创 orangepi zeor2 3.0.6版本的镜像关机或者重启被卡住的问题
在处理Orange Pi Zero2板子时,发现系统重启或关机偶尔会卡住,不能正常重启或关闭。问题可能与系统的镜像文件有关。解决方法包括替换一个特定的`.dtb`设备树文件。首先,从提供的链接下载替换文件并解压。使用MobaXterm或Filezilla将文件传输到Orange Pi Zero2。通过SSH查找原`.dtb`文件位置,它通常位于`/boot/dtb-5.16.17-sun50iw9/allwinner/`目录下。备份原有文件,然后将下载的文件复制到该目录并重启板子测试是否问题解决。多次测试后
2024-08-21 14:55:01 549
原创 链表的增删改查以及动态链表的创建
链表,作为一种基础且重要的数据结构,在计算机科学领域中占据着举足轻重的地位。其本质是由一系列节点组成,每个节点不仅存储着数据元素,还包含指向下一个节点的指针。这种结构使得链表在插入和删除操作上展现出高效的性能,因为这两种操作仅需改变相邻节点的指针即可。然而,访问链表中的特定元素则需从头部开始逐个节点遍历,导致访问速度较慢。因此,链表在实现时需要在操作效率和数据访问速度之间做出权衡。此外,链表还有多种变体,如单链表、双链表以及循环链表等,各自具有独特的特点和适用场景。总之,链表以其灵活的结构和高效的操作性能,
2024-07-28 21:55:52 322
原创 keilC51和keil MDK共存 使用vs code对51单片机进行开发
关于如何在Windows环境下安装和配置Keil软件的C51和MDK版本的教程。首先,作者从网盘下载了包含所需工具的安装包并解压。然后详细描述了如何安装MDK版本,包括安装路径选择、协议同意、固件包安装等步骤。接下来,作者讲述了如何将C51版本的文件添加到MDK中,并进行了相应的配置。此外,还提到了如何激活软件,安装了STM32F1系列的固件包,并验证了是否可以正常编译C51和STM32的工程。还介绍了如何使用VS Code作为代码编辑器,通过安装必要的插件来提高编码体验,
2024-07-27 17:42:44 1338
原创 Linux网络编程
如果accept函数成功接受一个连接请求,它会返回一个新的套接字描述符,这个新的套接字用于与客户端进行数据传输。例如常见的微信就是基于网络来进行通信的,通过网络通信来进行信息发送、语音通话、视频通过等操作,极大的提高了通信的实时性。,但是通过对其通信方式的编程都是基于在一台电脑上执行的,但是这极大地局限了通信的方式。所以当从一台主机将数据传送到网络上,然后又从网络将数据传送到另一台主机上时就会涉及到数据的转换,要不然就可能导致数据的不正确。连接传送的数据,无差错,不丢失,不重复,且按序到达;
2024-06-22 23:19:12 879
原创 Linux线程
线程是属于进程的,线程运行在进程空间内,同意进程产生的进程共享同一用户内存空间,当进程退出时该进程产生的线程都会被强制退出并清除。当进程创建起来的时候默认只有一个线程(主线程),此时如果遇到大并发的请求,那么一个线程的处理效率就不够,需要创建其他的线程(子线程)来处理新的请求,这样能提高程序的执行效率。的值为1,然后休眠一秒,此时可能子进程2抢占到了CPU,继续接着之前的代码执行,子进程2尝试去上锁,但此时这把锁已经被子进程1获取,所以子进程2就被阻塞,继而接着去执行子进程1的程序,直到子进程检测到。
2024-03-21 19:44:36 997
原创 Linux编程之进程
什么是程序,什么是进程?简单的来说,没有跑起来的文件叫做程序(是静态概念),例如调用gcc test.c -o test 生成的这个test文件,它就是一个程序,当这个程序跑起来就是进程(动态概念)。进程是程序的一次执行,也就是说每执行一次程序,它就会生成一个新的进程。如何查看系统中有哪些进程?由于当前的程序时非常多的,所以我们要使用grep指令进行筛选,例如:查看当前进程中带有 “init” 字样的进程什么是进程标识符?每个进程都有一个唯一非负整数表示它的进程标识符(类似于之前的文件描述符),用pid
2024-01-22 15:11:50 993
原创 Linux进程间通信
它是基于文件系统的共享文件,提供了一种机制,用于连接一个读进程和一个写进程,从而实现它们之间的信息传递。由以上结果可知,当当前路径下没有创建管道的时候,编译执行代码没有问题,但是如果当前文件下已经有了名字相同的管道就会报错文件已存在,所以对代码进行修改:当当前路径下有名字相同的管道不报错。需要注意的是,信号是异步的,即发送信号的进程和接收信号的进程之间没有直接的通信机制。当函数执行成功时,会返回一个key_t类型的键值,该键值是一个整数,与指定的文件的索引节点号和子序列号有关。否则,它将返回-1。
2024-01-22 10:16:28 1028
原创 Linux文件编程
文件描述符:在打开或者创建一个文件时,会返回一个文件描述符给用户。文件描述符是一个非负整数,相当于文件的索引。后续的read、write、lseek等操作都是基于文件描述符,所以当文件打开失败,后续的操作无法进行。
2023-10-22 09:05:02 142 1
原创 C语言回顾笔记
什么是程序:算法+数据结构=程序程序怎么来:什么是计算机语言:机器语言:意思是机器交流所用的语言,即0 1数据符号语言:汇编高级语言:人编程所用的语言(if else continue break)开发环境(IDE):VS code、VS studio、notepad++、devC++、啊哈C、vc6.0等等开发环境搭建:VS code和notepad++都没有内置的编译器,需要安装gcc编译工具C语言的最小框架:数据的第一种表现形式变量:顾名思义就是它的值可以改变,其中要注意以下几点:其中变量类型可以
2023-07-08 21:26:30 349 1
原创 IIC协议
IIC (I2C,Inter-Integrated Circuit)即集成电路总线,是一种两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。多用于主机和从机在数据量不大且传输距离短的场合下的主从通信。I2C总线由数据线SDA和时钟线SCL构成通信线路,既可用于发送数据,也可接收数据,是一种半双工通信协议。总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。SDA 是串行数据线,由于 I2C器件一般采用开漏结构与总线相连,所以SCL 和 SDA 均需接上拉电阻。
2023-04-29 15:14:17 2217
原创 非标协议外设
LCD1602(Liquid Crystal Display) 是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两行)引脚接口说明第 1 脚: VSS 为电源地第 2 脚: VDD 接 5V 正电源第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”, 使用时可以通过一个 10K 的电位器调整对比度。第 4 脚: RS 为寄存器选择,高电平时选择数据寄存器、 低电平时选择指令寄存器。第 5 脚。
2023-04-19 22:40:19 116
原创 51单片机之串口
EC03-DNC是亿佰特推出的 LTE CAT1 数传模块产品, 该产品软件功能完善, 覆盖绝大多数常规应用场景, EC03-DNC 是为实现串口设备与网络服务器,通过网络相互传 输 数 据而 开 发 的 产 品 , 该 产 品 是 一 款 带 分 集 接 收 功 能 的LTE-FDD/LTE-TDD 无线通信数传模块, 支持 LTE-FDD , LTE-TDD 网络数据连接, 用户只需通过简单的设置, 即可实现串口到网络服务器的双向数据透明传输。
2023-04-12 17:42:47 1033
原创 第二章 定时器
C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器或者计数器使用。确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时,每经过1个机器周期,计数存储器的值就加1。而当配置为计数器时,每来一个负跳变信号(信号从P3.4 或者P3.5引脚输入),就加1,以此达到计数的目的。标准C51有2个定时器/计数器:T0和T1。他们的使用方法一致。C52相比C51多了一个T2。
2023-03-07 10:38:02 495
原创 51单片机
>会提示是否拷贝STARTUP.A51,选择是->生成了工程目录->在工程目录Source Group1上右键鼠标->add Exiting file to Source Group1...->选择代码文件main.c。3. 进入keil主页面,工具栏project->new uVision project->选择第一步的工程文件夹位置->输入工程名字->选择芯片类。4. 编程,新手如果看不懂以下代码,可以忽略,这次实验只是强调开发流程。编程练习:点亮一个灯并使它闪烁。编程练习:用震动传感器控制灯。
2023-02-19 17:04:27 188
sai绘图软件(Q版插图,动漫绘图)
2023-04-12
绘制流程图-Draw io
2023-04-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人