【嵌入式Linux应用开发基础】read函数与write函数
目录
一、read 函数
1.1. 函数原型
1.2. 参数说明
1.3. 返回值
1.4. 示例代码
二、write 函数
2.1. 函数原型
2.2. 参数说明
2.3. 返回值
2.4. 示例代码
三、关键注意事项
3.1 部分读写
3.2 错误处理
3.3 阻塞与非阻塞模式
3.4 数据持久化
3.5 线程安全
四、嵌入式场景应用
4.1. 文件数据读写
场景:嵌入式系统中的应用程序常常需要从配置文件中读取参数,以此来初始化系统。例如,网络设备的配置文件包含 IP 地址、子网掩码、网关等信息,应用程序需要读取这些信息来完成网络配置。代码示例
4.2. 设备驱动交互
4.3. 进程间通信(IPC)
4.4. 网络通信
五、常见问题
5.1. read函数常见问题
5.2. write函数常见问题
5.3 通用建议
六、总结
在嵌入式Linux应用开发中,read
和write
函数是文件I/O操作中最基础、最常用的两个系统调用。它们用于从文件描述符(file descriptor)指向的文件或设备中读取数据和向其中写入数据。
一、read
函数
1.1. 函数原型
#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);
1.2. 参数说明
fd
:文件描述符,由open
函数返回的一个非负整数,用于标识要读取数据的文件、设备等。buf
:指向用于存储读取数据的缓冲区的指针,数据将被读取到这个缓冲区中。count
:期望读取的字节数,即希望从文件描述符对应的文件或设备中读取的最大字节数。
1.3. 返回值
- 大于 0:表示实际成功读取的字节数。
- 等于 0:表示已经到达文件末尾(EOF),没有更多数据可供读取。
- 等于 -1:表示读取操作失败,此时
errno
会被设置为相应的错误码,用于指示具体的错误原因。
1.4. 示例代码
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>int main() {int fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("open");return 1;}char buffer[100];ssize_t bytesRead = read(fd, buffer, sizeof(buffer) - 1);if (bytesRead == -1) {perror("read");close(fd);return 1;}buffer[bytesRead] = '\0'; // 确保字符串以NULL结尾printf("Read %zd bytes: %s\n", bytesRead, buffer);close(fd);return 0;
}
二、write
函数
2.1. 函数原型
#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);
2.2. 参数说明
fd
:文件描述符,标识要写入数据的文件、设备等。buf
:指向包含要写入数据的缓冲区的指针。count
:要写入的字节数,即希望将缓冲区中多少字节的数据写入到文件描述符对应的文件或设备中。
2.3. 返回值
- 大于 0:表示实际成功写入的字节数。
- 等于 0:通常表示没有写入任何数据,可能是由于某些特殊情况(如文件系统已满但还未返回错误)。
- 等于 -1:表示写入操作失败,
errno
会被设置为相应的错误码,用于指示具体的错误原因。
2.4. 示例代码
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>int main() {int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);if (fd == -1) {perror("open");return 1;}const char *message = "Hello, World!\n";ssize_t bytesWritten = write(fd, message, strlen(message));if (bytesWritten == -1) {perror("write");close(fd);return 1;}printf("Written %zd bytes\n", bytesWritten);close(fd);return 0;
}
三、关键注意事项
3.1 部分读写
-
原因:数据未就绪(如网络)、资源限制(如管道缓冲区满)、信号中断等。
-
处理方式:循环调用函数,直至完成全部数据传输。
示例代码(读操作):
ssize_t total_read = 0;
while (total_read < count) {ssize_t n = read(fd, buf + total_read, count - total_read);if (n == 0) break; // EOFif (n < 0 && errno != EINTR) break; // 非中断错误if (n > 0) total_read += n;
}
3.2 错误处理
-
常见
errno
值:-
EAGAIN
/EWOULDBLOCK
:非阻塞模式下无数据可读或写缓冲区满。 -
EINTR
:操作被信号中断。 -
EBADF
:无效文件描述符。
-
-
处理建议:
-
对
EINTR
需重试操作。 -
对非阻塞I/O的
EAGAIN
需结合select
/poll
等待就绪。
-
3.3 阻塞与非阻塞模式
-
设置非阻塞模式:
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
3.4 数据持久化
-
立即同步:调用
fsync(fd)
强制将内核缓冲区数据写入存储设备。
3.5 线程安全
-
多线程操作同一文件描述符需加锁(如
pthread_mutex
)。
四、嵌入式场景应用
4.1. 文件数据读写
①配置文件读取
-
场景:嵌入式系统中的应用程序常常需要从配置文件中读取参数,以此来初始化系统。例如,网络设备的配置文件包含 IP 地址、子网掩码、网关等信息,应用程序需要读取这些信息来完成网络配置。
-
代码示例
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#define BUFFER_SIZE 1024int main() {int fd = open("config.txt", O_RDONLY);if (fd == -1) {perror("open");return 1;}char buffer[BUFFER_SIZE];ssize_t bytes_read = read(fd, buffer, BUFFER_SIZE);if (bytes_read == -1) {perror("read");} else if (bytes_read > 0) {buffer[bytes_read] = '\0';// 处理读取到的配置信息}close(fd);return 0;
}
②数据文件写入
- 场景:在数据采集系统中,需要将采集到的数据存储到文件中,以便后续分析和处理。比如,温度传感器每隔一段时间采集一次温度数据,应用程序将这些数据写入到文件中。
- 代码示例
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>#define DATA "25.5"int main() {int fd = open("data.txt", O_WRONLY | O_CREAT | O_APPEND, 0644);if (fd == -1) {perror("open");return 1;}ssize_t bytes_written = write(fd, DATA, strlen(DATA));if (bytes_written == -1) {perror("write");}close(fd);return 0;
}
4.2. 设备驱动交互
①传感器数据读取
- 场景:嵌入式系统通常会连接各种传感器,如加速度计、陀螺仪等。应用程序通过
read
函数从相应的设备文件中读取传感器数据。 - 代码示例
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>#define SENSOR_DEVICE "/dev/sensor"
#define BUFFER_SIZE 32int main() {int fd = open(SENSOR_DEVICE, O_RDONLY);if (fd == -1) {perror("open");return 1;}char buffer[BUFFER_SIZE];ssize_t bytes_read = read(fd, buffer, BUFFER_SIZE);if (bytes_read == -1) {perror("read");} else if (bytes_read > 0) {buffer[bytes_read] = '\0';// 处理传感器数据}close(fd);return 0;
}
②设备控制命令写入
- 场景:对于一些可控制的设备,如 LED 灯、电机等,应用程序可以通过
write
函数向设备文件写入控制命令,从而实现对设备的控制。 - 代码示例
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>#define LED_DEVICE "/dev/led"
#define COMMAND "ON"int main() {int fd = open(LED_DEVICE, O_WRONLY);if (fd == -1) {perror("open");return 1;}ssize_t bytes_written = write(fd, COMMAND, strlen(COMMAND));if (bytes_written == -1) {perror("write");}close(fd);return 0;
}
③串口/UART通信
串口设备(如/dev/ttyS0
)是嵌入式系统中常见的通信接口,read
和write
用于收发数据:
// 配置串口后...
char tx_data[] = "Hello UART!";
write(uart_fd, tx_data, strlen(tx_data)); // 发送数据char rx_data[32];
ssize_t len = read(uart_fd, rx_data, sizeof(rx_data)); // 接收数据
4.3. 进程间通信(IPC)
①管道通信
- 场景:在嵌入式系统中,不同进程之间可能需要进行数据交换。管道是一种简单的进程间通信方式,一个进程通过
write
函数向管道写入数据,另一个进程通过read
函数从管道读取数据。 - 代码示例
#include <stdio.h>
#include <unistd.h>
#include <string.h>#define BUFFER_SIZE 1024int main() {int pipefd[2];if (pipe(pipefd) == -1) {perror("pipe");return 1;}pid_t pid = fork();if (pid == -1) {perror("fork");return 1;}if (pid == 0) {// 子进程:读取数据close(pipefd[1]);char buffer[BUFFER_SIZE];ssize_t bytes_read = read(pipefd[0], buffer, BUFFER_SIZE);if (bytes_read == -1) {perror("read");} else if (bytes_read > 0) {buffer[bytes_read] = '\0';printf("Child process read: %s\n", buffer);}close(pipefd[0]);} else {// 父进程:写入数据close(pipefd[0]);const char *message = "Hello from parent!";ssize_t bytes_written = write(pipefd[1], message, strlen(message));if (bytes_written == -1) {perror("write");}close(pipefd[1]);}return 0;
}
4.4. 网络通信
套接字数据读写
- 场景:在嵌入式网络应用中,通过套接字进行网络通信时,使用
read
函数接收网络数据,使用write
函数发送网络数据。 - 代码示例(简单 TCP 客户端)
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 8080
#define BUFFER_SIZE 1024int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("socket");return 1;}struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("connect");close(sockfd);return 1;}const char *message = "Hello, server!";ssize_t bytes_written = write(sockfd, message, strlen(message));if (bytes_written == -1) {perror("write");}char buffer[BUFFER_SIZE];ssize_t bytes_read = read(sockfd, buffer, BUFFER_SIZE);if (bytes_read == -1) {perror("read");} else if (bytes_read > 0) {buffer[bytes_read] = '\0';printf("Received from server: %s\n", buffer);}close(sockfd);return 0;
}
五、常见问题
5.1. read
函数常见问题
①读取到的字节数少于请求数:
- 原因:
- 读普通文件时,在读到请求字节数之前已到达文件尾端。
- 从终端设备读时,通常一次最多读一行。
- 从网络读时,网络中的缓冲机构可能造成返回值小于请求读的字节数。
- 某些面向记录的设备(如磁带),一次最多返回一个记录。
- 解决方案:
- 在读取文件时,需要检查返回值是否小于请求字节数,并处理文件尾端的情况。
- 对于从终端设备或网络读取的数据,需要采用适当的缓冲机制来处理数据。
②读取操作失败:
- 原因:
- 文件描述符无效或没有读权限。
- 提供的缓冲区指针无效。
- 文件已被其他进程锁定或删除。
- 解决方案:
- 确保文件描述符有效且具有读权限。
- 检查缓冲区指针的有效性。
- 使用文件锁或其他同步机制来避免文件被其他进程锁定或删除。
③读取的数据不准确:
- 原因:
- 文件指针未正确设置。
- 文件内容在读取过程中被其他进程修改。
- 解决方案:
- 在读取文件之前,确保文件指针已正确设置到所需的位置。
- 使用文件锁或其他同步机制来避免文件内容在读取过程中被其他进程修改。
5.2. write
函数常见问题
①写入操作失败:
- 原因:
- 文件描述符无效或没有写权限。
- 磁盘已满或文件系统已满。
- 提供的缓冲区指针无效。
- 解决方案:
- 确保文件描述符有效且具有写权限。
- 检查磁盘和文件系统的剩余空间。
- 检查缓冲区指针的有效性。
②写入的字节数少于请求数:
- 原因:
- 磁盘已满或文件系统限制导致无法写入更多数据。
- 网络或设备缓冲区已满,导致写入操作被阻塞或提前返回。
- 解决方案:
- 在写入文件之前,检查磁盘和文件系统的剩余空间。
- 对于网络或设备写入操作,需要采用适当的缓冲机制和重试策略来处理写入失败的情况。
③写入的数据未立即生效:
- 原因:数据被写入内核缓冲区,而尚未被刷新到磁盘。
- 解决方案:使用
fsync
或fdatasync
函数来强制将缓冲区中的数据同步到磁盘。
5.3 通用建议
- 错误处理:
- 在使用
read
和write
函数时,务必检查返回值,并根据返回值进行相应的错误处理。 - 可以使用
errno
变量来获取更详细的错误信息。
- 在使用
- 资源管理:
- 在使用文件描述符时,要确保在不再需要时关闭它们,以释放系统资源。
- 对于网络套接字或其他资源,也需要进行适当的资源管理和释放。
- 同步与并发:
- 在多进程或多线程环境中,需要确保对文件或其他资源的访问是同步的,以避免数据竞争和不一致性。
- 可以使用文件锁、信号量或其他同步机制来实现这一点。
六、总结
read
和write
函数是嵌入式Linux应用开发中用于文件I/O操作的基础工具。通过这两个函数,可以实现从文件或设备读取数据和向文件或设备写入数据。了解并正确使用这些函数,对于开发稳定、高效的嵌入式应用程序至关重要。
相关文章:
【嵌入式Linux应用开发基础】read函数与write函数
目录 一、read 函数 1.1. 函数原型 1.2. 参数说明 1.3. 返回值 1.4. 示例代码 二、write 函数 2.1. 函数原型 2.2. 参数说明 2.3. 返回值 2.4. 示例代码 三、关键注意事项 3.1 部分读写 3.2 错误处理 3.3 阻塞与非阻塞模式 3.4 数据持久化 3.5 线程安全 四、嵌…...
从 X86 到 ARM :工控机迁移中的核心问题剖析
在工业控制领域,技术的不断演进促使着工控机从 X86 架构向 ARM 架构迁移。然而,这一过程并非一帆风顺,面临着诸多关键挑战。 首先,软件兼容性是一个重要问题。许多基于 X86 架构开发的工业控制软件可能无法直接在 ARM 架构上运行…...
【数据结构】(7) 栈和队列
一、栈 Stack 1、什么是栈 栈是一种特殊的线性表,它只能在固定的一端(栈顶)进行出栈、压栈操作,具有后进先出的特点。 2、栈概念的例题 答案为 C,以C为例进行讲解: 第一个出栈的是3,那么 1、…...
android设置添加设备QR码信息
摘要:客户衍生需求,通过扫QR码快速获取设备基础信息,并且基于POS SDK进行打印。 1. 定位至device info的xml添加相关perference Index: vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/my_device_info.xml--- vendor/medi…...
进程状态
目录 1.进程排队 硬件的队列 进程排队 2.进程的三大状态 什么是状态 运行状态 阻塞状态 挂起状态 3.Linux系统中的进程状态 4.僵尸状态 5.孤儿进程 1.进程排队 硬件的队列 计算机是由很多硬件组成的,操作系统为了管理这些硬件,通常需要为这…...
【linux学习指南】模拟线程封装与智能指针shared_ptr
文章目录 📝线程封装🌉 Thread.hpp🌉 Makefile 🌠线程封装第一版🌉 Makefile:🌉Main.cc🌉 Thread.hpp: 🌠线程封装第二版🌉 Thread.hpp:🌉 Main.cc …...
智慧物流新引擎:ARM架构工控机在自动化生产线中的应用
工业自动化程度的不断提升,对高性能、低功耗和高可靠性的计算设备需求日益增长。ARM架构工控机因其独特的优势,在多个工业领域得到了广泛应用。本文将深入探讨ARM架构工控机的特点及其在具体工业场景中的应用。 ARM架构工控机的主要优势 高效能与低功耗…...
OpenGL的基础光照知识
光照模型 常见的光照模型:ADS模型 A:环境光反射(ambient reflection):模拟低级光照,影响场景中的所有物体。D:漫反射(diffuse reflection):根据光线的入射角…...
centos 10 离线安装dnf 和 设置dnf镜像源
离线安装dnf可用kimi搜索, centos 使用curl 下载dnf 的rpm包 mkdir ~/dnf_packages cd ~/dnf_packages# CentOS 7 示例 curl -O http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-0.6.4-2.sdl7.noarch.rpm curl -O http://springdale.math.ias.edu/data/pu…...
redis 缓存击穿问题与解决方案
前言1. 什么是缓存击穿?2. 如何解决缓存击穿?怎么做?方案1: 定时刷新方案2: 自动续期方案3: 定时续期 如何选? 前言 当我们使用redis做缓存的时候,查询流程一般是先查询redis,如果redis未命中,再查询MySQL,将MySQL查询的数据同步到redis(回源),最后返回数据 流程图 为什…...
Linux下的进程切换与调度
目录 1.进程的优先级 优先级是什么 Linux下优先级的具体做法 优先级的调整为什么要受限 2.Linux下的进程切换 3.Linux下进程的调度 1.进程的优先级 我们在使用计算机的时候,通常会启动多个程序,这些程序最后都会变成进程,但是我们的硬…...
开源模型应用落地-Qwen1.5-MoE-A2.7B-Chat与vllm实现推理加速的正确姿势(一)
一、前言 在人工智能技术蓬勃发展的当下,大语言模型的性能与应用不断突破边界,为我们带来前所未有的体验。Qwen1.5-MoE-A2.7B-Chat 作为一款备受瞩目的大语言模型,以其独特的架构和强大的能力,在自然语言处理领域崭露头角。而 vllm 作为高效的推理库,为模型的部署与推理提…...
阿里云IOT设备管理
本文主要介绍了阿里云IOT设备管理的基本概念、功能特点以及应用场景。阐述了如何利用阿里云IOT平台实现设备的连接、监控和控制,以及如何借助其丰富的数据分析功能提升设备管理效率。 一、IOT工作原理 二、创建模拟设备 1.创建产品 2.物模型 3.设备 4.设备数据上报…...
图像处理技术和应用
图像处理技术是一种依托计算机和相关算法,对图像进行深度处理、分析及改变的技术。主要包括图像数字化、图像增强和复原、图像数据编码、图像分割和图像识别等。它不仅能够从静态图像中提取关键信息,还能改变图像的外观或特征,并进一步检测、…...
格式化字符串漏洞详解
一、漏洞原理 格式化字符串漏洞(Format String Vulnerability)是由于程序使用用户可控的输入作为格式化字符串参数(如 printf、sprintf 等函数)时未正确过滤导致的漏洞。攻击者可通过构造特殊格式字符串实现以下操作:…...
java项目之基于web的中国古诗词的设计与实现源码(ssm+mysql)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于web的中国古诗词的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于web的中国…...
网络初识-
网络的相关概念 一、局域网和广域网 将各种计算机、外部设备等相互连接起来,实现在这个范围内数据通信和资源共享的计算机网络。它的覆盖范围通常在几百米到几公里之内。例如,一个小型企业的办公室,通过交换机将多台电脑连接在一起…...
AOS安装及操作演示
文章目录 一、安装node1.1 在 macOS 上管理 Node版本1.1.1 安装 nvm1.1.2 验证 nvm 是否安装成功1.1.3 使用 nvm 安装/切换 Node.js 版本1.1.4 卸载 Node.js 版本 1.2 在 windows 上管理 Node版本1.2.1 安装 nvm-windows1.2.2 安装 Node.js 版本1.2.3 切换 Node.js 版本1.2.4 卸…...
vue学习8
1.pinia(更优) 是vue最新的状态管理工具,是vuex的替代品 pinia: state actions(支持异步,可以直接修改state) getters 优点: 提供更加简单的API(去掉了mutation)提供符合,组合式的API语法(和v…...
【竞技宝】电竞世界杯:无畏契约首次入选正式项目!
北京时间2月12日,电竞世界杯基金会(EWCF)与知名游戏开发商拳头游戏(Riot Games)在近日共同宣布达成三年合作伙伴关系。同时,三大顶级电竞项目——《英雄联盟》《英雄联盟:云顶之弈》(…...
Bigemap Pro地图配置文件包
配置文件获取 配置文件下载后,直接拖入软件中自动识别导入图源,一键完成加载。...
有哪些免费的SEO软件优化工具
随着2025年互联网的不断发展,越来越多的企业意识到在数字营销中,网站的曝光度和排名至关重要。无论是想要提高品牌知名度,还是想要通过在线销售增加收益,SEO(搜索引擎优化)都是一项不可忽视的关键策略。而要…...
第二天:工具的使用
每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中,对于爬虫有兴趣的伙伴可以订阅专栏一起学习,完全免费。 键盘为桨,代码作帆。这趟为期30天左右的Python爬虫特训即将启航,每日解锁新海域:从Requests库的…...
分享在职同时准备系统分析师和教资考试的时间安排
(在职、时间有限、同时备考系统分析师考试和小学信息技术教资面试),以下是详细的备考计划,确保计划的可行性和通过性。 一、总体安排 时间分配: 每周周末(2天)用于系统分析师考试备考。工作日晚…...
从Word里面用VBA调用NVIDIA的免费DeepSeekR1
看上去能用而已。 选中的文字作为输入,运行对应的宏即可;会先MSGBOX提示一下,然后相关内容追加到word文档中。 需要自己注册生成好用的apikey Option ExplicitSub DeepSeek()Dim selectedText As StringDim apiKey As StringDim response A…...
3.2 > Bash
概览 在上一节中我们了解了关于 Shell 的执行流程,知道了在 Linux 环境中一般有哪些常用的 Shell。而在本节中,将会学习到 Linux 中最常见的一个 Shell —— Bash,了解到 bash 的相关知识和用法。 本节目录 概览相关知识bash 命令提示符bas…...
游戏引擎学习第100天
仓库:https://gitee.com/mrxiao_com/2d_game_2 昨天的回顾 今天的工作重点是继续进行反射计算的实现。昨天,我们开始了反射和环境贴图的工作,成功地根据法线显示了反射效果。然而,我们还没有实现反射向量的计算,导致反射交点的代…...
新一代SCADA: 宏集Panorama Suite 2025 正式发布,提供更灵活、符合人体工学且安全的应用体验
宏集科技宣布正式推出全新Panorama Suite 2025 SCADA软件!全新版本标志着 Panorama Suite的一个重要里程碑,代表了从 Panorama Suite 2022 开始并跨越三个版本(2022、2023、2025)的开发过程的顶峰。 此次重大发布集中在六个核心主…...
Visual Studio 进行单元测试【入门】
摘要:在软件开发中,单元测试是一种重要的实践,通过验证代码的正确性,帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试,包括创建测试项目、编写测试代码、运行测试以及查看结果。 1. 什么是单元测…...
Notepad++ 中删除所有以 “pdf“ 结尾的行
Notepad 中删除所有以 “pdf” 结尾的行 操作步骤 1.打开文件: 在 Notepad 中打开你需要处理的文本文件。 2.打开查找和替换对话框: 按快捷键 Ctrl F,打开“查找和替换”对话框。 3.启用正则表达式模式: 在对话框的底部…...
Java 使用腾讯翻译 API 实现含 HTML 标签文本,json值,精准翻译工具
注意:需搭配标题二的腾讯翻译工具使用 一-1、翻译标签文本工具 package org.springblade.common.utils;import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern;public class TencentTranslationFor…...
DeepSeek R1+Open WebUI +SearXNG 本地化部署与联网功能
GitHub - searxng/searxng-docker: The docker-compose files for setting up a SearXNG instance with docker....
数据科学之数据管理|NumPy数据管
一、Numpy介绍 (一) 什么是numpy NumPy是Python中科学计算的基础包。它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运…...
零基础玩转 DeepSeek API实战教程
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...
【GPIO】5.理解保护二极管在GPIO过电压保护中的作用
在电子电路设计中,保护二极管是常见的保护元件,用于防止过电压对敏感电路的损害。本文将探讨当GPIO输入电压大于3.3V时,保护二极管如何工作,并解释为什么大部分过电压引起的电流会通过二极管流向VDD而不是流入内部电路。 1.背景 …...
2.5 模块化迁移策略:从传统项目到模块化系统
模块化迁移策略:从传统项目到模块化系统 将传统 Java 项目迁移至 JDK 9 模块化系统是一项系统性工程,需分阶段实施以降低风险。以下是详细的迁移策略、工具使用和实战示例。 1. 迁移阶段划分 阶段目标关键操作阶段1:兼容性验证确保项目能在…...
Tortoise Git
TortoiseGit 是一个 Windows Shell 与 Git 的接口,它提供了文件状态的覆盖图标,强大的 Git 上下文菜单等。你可以在官方网站 (tortoisegit.org) 轻松使用安装程序进行下载。TortoiseGit 的当前稳定版本是 2.14.0 ,根据你的机器配置࿰…...
Maven Spring框架依赖包
Maven中添加Spring框架依赖包 Spring核心工具包SpringJDBCSpring配置文件头信息 Spring核心工具包 在pom.xml文件中添加 <!-- Spring的核心工具包--><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spr…...
【Cocos TypeScript 零基础 15.1】
目录 见缝插针UI脚本针脚本球脚本心得_旋转心得_更改父节点心得_缓动动画成品展示图 见缝插针 本人只是看了老师的大纲,中途不明白不会的时候再去看的视频 所以代码可能与老师代码有出入 SIKI_学院_点击跳转 UI脚本 import { _decorator, Camera, color, Component, directo…...
Linux库制作与原理:【静态库】【动态库】【目标文件】【ELF文件】【ELF从形成到假造轮廓】【理解链接和加载】
目录 一.什么是库 二.静态库 2.1创建静态库 我们在之前的路径下新建lib使用我们自己的库 2.2 使用makefile生成静态库 三.动态库 3.1动态库生成 3.2动态库使用 3.3库运行搜索路径 四.目标文件 五.ELF文件 六.ELF从形成到加载轮廓 6.1ELF形成可执行 6.2 ELF可执行文…...
中间件-redis-(ubantu)
1、安装依赖包 sudo apt-get update sudo apt-get install redis 一旦安装完成,Redis 服务将会自动启动。想要检查服务的状态,输入下面的命令: rootvims:/etc/redis# sudo systemctl status redis-server ● redis-server.service - Adva…...
ubuntu20.04+ROS+Gazebo+px4+QGC+MAVROS
目录 前言 一、安装ROS 二、安装PX4 编译 三、QGC安装 四、安装MAVROS 命令记得加sudo! 前言 在安装ubuntu20.04ROSGazebopx4QGCMAVROS时,参考了很多网上的资料,总结一个较为顺利的流程。 官方指南PX4 自动驾驶仪用户指南 | PX4 Gui…...
基于 openEuler 构建 LVS-DR 群集(同网段)。
一、LVS相关原理 1.LVS简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项 目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在 Linux2.4内核以前&…...
计算机毕业设计PySpark+Hadoop+Hive机票预测 飞机票航班数据分析可视化大屏 航班预测系统 机票爬虫 飞机票推荐系统 大数据毕业设计
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
【设计模式】【行为型模式】观察者模式(Observer)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 📫 欢迎V: flzjcsg2,我们共同讨论Java深渊的奥秘 …...
机器学习: 逻辑回归
概念与定义 逻辑回归是一种用于分类问题的统计方法。它通过计算目标变量的概率来预测类别归属,并假设数据服从伯努利分布(二分类)或多项式分布(多分类)。逻辑回归模型输出的是概率值,通常使用sigmoid函数将线性组合映射到0和1之间。 1. 概念 逻辑回归用于解决分类问题…...
域名解析—互联网世界的导航系统
在互联网的世界里,每个网站都像一座“城市”,而用户要找到这些“城市”,必须依赖一套精准的导航系统——这就是域名解析。无论是浏览网页、发送邮件,还是使用移动应用,域名解析都在背后默默支撑着用户的每一次访问。本…...
PAT乙级真题 — 1080 MOOC期终成绩(java)【测试点3超时】
对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,必须首先获得不少于200分的在线编程作业分,然后总评获得不少于60分(满分100)。总评成绩的计…...
【Prometheus】如何通过prometheus监控redis实时运行状态,并实现告警通知
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
ARM Cortex-M3/M4 权威指南 笔记【一】技术综述
一、Cortex-M3/M4 处理器的一般信息 1.1 处理器类型 ARM Cortex-M 为 32 位 RISC(精简指令集)处理器,其具有: 32位寄存器32位内部数据通路32位总线接口 除了 32 位数据,Cortex-M 处理器(以及其他任何 A…...