🦄 个人主页: 小米里的大麦-CSDN博客
🎏 所属专栏: Linux_小米里的大麦的博客-CSDN博客
🎁 GitHub主页: 小米里的大麦的 GitHub
⚙️ 操作环境: Visual Studio 2022

在这里插入图片描述

文章目录

    • 进程控制 —— 进程等待
      • 1. 进程等待必要性
      • 2. 常用等待方法(重点掌握)
        • 1. `wait()` 示例(阻塞等待子进程)
        • 2. `waitpid()` 示例(等待指定子进程,更灵活)
      • 3. status 退出状态详解
        • 1. 什么是 `status`?
        • 2. `status` 的位布局(Linux 下)
        • 3. WIFEXITED 和 WEXITSTATUS 的底层原理
          • 1. `WIFEXITED(status)`
          • 2. `WEXITSTATUS(status)`
        • 4. 实验测试
      • 4. 非阻塞轮询
        • 1. 什么是非阻塞轮询(Non-blocking Polling)?
          • 场景一:阻塞等待(wait)
          • 场景二:非阻塞轮询(WNOHANG)
          • 场景三:阻塞轮询(极端示例)
          • 术语与现实对应表
        • 2. 联系总结(术语图谱)
        • 3. 我该怎么选?怎么使用?
        • 4. 小结一句话
      • 5. 总结记忆点
    • 共勉

进程控制 —— 进程等待

1. 进程等待必要性

  • 当父进程通过 fork() 创建了子进程后,子进程终止时,其退出信息必须由父进程读取,父进程如果不管不顾,就可能造成 僵尸进程 的问题,进而造成内存泄漏。
  • 另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的 kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。
  • 最后,父进程派给子进程的任务完成的如何,我们需要知道。如子进程运行完成,结果对还是不对,或者是否正常退出。
  • 父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。

如果不等待会怎样?

  • 子进程退出了,但父进程没有调用 wait() 系列函数。
  • 子进程的“退出状态”会保留在内核中,直到父进程读取它。
  • 此时子进程的 PCB 没有完全释放,占用系统资源。
  • 如果产生大量僵尸进程,系统资源将耗尽,导致无法创建新进程。、

所以:父进程需要“等待”子进程终止并获取其退出状态,以释放系统资源。

面试点拨: 如果不调用 wait() 会怎样?

回答:子进程的退出信息留在内核,PCB 未释放,形成僵尸进程,长期不回收会占满系统资源。


2. 常用等待方法(重点掌握)

函数名作用
wait(int *status)阻塞等待任意一个子进程结束,并获取其退出状态
waitpid(pid, &status, options)更灵活:等待指定子进程,或非阻塞等
1. wait() 示例(阻塞等待子进程)

wait()

  • 原型pid_t wait(int *status);
  • 功能:阻塞等待任意一个子进程退出,并回收其资源。
  • 参数status(输出型参数):保存/获取子进程退出状态(需用宏解析,如 WIFEXITED)。不关心可设置为 NULL。
  • 返回值:成功返回子进程 PID,失败返回 -1

实验目的:

  • 学会使用 wait() 函数阻塞等待子进程结束。
  • 理解如何通过 status 获取子进程的退出状态。
  • 掌握如何判断子进程是否正常退出以及获取其退出码。

[!CAUTION]

下面代码会涉及部分知识盲区,在文章后面会讲到!

实验:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>int main()
{pid_t id = fork();if (id == 0)                            // 子进程{int count = 10;while (count--){printf("我是子进程...PID:%d, PPID:%d\n", getpid(), getppid());   // 子进程逻辑:打印 PID 和 PPIDsleep(1);}exit(0);                            // 子进程退出}int status = 0;                         // 存储子进程退出状态pid_t ret = wait(&status);              // 阻塞等待子进程结束if (ret > 0)                            // 父进程{// 父进程等待子进程结束printf("等待子进程结束...\n");if (WIFEXITED(status))              // 判断子进程是否正常退出{// 子进程正常结束printf("子进程正常结束,退出状态码:%d\n", WEXITSTATUS(status));}}sleep(3);return 0;
}

实验示例结果:

我是子进程...PID:1234, PPID:1233
我是子进程...PID:1234, PPID:1233
...
等待子进程结束...
子进程正常结束,退出状态码:0
2. waitpid() 示例(等待指定子进程,更灵活)

waitpid()

  • 原型pid_t waitpid(pid_t pid, int *status, int options);
  • 功能:更灵活地等待指定子进程,支持非阻塞模式。
  • 参数
  • pid:指定子进程 PID,或 -1 表示任意子进程。
  • options:常用的有 WNOHANG 表示非阻塞等待(立即返回,无子进程退出时返回 0)。
  • 返回值:成功返回子进程 PID,WNOHANG 模式下无退出子进程时返回 0,失败返回 -1

实验目的:

  • 学会使用 waitpid() 函数等待指定子进程。
  • 理解非阻塞等待(WNOHANG)的使用场景和优势。
  • 掌握如何在等待子进程的同时处理其他任务。

实验 1:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>int main()
{pid_t pid = fork();if (pid == 0){exit(10);}else{int status;pid_t wpid;while ((wpid = waitpid(pid, &status, WNOHANG)) == 0){printf("父进程忙别的事...\n");sleep(1);}if (WIFEXITED(status)){printf("子进程退出码 = %d\n", WEXITSTATUS(status));}}return 0;
}

实验示例结果:

父进程忙别的事...
父进程忙别的事...
...
子进程退出码 = 10

WNOHANG 的用途(后面详讲):它用于非阻塞轮询场景,让父进程可以边处理任务边检查子进程状态。

实验 2:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
int main()
{pid_t id = fork();          // 创建子进程if (id == 0){int time = 5;int n = 0;while (n < time){printf("我是子进程,我已经运行了:%d秒 PID:%d   PPID:%d\n", n + 1, getpid(), getppid());sleep(1);n++;}exit(244);              // 子进程退出}int status = 0;             // 状态pid_t ret = waitpid(id, &status, 0);        // 参数3 为0,为默认选项if (ret == -1){printf("进程等待失败!进程不存在!\n");}else if (ret == 0){printf("子进程还在运行中!\n");}else{printf("进程等待成功,子进程已被回收\n");}printf("我是父进程, PID:%d   PPID:%d\n", getpid(), getppid());//通过 status 判断子进程运行情况if ((status & 0x7F)){printf("子进程异常退出,core dump:%d   退出信号:%d\n", (status >> 7) & 1, (status & 0x7F));}else{printf("子进程正常退出,退出码:%d\n", (status >> 8) & 0xFF);}return 0;
}

实验示例结果:

我是子进程,我已经运行了:1秒 PID:1234   PPID:1233
...
进程等待成功,子进程已被回收
我是父进程, PID:1233   PPID:1232
子进程正常退出,退出码:244

3. status 退出状态详解

1. 什么是 status

当你用 wait()waitpid() 等函数回收子进程时,会通过一个整型变量 status 返回子进程的 终止状态/状态码 status 信息。这个 status 是一个 32 位整数,它的 各个位(bit)存储了子进程退出的不同信息,主要包括:

  • 子进程是否正常退出
  • 退出的返回码
  • 是否是被信号中断
  • 是否是 core dump

当子进程结束时,它就会返回一个 状态码 status,通过宏函数解读它:

宏函数判断或提取内容实现底层逻辑本质
WIFEXITED()是否正常退出(status & 0x7F) == 0判断是否未被信号终止(是否正常退出)
WEXITSTATUS()获取退出码(status >> 8) & 0xFF提取退出码所在的 8 位(获取 exit 返回码)

这些宏的 设计目的 就是为了 屏蔽底层实现细节,让你写代码时更易读。但其实就是对 status 进行的位运算封装。


2. status 的位布局(Linux 下)

通常(glibc 实现下),status 的位布局如下:

image-20250414221815934

31...........16 | 15.....8 | 7......0保留位        | 退出码   | 信号位  
  31                            16 15         8 7      0
+-----------------------------+-------------+--------+
|           保留              | 退出码(exit) | 信号码 |
+-----------------------------+-------------+--------+↑           ↑|           |(status >> 8)  status & 0x7F                                                 

3. WIFEXITED 和 WEXITSTATUS 的底层原理
1. WIFEXITED(status)

判断子进程是否 正常退出(调用了 exit()return

#define WIFEXITED(status)  (((status) & 0x7F) == 0)

🔸 它检测的是 低 7 位(status & 0x7F)是否为 0,即 没有被信号终止

2. WEXITSTATUS(status)

获取子进程的 退出码(exit() 或 return 的值)

#define WEXITSTATUS(status)  (((status) >> 8) & 0xFF)

🔸 它提取的是 第 8~15 位,因为退出码就被编码在这里。

4. 实验测试

实验目的:

  • 学会解析 status 的各个位,了解子进程的退出状态。
  • 掌握如何通过宏函数判断子进程是否正常退出以及获取其退出码。
  • 理解如何手动解析 status 的位信息。
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>int main()
{pid_t pid = fork();if (pid == 0){exit(66); // 子进程退出码设为 66}else{int status = 0;waitpid(pid, &status, 0);printf("原始 status:%d (0x%x)\n", status, status);if (WIFEXITED(status)){printf("正常退出,返回值 = %d\n", WEXITSTATUS(status));printf("手动解析返回值 = %d\n", (status >> 8) & 0xFF);}else{printf("非正常退出\n");}}return 0;
}

输出示例:

image-20250414223219766

原始 status:16896 (0x4200)
正常退出,返回值 = 66
手动解析返回值 = 66

示例:手动解析 status

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>int main()
{pid_t pid = fork();if (pid == 0){exit(66);                                       // 子进程退出码设为 66}else{int status = 0;waitpid(pid, &status, 0);printf("原始 status: 0x%x\n", status);// 手动解析 statusif ((status & 0x7F) == 0)                       // 判断是否正常退出{ int exit_code = (status >> 8) & 0xFF;       // 提取退出码printf("手动解析:子进程正常退出,退出码: %d\n", exit_code);}else{printf("手动解析:子进程异常退出,信号码: %d\n", (status & 0x7F));}}return 0;
}

扩展:

写法模板:

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>int main()
{pid_t pid = fork();if (pid == 0)           // 子进程逻辑{exit(0);}else if (pid > 0)       // 父进程逻辑{int status;pid_t ret = waitpid(pid, &status, 0);if (ret == -1){perror("waitpid error");}else if (WIFEXITED(status)){printf("子进程正常退出,退出码: %d\n", WEXITSTATUS(status));}else{printf("子进程异常退出\n");}}else{perror("fork error");}return 0;
}

若子进程是被信号杀死的,还可用:

  • WIFSIGNALED(status):是否被信号终止。
  • WTERMSIG(status):哪个信号导致的。

这些也都是对 status 特定位的封装。

面试点拨:

Q:只创建一个子进程也要 wait() 吗?

A:要,不然会产生僵尸进程。

Q: wait(NULL) wait(&status) 有何不同?

A:前者不关心子进程退出码,后者可以判断退出状态。

Q:wait()waitpid() 的区别是什么?(详见下文)

A:wait() 阻塞等待任意一个子进程,而 waitpid() 可以指定子进程,并支持非阻塞模式。

Q:怎么判断子进程是否异常退出?

A:WIFEXITED(status) 为假时即为异常,可结合 WIFSIGNALED 查看是否被信号终止。


4. 非阻塞轮询

1. 什么是非阻塞轮询(Non-blocking Polling)?

非阻塞轮询 是一种在程序中检查某项资源状态(比如文件描述符、输入输出、子进程状态等)时,不会阻塞(挂起)当前线程或进程的技术。非阻塞轮询其实是 进程等待的一种特殊形式,本质上就是使用 waitpid() 函数时,配合选项 WNOHANG,来实现 非阻塞地检查子进程是否退出

非阻塞轮询底层依赖:

  • waitpid(..., WNOHANG):设置为非阻塞检查子进程。
  • read() / write() 配合 O_NONBLOCK 标志。
  • select() / poll() / epoll() 这些高级接口也支持非阻塞 I/O 检测。

联系:

  • 非阻塞轮询 ≈ 进程等待 + WNOHANG 参数。
  • 是进程等待的一种实现方式,可以避免父进程“卡死”在等待中。
  • 适合场景:父进程还有其他任务要处理、需要同时监控多个子进程、构造后台守护程序等。

这样说难以理解,我们用一个示例来帮助理解:假如你是快递员,你今天安排了送货任务,但你同时还在等一个客户签收你的包裹。现在有两种做法:

场景一:阻塞等待(wait)

你在客户门口等着他开门签字,你哪儿也不去,什么都不干,就在那儿等。就是 wait()waitpid(pid, NULL, 0)

  • 优点:等到了就能马上处理。
  • 缺点:你被“卡住”了,浪费了等的这段时间。
场景二:非阻塞轮询(WNOHANG)

你不一直站在门口,而是 每隔 10 分钟回来敲一次门,空闲的时候你还可以去送别的快递。就是 waitpid(pid, &status, WNOHANG) + sleep(1)

  • 优点:你不会被“卡住”,还能干其他事。
  • 缺点:客户签收可能不能第一时间知道(需要“轮询”)。
场景三:阻塞轮询(极端示例)

你不停敲门、再敲门,一直不走,一直问:“你签了没?你签了没?” 程序中表现为没有 sleep 的非阻塞 waitpid(pid, WNOHANG) 死循环。

  • 缺点:会让 CPU 疯狂运转(忙等待)。
术语与现实对应表
系统术语现实中的你
阻塞等待在门口站着等,不做别的事
非阻塞轮询每隔一段时间回来问一次,期间干别的事
阻塞轮询疯狂按门铃,问个不停,CPU 很累
进程等待等子进程结束,获取退出状态

2. 联系总结(术语图谱)

image-20250414230218594

                  wait/waitpid┌────────────┐│ 进程等待机制│└────┬───────┘│┌─────────────┴────────────┐│                          │┌─────▼─────┐             ┌─────▼─────────┐│ 阻塞等待   │             │ 非阻塞轮询     ││ wait()    │             │ waitpid(pid, WNOHANG) │└────────────┘             └──────────────────────┘

3. 我该怎么选?怎么使用?
场景推荐方法原因
父进程只等子进程结束,没别的事干阻塞等待 (wait)简单、直接、不会浪费资源
父进程还有其他重要任务非阻塞轮询 (waitpid + WNOHANG)不中断其他逻辑,更灵活
你同时要监控多个子进程非阻塞轮询可以处理多个子进程,适合服务端/守护程序
写简单的练习题/实验代码阻塞等待即可写起来方便,看得懂

实验目的:

  • 学会使用非阻塞轮询等待子进程结束。
  • 理解如何在等待子进程的同时处理其他任务。
  • 掌握如何通过 WNOHANG 选项实现非阻塞等待。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
int main()
{pid_t pid = fork();if (pid == 0)                       // 子进程{printf("子进程开始运行...\n");sleep(5);printf("子进程即将退出\n");exit(0);}else                                // 父进程:非阻塞方式轮询子进程状态{int status;while (1){pid_t result = waitpid(pid, &status, WNOHANG);      // 非阻塞调用if (result == 0){// 子进程还未退出printf("父进程:子进程还在运行...\n");}else if (result == pid){// 子进程已经退出if (WIFEXITED(status)){printf("父进程:子进程正常退出,退出码为 %d\n", WEXITSTATUS(status));}break;}else{perror("waitpid error");break;}sleep(1);                    // 轮询间隔}}return 0;
}

实验示例结果:

父进程:子进程还在运行...
父进程:子进程还在运行...
...
子进程开始运行...
子进程即将退出
父进程:子进程正常退出,退出码为 0
4. 小结一句话

非阻塞轮询是一种“智能等待”方式,让父进程在等待子进程的同时,还能处理其他任务,是并发编程的常见技巧。


5. 总结记忆点

内容说明
为什么等待防止僵尸进程,释放系统资源,获取子进程退出信息,确保系统稳定性和资源高效利用。
常用函数wait():阻塞等待任意子进程结束;waitpid():灵活等待指定子进程,支持非阻塞模式。
状态解析使用宏函数 WIFEXITED() 判断子进程是否正常退出,WEXITSTATUS() 获取退出码。
非阻塞轮询适用于父进程需要同时处理其他任务或监控多个子进程的场景,通过 waitpid() 配合 WNOHANG 实现。
推荐写法常用 waitpid(pid, &status, 0),安全灵活,适合大多数场景。
注意事项父进程必须回收子进程资源,否则会导致僵尸进程,长期不回收会耗尽系统资源。
适用场景简单程序使用阻塞等待,复杂程序或需要并发处理时使用非阻塞轮询。

实战技巧

  1. 调试技巧:在调试时,若发现僵尸进程,检查父进程是否正确调用了 wait()waitpid()
  2. 性能优化:在高并发场景下,使用非阻塞轮询避免父进程被长时间阻塞,提高系统响应速度。
  3. 代码健壮性:始终检查 wait()waitpid() 的返回值,处理可能的错误情况。

共勉

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88894.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88894.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88894.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP password_hash() 函数

password_hash() 函数用于创建密码的散列&#xff08;hash&#xff09;PHP 版本要求: PHP 5 > 5.5.0, PHP 7语法string password_hash ( string $password , int $algo [, array $options ] )password_hash() 使用足够强度的单向散列算法创建密码的散列&#xff08;hash&…

理解Linux文件系统:从物理存储到统一接口

目录 一、狭义理解&#xff08;物理层面&#xff09; 二、广义理解&#xff08;Linux系统视角&#xff09; 三、文件结构解析 四、系统实现机制 一、狭义理解&#xff08;物理层面&#xff09; 存储特性&#xff1a;文件以二进制形式存储在磁盘等永久性存储介质中 介质特点…

前端接入海康威视摄像头的三种方案

方案选择​方案适用场景优缺点​Web SDK&#xff08;3.0&#xff09;​​需要完整功能&#xff08;PTZ控制、录像回放&#xff09;功能全&#xff0c;但需加载海康JS文件​RTSP转Web播放​低延迟实时监控需后端转码&#xff08;如FFmpeg转HLS&#xff09;​HTTP API​简单截图或…

openGL学习(Shader)

认识Shader在计算机图形学中&#xff0c;Shader&#xff08;着色器&#xff09;是一种运行在 GPU&#xff08;图形处理单元&#xff09;上的程序&#xff0c;用于控制图形渲染过程中顶点和像素的处理。着色器是 OpenGL、Direct3D、Vulkan 等图形 API 的核心组成部分&#xff0c…

webpack高级配置

一、了解webpack高级配置&#xff1a; 1、什么是webpack高级配置&#xff1a; 进行 Webpack 优化&#xff0c;让代码在编译或者运行时性能更好 2、webpack优化从哪些方面入手&#xff1a; ① 提升开发体验&#xff0c;增强开发和生产环境的代码调试&#xff1a; 如果代码编写…

LLM表征工程还有哪些值得做的地方

LLM表征工程还有哪些值得做的地方 在大型语言模型(LLM)的表征工程领域,近年来涌现出多个具有突破性的创新方向,这些方法通过动态调整、多模态融合、结构化记忆增强等技术,显著提升了模型的适应性、可解释性和效率。 一、动态自适应表征:从静态到动态的范式革新 传统LL…

LabVIEW智能避障小车

​LabVIEW结合 NI、德州仪器&#xff08;TI&#xff09;、欧姆龙&#xff08;Omron&#xff09;等硬件&#xff0c;设计实现了一款具备智能避障、循迹功能的轮式机器人。系统支持手动操控与自主运行两种模式&#xff0c;通过无线通信实时传输传感器数据与图像信息&#xff0c;在…

逻辑代数中的基本规则,代入规则和反演规则,对偶规则

本文探讨了代入规则在逻辑等式中的应用&#xff0c;解释了如何通过替换变量来保持等式的正确性&#xff0c;同时介绍了反演规则和对偶规则的概念。代入规则定义:在任何一个包含变量A的逻辑等式中&#xff0c;如果用另一个逻辑式代入式中的所有A位置&#xff0c;则等式依然成立反…

Javaweb使用websocket,请先连上demo好吧!很简单的!

Javaweb使用websocket先看结构及效果MyWebSocketHandler用于处理消息WebSocketConfig用于配置建联地址等SchedulerConfig必须配置这个MyWebSocketInterceptor建联的拦截器SpringBootWebsocketApplication启动类POM依赖展示效果源码先看结构及效果 MyWebSocketHandler用于处理消…

文心大模型4.5开源测评:保姆级部署教程+多维度测试验证

前言&#xff1a;国产大模型开源的破局时刻 2025年6月百度文心大模型4.5系列的开源&#xff0c;标志着国产AI从"技术跟跑"向"生态共建"的关键跨越。 文心大模型4.5是百度自主研发的新一代原生多模态基础大模型&#xff0c;通过多个模态联合建模实现协同优…

前端学习5:Float学习(仅简单了解,引出flex)

一、Float基础概念1. 设计初衷&#xff1a; float最初是为实现文字环绕图片的效果&#xff08;类似杂志排版&#xff09;&#xff0c;后来被开发者用来做页面布局。2. 核心特性&#xff1a;使元素脱离普通文档流&#xff08;但仍在DOM中&#xff09;元素会向左/右浮动&#xff…

08-自然壁纸实战教程-视频列表-云

08-自然壁纸实战教程-视频列表 前言 视频列表页面本质上也是一个数据展示的列表&#xff0c;不同之处在于之前是是展示壁纸&#xff0c;Image组件负责渲染&#xff0c;这里展示的是视频&#xff0c;使用Video组件&#xff0c;另外视频页面也实现了下载的基本功能&#xff0c;…

SCI特刊征稿

我们团队联合北京工业大学研究团队在SCI源刊CMC组织了特刊SI: Advanced Edge Computing and Artificial Intelligence in Smart Environment,主要收录边缘计算和人工智能方向的文章&#xff0c;欢迎领域专家和学者投稿&#xff0c;网址https://www.techscience.com/cmc/special…

DO,VO,DTO.....

在 Java 项目里&#xff08;尤其是 Spring、MyBatis 这类框架&#xff09;&#xff0c;经常会看到一堆以 O 结尾的类&#xff1a;VO、DO、DTO、BO、POJO……它们本质上都是普通的 Java Bean&#xff08;即 POJO&#xff09;&#xff0c;但职责和出现的位置不同。下面用“用户下…

数据结构之并查集和LRUCache

系列文章目录 数据结构之ArrayList_arraylist o(1) o(n)-CSDN博客 数据结构之LinkedList-CSDN博客 数据结构之栈_栈有什么方法-CSDN博客 数据结构之队列-CSDN博客 数据结构之二叉树-CSDN博客 数据结构之优先级队列-CSDN博客 常见的排序方法-CSDN博客 数据结构之Map和Se…

UE5多人MOBA+GAS 21、给升龙添加连段攻击,从角色的按下事件中传递事件给GA

文章目录给升龙制作可连段缓存下一连段用普攻键来触发升龙后续的连段在角色中发送按下普攻标签事件在升龙中接收按下事件&#xff0c;触发连段以及伤害和力量的传递最后在蓝图中设置一下升龙技能的完整代码给升龙制作可连段 给升龙技能添加一些连段 缓存下一连段 缓存下一连…

基于光栅传感器+FPGA+ARM的测量控制解决方案

基于光栅传感器结合FPGA与ARM的测量控制解决方案&#xff0c;通过硬件协同分工实现高精度、实时性及多场景适应性&#xff1a;⚙️ ‌一、系统架构分工‌‌传感层&#xff08;光栅传感器&#xff09;‌采用光栅尺输出正交脉冲信号&#xff0c;分辨率达0.5μm&#xff0c;精度1μ…

NW831NW910美光固态闪存NW887NW888

美光固态闪存深度解析&#xff1a;NW831、NW910、NW887、NW888系列全方位评测一、技术根基与架构创新美光NW系列固态闪存的技术突破源于其先进的G9 NAND架构&#xff0c;该架构采用5纳米制程工艺和多层3D堆叠技术&#xff0c;在单位面积内实现了高达256层的存储单元堆叠&#x…

reasense api 文档

API 架构 英特尔实感&#xff08;Intel RealSense™&#xff09;API 提供对深度摄像头流数据的配置、控制和访问功能。该 API 支持通过高层级 API 快速启用摄像头基础功能&#xff0c;或通过底层级 API 全面控制所有摄像头设置。请根据需求选择合适的 API&#xff1a; 高层级 P…

ArkTs实现骰子布局

Entry Component struct workA {// 定义6种颜色数组&#xff0c;使用ResourceColor类型确保颜色值合法性State color: ResourceColor[] [#ef2816, #f0a200, #6ab002, #005868, #41192e, #141411]// 定义公共样式装饰器&#xff0c;避免重复样式代码Stylesys() {// 白色圆形基础…