当前位置: 首页 > article >正文

【嵌入式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. 文件数据读写

4.2. 设备驱动交互

4.3. 进程间通信(IPC)

4.4. 网络通信

五、常见问题

5.1. read函数常见问题

5.2. write函数常见问题

5.3 通用建议

六、总结


在嵌入式Linux应用开发中,readwrite函数是文件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)是嵌入式系统中常见的通信接口,readwrite用于收发数据:

// 配置串口后...
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函数常见问题

①写入操作失败

  • 原因
    • 文件描述符无效或没有写权限。
    • 磁盘已满或文件系统已满。
    • 提供的缓冲区指针无效。
  • 解决方案
    • 确保文件描述符有效且具有写权限。
    • 检查磁盘和文件系统的剩余空间。
    • 检查缓冲区指针的有效性。

②写入的字节数少于请求数

  • 原因
    • 磁盘已满或文件系统限制导致无法写入更多数据。
    • 网络或设备缓冲区已满,导致写入操作被阻塞或提前返回。
  • 解决方案
    • 在写入文件之前,检查磁盘和文件系统的剩余空间。
    • 对于网络或设备写入操作,需要采用适当的缓冲机制和重试策略来处理写入失败的情况。

③写入的数据未立即生效

  • 原因:数据被写入内核缓冲区,而尚未被刷新到磁盘。
  • 解决方案:使用fsyncfdatasync函数来强制将缓冲区中的数据同步到磁盘。

5.3 通用建议

  • 错误处理
    • 在使用readwrite函数时,务必检查返回值,并根据返回值进行相应的错误处理。
    • 可以使用errno变量来获取更详细的错误信息。
  • 资源管理
    • 在使用文件描述符时,要确保在不再需要时关闭它们,以释放系统资源。
    • 对于网络套接字或其他资源,也需要进行适当的资源管理和释放。
  • 同步与并发
    • 在多进程或多线程环境中,需要确保对文件或其他资源的访问是同步的,以避免数据竞争和不一致性。
    • 可以使用文件锁、信号量或其他同步机制来实现这一点。

六、总结

readwrite函数是嵌入式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 线程安全 四、嵌…...

一、OpenSM 架构部署及原理详解

目录 一、OpenSM 架构与核心功能 1. InfiniBand 子网管理器(SM)的作用 2. OpenSM 的架构 二、OpenSM 部署步骤(以 Linux 为例) 1. 安装依赖与软件包 2. 配置文件 3. 启动 OpenSM 服务 4. 验证部署 5. 高可用性配置(可选) 三、OpenSM 工作原理详解 1. 拓扑发现(…...

2526考研资料分享 百度网盘

通过网盘分享的文件&#xff1a;01、2026【考研数学】 链接:https://pan.baidu.com/s/1PwMzp_yCYqjBqa7492mP3w?pwd98wg 提取码:98wg--来自百度网盘超级会员v3的分享 通过网盘分享的文件&#xff1a;01、2026【考研政治】 链接:https://pan.baidu.com/s/1PwMzp_yCYqjBqa7492…...

15.1 Process(进程)类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 通常开发时想要获得进程是比较困难的事&#xff0c;必须要调用CreateToolhelpSnapshot、ProcessFirst、ProcessNext等API或者诸如 Zw…...

事件传递和监控

今天介绍一下UIApplication的函数 - (BOOL)sendAction:to:from:forEvent: - (BOOL)sendAction:to:from:forEvent: 是 UIApplication 类中的一个方法&#xff0c;主要用于发送事件响应链中的动作&#xff08;action&#xff09;。它允许应用程序从一个特定的发送者&#xff08;…...

CentOS 7 企业级Redis 7部署指南

CentOS 7 企业级Redis 7部署指南 目录导航 一、环境准备 1.1 依赖管理 二、离线安装 2.1 源码编译安装2.2 目录结构规范 三、生产配置 3.1 主配置文件3.2 配置生成脚本 四、系统集成 4.1 Systemd服务文件4.2 服务管理命令 五、安全加固 5.1 网络安全配置5.2 审计配置 六、性能…...

Python创建Excel的方式——提供4中方式可供参考

目录 专栏导读库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriter代码4——xlwings总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——>…...

消息中间件深度剖析:以 RabbitMQ 和 Kafka 为核心

在现代分布式系统和微服务架构的构建中&#xff0c;消息中间件作为一个不可或缺的组件&#xff0c;承担着系统间解耦、异步处理、流量削峰、数据传输等重要职能。尤其是在面临大规模并发、高可用性和可扩展性需求时&#xff0c;如何选择合适的消息中间件成为了开发者和架构师们…...

回文数:简单问题中的多种优化思路

回文数&#xff1a;简单问题中的多种优化思路 引言 回文数&#xff08;Palindrome Number&#xff09;是一个有趣的问题&#xff0c;在算法竞赛、面试、甚至一些实际应用场景中都会遇到。最直观的方式是将数字转换成字符串&#xff0c;然后反转比较。但仅仅满足“能解”是不够…...

大语言模型简史:从Transformer(2017)到DeepSeek-R1(2025)的进化之路

2025年初&#xff0c;中国推出了具有开创性且高性价比的「大型语言模型」&#xff08;Large Language Model — LLM&#xff09;DeepSeek-R1&#xff0c;引发了AI的巨大变革。本文回顾了LLM的发展历程&#xff0c;起点是2017年革命性的Transformer架构&#xff0c;该架构通过「…...

java八股文-spring

目录 1. spring基础 1.1 什么是Spring&#xff1f; 1.2 Spring有哪些优点&#xff1f; 1.3 Spring主要模块 1.4 Spring常用注解 1.5 Spring中Bean的作用域 1.6 Spring自动装配的方式 1.7 SpringBean的生命周期 1.8 多级缓存 1.9 循环依赖&#xff1f; 1 .8.1 原因 1.8…...

机器学习--实现多元线性回归

机器学习—实现多元线性回归 本节顺延机器学习--线性回归中的内容&#xff0c;进一步讨论多元函数的回归问题 y ′ h ( x ) w ⊤ ∙ x b y^{\prime}h(x)w^\top\bullet xb y′h(x)w⊤∙xb 其中, w T ⋅ x 就是 W 1 X 1 w 2 X 2 w 3 X 3 ⋯ w N X N \text{其中,}w^\math…...

vue3响应式丢失解决办法(三)

vue3的响应式的理解&#xff0c;与普通对象的区别&#xff08;一&#xff09; vue3 分析总结响应式丢失问题原因&#xff08;二&#xff09; 经过前面2篇文章&#xff0c;知道了响应式为什么丢失了&#xff0c;但是还是碰到了丢失情况&#xff0c;并且通过之前的内容还不能解…...

NLP 八股 DAY1:BERT

BERT全称&#xff1a;Pre-training of deep bidirectional transformers for language understanding&#xff0c;即深度双向Transformer。 模型训练时的两个任务是预测句⼦中被掩盖的词以及判断输⼊的两个句⼦是不是上下句。在预训练 好的BERT模型后⾯根据特定任务加上相应的⽹…...

蓝桥与力扣刷题(230 二叉搜索树中第k小的元素)

题目&#xff1a;给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1a;1示例 2&#xff…...

半遮挡检测算法 Detecting Binocular Half-Occlusions

【1. 背景】&#xff1a; 本文分析【Detecting Binocular Half-Occlusions&#xff1a;Empirical Comparisons of Five Approaches】Geoffrey Egnal和Richard P. Wildes于2002年发表在IEEE Transactions on Pattern Analysis and Machine Intelligence上&#xff0c;这是1篇中…...

PHP培训机构教务管理系统小程序

&#x1f511; 培训机构教务管理系统——智慧教育&#xff0c;高效管理新典范 &#x1f680; 这款教务管理系统&#xff0c;是基于前沿的ThinkPHP框架与Uniapp技术深度融合&#xff0c;匠心打造的培训机构管理神器。它犹如一把开启高效运营与精细管理的金钥匙&#xff0c;专为…...

《LeetCode 763. 划分字母区间 | 高效分割字符串》

内容&#xff1a; 问题描述&#xff1a; 给定一个字符串 S&#xff0c;将字符串分割成若干个子串&#xff0c;使得每个子串中的字符都不重复&#xff0c;并且返回每个子串的长度。 解题思路&#xff1a; 找到每个字符最后一次出现的位置&#xff1a;我们首先遍历一遍字符串&a…...

无人机不等同轴旋翼架构设计应用探究

“结果显示&#xff0c;对于不等组合&#xff0c;用户应将较小的螺旋桨置于上游以提高能效&#xff0c;但若追求最大推力&#xff0c;则两个相等的螺旋桨更为理想。” 在近期的研究《不等同轴旋翼性能特性探究》中&#xff0c;Max Miles和Stephen D. Prior博士深入探讨了不同螺…...

什么是 大语言模型中Kernel优化

什么是 大语言模型中Kernel优化 目录 什么是 大语言模型中Kernel优化Kernel优化操作系统内核优化深度学习计算内核优化手工优化原理举例Flash Attention,Faster TransformerKernel优化 大语言模型存在访存密集操作(如注意力机制、LayerNorm等),这些操作使得GPU计算性能无法…...

DeepSeek与ChatGPT:AI语言模型的全面对决

DeepSeek与ChatGPT&#xff1a;AI语言模型的全面对决 引言&#xff1a;AI 语言模型的时代浪潮一、认识 DeepSeek 与 ChatGPT&#xff08;一&#xff09;DeepSeek&#xff1a;国产新星的崛起&#xff08;二&#xff09;ChatGPT&#xff1a;AI 界的开拓者 二、DeepSeek 与 ChatGP…...

CTFHub技能树-密码口令wp

目录 引言弱口令默认口令 引言 仅开放如下关卡 弱口令 通常认为容易被别人&#xff08;他们有可能对你很了解&#xff09;猜测到或被破解工具破解的口令均为弱口令。 打开环境&#xff0c;是如下界面&#xff0c;尝试一些弱口令密码无果 利用burpsuite抓包&#xff0c;然后爆…...

Deepseek R1模型本地化部署与API实战指南:释放企业级AI生产力

摘要 本文深入解析Deepseek R1开源大模型的本地化部署流程与API集成方案&#xff0c;涵盖从硬件选型、Docker环境搭建到模型微调及RESTful接口封装的完整企业级解决方案。通过电商评论分析和智能客服搭建等案例&#xff0c;展示如何将前沿AI技术转化为实际生产力。教程支持Lin…...

MISP从入门到实战:威胁情报共享平台搭建与使用详解

MISP从入门到实战&#xff1a;威胁情报共享平台搭建与使用详解 目录 MISP核心作用与价值MISP安装与部署 2.1 Docker快速部署2.2 手动安装&#xff08;Ubuntu&#xff09; MISP基础使用教程 3.1 创建事件与属性3.2 数据共享与同步3.3 威胁情报分析实战 MISP高级功能 4.1 Galaxy…...

【NLP251】BertTokenizer 的全部 API 及 使用案例

BertTokenizer 是 Hugging Face 的 transformers 库中用于处理 BERT 模型输入的分词器类。它基于 WordPiece 分词算法&#xff0c;能够将文本分割成词汇单元&#xff08;tokens&#xff09;&#xff0c;并将其转换为 BERT 模型可以理解的格式。BertTokenizer 是 BERT 模型的核心…...

【MySQL常见疑难杂症】常见文件及其所存储的信息

1、MySQL配置文件的读取顺序 &#xff08;非Win&#xff09;/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/mysql/etc/my.cnf、&#xff5e;/.my.cnf 可以通过命令查看MySQL读取配置文件的顺序 [roothadoop01 ~]# mysql --help |grep /etc/my.cnf /etc/my.cnf /etc/mysql/my.c…...

InnoDB如何解决幻读?深入解析MySQL的并发控制机制

--- ## 一、什么是幻读&#xff08;Phantom Read&#xff09;&#xff1f; **幻读**是数据库事务隔离性中的一个典型问题&#xff0c;具体表现为&#xff1a; 在同一个事务中&#xff0c;多次执行相同的范围查询&#xff08;Range Query&#xff09;时&#xff0c;**后一次…...

栈的深度解析:从基础实现到高级算法应用——C++实现与实战指南

一、栈的核心算法与应用场景 栈的先进后出特性使其在以下算法中表现优异&#xff1a; 括号匹配&#xff1a;校验表达式合法性。表达式求值&#xff1a;中缀转后缀&#xff0c;逆波兰表达式求值。深度优先搜索&#xff08;DFS&#xff09;&#xff1a;模拟递归调用。单调栈&am…...

IDEA集成DeepSeek

引言 随着数据量的爆炸式增长&#xff0c;传统搜索技术已无法满足用户对精准、高效搜索的需求。 DeepSeek作为新一代智能搜索技术&#xff0c;凭借其强大的语义理解与深度学习能力&#xff0c;正在改变搜索领域的游戏规则。 对于 Java 开发者而言&#xff0c;将 DeepSeek 集成…...

Oracle Trace文件突然增长很多的原因分析及解决办法

Oracle Trace文件突然增长很多可能是由多种原因引起的,例如SQL语句的长时间跟踪、错误的跟踪设置、大量的错误和警告信息等。 一、以下是一些解决Trace文件增长过快的方法: 1.清理旧的Trace文件 可以通过以下命令删除超过一定天数的Trace文件,例如删除3天前的Trace文件: …...