018 進程控制 —— 進程等待

🦄 個人主頁: 小米里的大麥-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() {// 白色圓形基礎…