![](https://img-blog.csdnimg.cn/direct/aa1077421bac409fb33b74ef6eb0ef84.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
嵌入式软件开发
文章平均质量分 82
嵌入式软件开发
人工智能有点
个人学习笔记,总结。包括AI、Web、安全、嵌入式都略有了解和学习。
展开
-
【Linux系统编程(IPC)】无名管道,命名管道,消息队列,共享内存,信号,信号量,Socket
进程间通信:IPC(InterProcess Communication)微信的聊天也是属于进程间通信,是基于网络的。本篇的进程间通信基于单机的。A进程和B进程之间创建一个通道,A和B都能从中读写数据,这是真正意义上的进程间通信。进程间通信:● 单机版:A和B跑在同一个PC上● 多机版:A和B在不同的PC上(基于网络通信)进程间通信(IPC)的方式有:● 管道(无名管道和命名管道)● 消息队列● 信号量● 共享内存● Socket● Streams。原创 2024-03-30 23:35:06 · 980 阅读 · 0 评论 -
【Linux系统编程(进程编程)】exec族函数、system、popen
如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。如果 system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。execl函数就是,第一个参数是程序的path,最后一个参数是NULL。调用失败时,会设置errno并返回-1,然后从源程序的调用点接着往下执行。需求:实现功能,当父进程检测到输入为1时,创建子进程把配置文件的字段值修改掉。原创 2024-03-23 22:14:13 · 1038 阅读 · 0 评论 -
【Linux系统编程(进程编程)】进程的退出:父进程等待子进程的退出之僵尸进程与孤儿进程
对于三个终止函数(exit、_exit、_Exit),实现这一点的方法是,将其退出状态传递(exit status)作为参数传递给函数。建议使用exit,是对_exit或_Exit的封装,会对进程的缓冲区做些处理,而_exit或_Exit系统调用是直接退出。父进程不等待子进程退出,在子进程结束之前就结束了自己的“生命”,此时子进程叫做孤儿进程。Linux避免系统存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。这里父进程退出后,新的父进程的进程id为1468而不是1。原创 2024-03-23 21:57:41 · 718 阅读 · 0 评论 -
【Linux系统编程(进程编程)】创建进程的场景,fork和vfork的使用及区别
(1)一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待客户端的服务请求。当这种请求到达时,父进程调用fork,使子进程处理此请求。父进程则继续等待下一个服务请求到达。下边模拟一下网络请求,为每个请求创建一个服务进程。(现在还存在select poll epoll等IO多路复用技术,暂不展开)int main()pid_t pid;原创 2024-03-23 21:05:29 · 1087 阅读 · 0 评论 -
C语言的面向对象
教材中称,C语言作为底层的面向过程的语言,不是面向对象的。实际上,内核源码中就有的思想,个人觉得就是可以把其作为对象使用,利用结构体和函数指针便能实现,不同于其它高级程序设计语言的OOP三大特性(继承、封装、多态),C语言实现的结构体作为对象来说,具有的是OOP中的两个特性(封装、多态),而不具备继承。多年前大一上刚学习时,也不知道这些专业名词,什么是OO,什么是OOP。后来的经过深入的学习才知道,C语言也可以做到面向对象,只不过没有那么完美罢了。多态特性可以利用结构体中的函数指针的再次赋值实现。原创 2024-03-14 10:23:49 · 383 阅读 · 0 评论 -
【Linux系统编程(文件编程)】C语言利用标准库实现对文件操作的基本方法
因为还有系统级调用。标准库就是字面意识,更加标准,哪个机器上都能用,可移植性更强。这两个函数值得研究一番,尤其对于不理解参数的同学。原创 2024-03-05 13:22:37 · 395 阅读 · 0 评论 -
【系统编程】标准c库的文件操作与unix系统调用的文件操作
由此可以看出,内存“缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。使用fopen函数,由于在用户态下就有了缓冲,因此进行文件读写操作的时候就减少了用户态和内核态的切换(切换到内核态调用还是需要调用系统调用API:read,write);非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度快,由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。原创 2024-03-05 12:02:07 · 805 阅读 · 0 评论 -
C语言的结构体数据或整型数据写入文件
编码过程中,重点要注意光标位置的变化,否则容易读错数据或不小心覆盖有用数据。只要光标位置正确,读/写时,填入合适的数据长度大小,就能实现功能。区别不大,就是多了一个大小,将数据大小调整为数组的总长度就好了。原创 2024-03-05 11:35:05 · 914 阅读 · 0 评论 -
【Linux系统编程(线程编程)】讲讲线程的条件控制实现同步,顺便谈一谈线程死锁
在使用互斥变量、条件变量前都必须进行初始化,可以分别置为常量PTHREAD_MUTEX_INITIALIZER(只对静态分配的互斥量)、PTHREAD_COND_INITIALIZER(只对静态分配的条件变量),也可以通过调用pthread_mutex_init、pthread_cond_init函数进行初始化。这样,两个线程都想拿到对方手里的那把锁,谁都还不能解锁,导致线程死锁。让t1线程 中数据为3时打印信息,如果把下面程序中的条件和互斥量去掉,其实有可能打印不到,因为数据可能在其它线程中变化过去。原创 2024-02-29 21:52:00 · 834 阅读 · 0 评论 -
Linux使用C语言实现通过互斥锁限制对共享资源的访问
t1刚开始执行到while循环时候,就让它加锁,不让其它线程对共享资源访问【无论是否t2先执行,最终1s后都会轮到t1加锁,因为t2中释放锁后存在sleep函数,而t1没有】,循环一直执行,直到等到3 结束。为获取对共享资源的访问权限,t1线程是不断对全局变量访问,t2是做加法的时候才访问,而且加之后有1秒的延时。所以,t1肯定会先执行到3,即使t2先执行,也就执行一次,加一次就释放锁,t1还会拿到共享资源。运行结果:可以看到,在t1中顺利退出,说明对互斥锁对共享资源的限制起作用了。原创 2024-02-29 21:16:58 · 372 阅读 · 0 评论 -
Linux系统编程之线程互斥锁的使用方法
Linux系统编程,线程之互斥锁的创建,销毁,加锁,解锁。原创 2024-02-29 21:01:02 · 1015 阅读 · 0 评论 -
Linux上C语言如何获取线程的返回值
Linux 的 C 语言多线程环境中,启动例程通常指的是主线程(Main Thread)中的入口函数。在多线程程序中,主线程是程序的起点,它负责创建和管理其他线程,并在程序执行完成后终止整个进程。在这种情况下,调用 pthread_join 函数将等待指定的线程终止,但并不获得线程的终止状态。在多线程环境中,每个线程都有自己的例程,用于定义线程要执行的任务。总的来说,在 Linux 的 C 语言多线程环境中,启动例程指的是主线程的入口函数。函数是程序的入口点,当程序启动时,操作系统会调用。原创 2024-02-29 20:02:07 · 1206 阅读 · 0 评论 -
Linux系统上使用C语言创建线程
而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。原创 2024-02-29 19:26:34 · 1071 阅读 · 0 评论 -
Arduino程序怎么使用串口
Arduino Mega 有三个额外的串口:Serial 1使用19(RX)和18(TX),Serial 2使用17(RX)和16(TX),Serial3使用15(RX)和14(TX)。若要用它们来与外部的TTL串口设备进行通信,将TX引脚连接到您的设备的RX引脚,将RX引脚连接到您的设备的TX引脚,将GND连接到您的设备的GND。与计算机进行通信时,可以使用这些波特率:300,1200,2400,4800,9600,14400,19200,28800,38400,57600或115200。原创 2024-02-19 16:25:42 · 1309 阅读 · 0 评论 -
Arduino程序的运算符
在选择变量的数据类型时,一定要保证变量类型的范围要足够大,以至于能容纳下你的运算结果。要知道你的变量在哪个点会”翻身”,两个方向上都得注意.如: (0 - 1) 或 (0 - - 32768)一些数学上的分数处理,要用浮点数,但其缺点是:占用字节长度大,运算速度慢。使用类型转换符,例如 (int)myFloat 将一个变量强制转换为int类型。原创 2024-02-18 11:25:34 · 1052 阅读 · 0 评论 -
Arduino程序简单入门
在编译时编译器会用事先定义的值来取代这些常量。然而这样做会产生一些副作用,例如,一个已被定义的常量名已经包含在了其他常量名或者变量名中。在这种情况下,文本将被#defined 定义的数字或文本所取代。通常情况下,优先考虑使用 const 关键字替代 #define 来定义常量。Arduino 拥有和 C 相同的语法规范。语法#define 常量名 常量值 注意,#是必须的。例子。原创 2024-02-17 22:24:15 · 2266 阅读 · 0 评论 -
使用C语言自定义头文件,声明的变量或者函数用extern和不同extern修饰有什么区别?
在C语言中,当在头文件中声明变量或函数时,使用extern和不使用externexternexternexternexternexternextern总结来说,使用extern修饰变量或函数的声明表示其定义在其他源文件中,需要在使用的源文件中进行定义和实现。不使用extern修饰的变量或函数则表示其定义和实现在当前源文件中。原创 2023-09-01 15:10:02 · 1348 阅读 · 0 评论 -
【Linux系统编程(文件编程)】之复现cp指令、修改文件应用
open函数打开文件,打开成功返回一个文件描述符,打开失败,返回-1。原创 2023-07-14 12:12:27 · 238 阅读 · 0 评论 -
【Linux系统编程(文件编程)】之读、写文件、文件光标移动
文件指针是你在这个文件中所处的位置,进行读写操作的时候,都是从文件指针所在的位置开始。read() 从文件描述符fd,读取count个字节的数据,存到buf缓冲区。可以利用移动光标读文件。因为先写文件,后读文件,移动光标避免读不到。如果读取不到内容可能是光标的问题 重新打开或者移动光标。为正数则向后移动,反之负数向前移。函数用来统计字符串的长度,遇到。结束统计,即函数返回值不包括。write() 函数,将从。的返回值是4,这里要留意。是距离文件头的字节数。原创 2023-05-24 21:52:20 · 789 阅读 · 0 评论 -
【Linux系统编程(文件编程)】之创建、打开文件
linux下,一切皆文件。学好对文件的操作是很重要的,会在日常工作当中频繁使用。如何下Linux下使正确使用函数(使用LinuxC系统函数的正确姿势)?正确使用分为两部分:导入对应库 & 按照标准格式调用函数第一步,导入对应库方法之一是利用man手册查询,前提是你要知道函数名字。根据名字查到对应文档,文档中会有该函数的详细信息提供给你。第二步,按照标准格式调用函数根据第一步的文档,在你写的程序中,结合自己的参数。要保证参数个数、类型是否符合需求。返回值根据需求可自行决定。原创 2023-05-24 16:36:59 · 1958 阅读 · 0 评论 -
Linux系统 Ubuntu18.04安装的详细教程(提供18.04ubuntu镜像)
linux Ubuntu1804镜像下载安装、共享文件夹设置。文件下载:链接:https://pan.baidu.com/s/12bEdRBwO1YbLt23QKnrSrA提取码:h7as。原创 2023-01-01 21:00:01 · 5527 阅读 · 2 评论 -
C语言分文件编程 linux操作系统树莓派
分文件编程:模块化的编程思想好处:功能责任划分明确方便调试主程序简洁include头文件 用<> 默认去/usr/local/include找头文件include头文件 用"" 在当前目录找头文件,找不到就去默认目录找,找不到就报错。测试文件:main.c:#include <stdio.h>#include "touwenjian.h"int main(){ hello(); //调用"touwenjian.h"中的函数原创 2020-08-02 15:39:28 · 347 阅读 · 1 评论 -
树莓派登录的4种方式
树莓派登录有多种方式:HDMI方式,串口,SSH,windows远程桌面。一、外接设备登录:HDMI视频线 连接到显示器或电视机。二、串口登录(详细):三、通过网络登录树莓派四、图形方式登录树莓派...原创 2020-09-26 12:23:54 · 3666 阅读 · 0 评论 -
树莓派刷机(镜像下载并导入SD卡)
一、安装Win32DiskImager。Win32DiskImager是格式化SD卡并安装镜像的工具。下载方式一:官网下载 下载地址下载方式二:百度网盘下载 提取码:2q2s。打开Win32DiskImager,选择好镜像安装路径,安装步骤就是傻瓜式操作,一直点击next。二、下载树莓派镜像下载方式一:镜像可以去树莓派官网进行下载。下载方式二:百度网盘下载 提取码:n3ft三、导入镜像到SD卡1.SD卡插入电脑,打开Win32DiskImager。2.Device选择你插入的读卡器,此电原创 2020-09-24 22:16:17 · 4615 阅读 · 2 评论