進程控制----進程終止

一、進程終止的核心場景

正常終止(代碼完整運行完畢)

  • 成功:進程執行到main函數結束或調用exit(),返回退出碼 0(約定為執行成功)。
  • 失敗:代碼執行完畢但結果異常,返回非零退出碼(如1表示內存錯誤,2表示文件錯誤)。

異常終止

  • 觸發條件
    • 運行時發生致命錯誤(如野指針、除零操作)。
    • 收到操作系統或其他進程發送的強制終止信號(如?kill?命令)。
  • 關鍵特征
    • 未執行到?return?或?exit,無顯式退出碼。
    • 終止由操作系統通過信號機制強制完成(后續詳細講解,此處先理解為 “錯誤通知”)。

二、正常終止:退出碼的本質與用途

(一)main函數返回值的含義

退出碼:進程向父進程(或 Shell)傳遞的執行狀態標識。

  • return 0;?→ 成功(如命令行中echo $?輸出0)。
  • return non-zero;?→ 失敗,非零值可自定義為具體錯誤類型(如1= 內存申請失敗)。

接收者

  • Shell:通過echo $?獲取上一個進程的退出碼。
  • 父進程:通過特定接口獲取(后續補充)。

(二)echo $?命令與退出碼查看

作用:查看命令行中最近一個正常終止進程的退出碼。

$ ./program  # 假設程序返回退出碼3
$ echo $?    # 輸出3(非零表示失敗)
$ ls -l       # 正常執行,退出碼為0
$ echo $?    # 輸出0

(三)代碼示例:退出碼的設置與應用

1.基礎示例:返回成功 / 失敗碼

#include <stdio.h>
int main() {int result = 1; // 1表示成功,0表示失敗return result ? 0 : 1; // 成功返回0,失敗返回1
}

2.系統錯誤碼示例(文件打開失敗)

#include <stdio.h>
#include <errno.h> // 包含系統錯誤碼定義int main() {FILE *fp = fopen("nonexist.txt", "r");if (!fp) {return errno; // 返回系統錯誤碼(如2表示"文件不存在")}fclose(fp);return 0;
}
  • 運行后echo $?輸出2,對應錯誤描述為 "No such file or directory"。

3.自定義錯誤碼體系

#define ERR_MEMORY 1 // 內存申請失敗
#define ERR_FILE 2   // 文件操作失敗int main() {char *p = (char*)malloc(1024);if (!p) return ERR_MEMORY; // 內存不足時返回1free(p);return 0;
}

三、錯誤碼的解析與轉換

(一)strerror:錯誤碼轉文本描述

  • 作用:將整數錯誤碼轉換為可讀字符串(需包含string.h)。
  • 示例:打印系統錯誤碼描述
    #include <stdio.h>
    #include <string.h>int main() {for (int i = 0; i < 200; i++) {printf("%d: %s\n", i, strerror(i)); // 輸出如"2: No such file or directory"}return 0;
    }
    • 運行結果:
      0:Success
      1:Operation not permitted
      2:No such file or directory
      3:No such process
      4:Interrupted system call
      5:Input/output error
      6:No such device or address
      7:Argument list too long
      8:Exec format error
      9:Bad file descriptor
      10:No child processes
      11:Resource temporarily unavailable
      12:Cannot allocate memory
      13:Permission denied
      14:Bad address
      15:Block device required
      16:Device or resource busy
      17:File exists
      18:Invalid cross-device link
      19:No such device
      20:Not a directory
      21:Is a directory
      22:Invalid argument
      23:Too many open files in system
      24:Too many open files
      25:Inappropriate ioctl for device
      26:Text file busy
      27:File too large
      28:No space left on device
      29:Illegal seek
      30:Read-only file system
      31:Too many links
      32:Broken pipe
      33:Numerical argument out of domain
      34:Numerical result out of range
      35:Resource deadlock avoided
      36:File name too long
      37:No locks available
      38:Function not implemented
      39:Directory not empty
      40:Too many levels of symbolic links
      41:Unknown error 41
      42:No message of desired type
      43:Identifier removed
      44:Channel number out of range
      45:Level 2 not synchronized
      46:Level 3 halted
      47:Level 3 reset
      48:Link number out of range
      49:Protocol driver not attached
      50:No CSI structure available
      51:Level 2 halted
      52:Invalid exchange
      53:Invalid request descriptor
      54:Exchange full
      55:No anode
      56:Invalid request code
      57:Invalid slot
      58:Unknown error 58
      59:Bad font file format
      60:Device not a stream
      61:No data available
      62:Timer expired
      63:Out of streams resources
      64:Machine is not on the network
      65:Package not installed
      66:Object is remote
      67:Link has been severed
      68:Advertise error
      69:Srmount error
      70:Communication error on send
      71:Protocol error
      72:Multihop attempted
      73:RFS specific error
      74:Bad message
      75:Value too large for defined data type
      76:Name not unique on network
      77:File descriptor in bad state
      78:Remote address changed
      79:Can not access a needed shared library
      80:Accessing a corrupted shared library
      81:.lib section in a.out corrupted
      82:Attempting to link in too many shared libraries
      83:Cannot exec a shared library directly
      84:Invalid or incomplete multibyte or wide character
      85:Interrupted system call should be restarted
      86:Streams pipe error
      87:Too many users
      88:Socket operation on non-socket
      89:Destination address required
      90:Message too long
      91:Protocol wrong type for socket
      92:Protocol not available
      93:Protocol not supported
      94:Socket type not supported
      95:Operation not supported
      96:Protocol family not supported
      97:Address family not supported by protocol
      98:Address already in use
      99:Cannot assign requested address
      100:Network is down
      101:Network is unreachable
      102:Network dropped connection on reset
      103:Software caused connection abort
      104:Connection reset by peer
      105:No buffer space available
      106:Transport endpoint is already connected
      107:Transport endpoint is not connected
      108:Cannot send after transport endpoint shutdown
      109:Too many references: cannot splice
      110:Connection timed out
      111:Connection refused
      112:Host is down
      113:No route to host
      114:Operation already in progress
      115:Operation now in progress
      116:Stale file handle
      117:Structure needs cleaning
      118:Not a XENIX named type file
      119:No XENIX semaphores available
      120:Is a named type file
      121:Remote I/O error
      122:Disk quota exceeded
      123:No medium found
      124:Wrong medium type
      125:Operation canceled
      126:Required key not available
      127:Key has expired
      128:Key has been revoked
      129:Key was rejected by service
      130:Owner died
      131:State not recoverable
      132:Operation not possible due to RF-kill
      133:Memory page has hardware error
      134:Unknown error 134
      135:Unknown error 135
      136:Unknown error 136
      137:Unknown error 137
      138:Unknown error 138
      139:Unknown error 139
      140:Unknown error 140
      141:Unknown error 141
      142:Unknown error 142
      143:Unknown error 143
      144:Unknown error 144
      145:Unknown error 145
      146:Unknown error 146
      147:Unknown error 147
      148:Unknown error 148
      149:Unknown error 149
      150:Unknown error 150
      151:Unknown error 151
      152:Unknown error 152
      153:Unknown error 153
      154:Unknown error 154
      155:Unknown error 155
      156:Unknown error 156
      157:Unknown error 157
      158:Unknown error 158
      159:Unknown error 159
      160:Unknown error 160
      161:Unknown error 161
      162:Unknown error 162
      163:Unknown error 163
      164:Unknown error 164
      165:Unknown error 165
      166:Unknown error 166
      167:Unknown error 167
      168:Unknown error 168
      169:Unknown error 169
      170:Unknown error 170
      171:Unknown error 171
      172:Unknown error 172
      173:Unknown error 173
      174:Unknown error 174
      175:Unknown error 175
      176:Unknown error 176
      177:Unknown error 177
      178:Unknown error 178
      179:Unknown error 179
      180:Unknown error 180
      181:Unknown error 181
      182:Unknown error 182
      183:Unknown error 183
      184:Unknown error 184
      185:Unknown error 185
      186:Unknown error 186
      187:Unknown error 187
      188:Unknown error 188
      189:Unknown error 189
      190:Unknown error 190
      191:Unknown error 191
      192:Unknown error 192
      193:Unknown error 193
      194:Unknown error 194
      195:Unknown error 195
      196:Unknown error 196
      197:Unknown error 197
      198:Unknown error 198
      199:Unknown error 199
      

(二)errno:最近一次錯誤碼

  • 作用:C 標準庫全局變量,存儲最近一次函數調用失敗的錯誤碼(需包含errno.h)。
  • 示例:結合errno定位問題
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>int main() {char *p = malloc(4 * 1024 * 1024 * 1024); // 申請大內存可能失敗if (!p) {printf("malloc error: errno=%d (%s)\n", errno, strerror(errno));return errno; // 返回系統錯誤碼(如12表示"Cannot allocate memory")}free(p);return 0;
    }

?四、異常終止的本質:硬件錯誤與信號

當程序出現非法操作時,CPU 會檢測到硬件異常(如訪問無效內存),操作系統將其轉化為信號發送給進程,強制終止程序。

常見異常信號與對應錯誤

信號名稱編號錯誤場景舉例終端提示信息
SIGSEGV11野指針(訪問空指針或無效內存)Segmentation fault
SIGFPE8除零操作、浮點運算錯誤Floating point exception
SIGKILL9強制終止(如?kill -9?命令)無提示,直接終止

代碼示例 1:野指針導致異常終止

#include <stdio.h>
int main() {char* p = NULL; // 空指針,無合法內存映射*p = 100;       // 嘗試向空指針寫入數據,觸發SIGSEGVreturn 0;       // 此行代碼不會執行
}

運行結果

Segmentation fault  # 操作系統發送SIGSEGV信號終止進程

五、退出碼的有效性:何時需要關注?

1. 退出碼有意義的前提

  • 僅當進程正常終止(未收到任何異常信號)時,main?的?return?或?exit?設置的退出碼才有意義。

2. 異常場景下退出碼不可靠

  • 若進程因信號終止(如野指針),未執行到?return,無退出碼;
  • 即使執行了?return,若系統資源不足導致退出失敗,退出碼也可能失效。
  • 結論
    • 異常終止時,優先排查信號原因(如為什么收到?SIGSEGV),而非關注退出碼;
    • 正常終止時,再通過退出碼判斷邏輯結果(0?成功,非?0?失敗)。

六、kill命令模擬異常終止(實踐驗證)

代碼示例 2:運行中進程接收信號測試

#include <stdio.h>
#include <unistd.h> // getpid() 獲取進程ID
int main() {while (1) {printf("運行中,PID: %d\n", getpid()); // 打印進程IDsleep(1); // 每秒輸出一次,方便觀察}return 0; // 死循環,無法執行到此處
}

操作步驟

1.編譯并運行程序

2.另開終端查看進程 PID(假設輸出為?29084

ps ajx | head -1 && ps ajx | grep test_signal

3.模擬異常終止:

  • 發送?SIGFPE(除零錯誤信號):
    kill -8 12345  # 終端顯示:Floating point exception
  • 發送?SIGSEGV(段錯誤信號):
    kill -11 12345 # 終端顯示:Segmentation fault
  • 發送?SIGKILL(強制終止信號):
    kill -9 12345  # 進程直接終止,無錯誤提示

驗證結論

  • 進程異常終止的本質是收到特定信號,信號編號對應不同錯誤類型。
  • 通過?kill -信號編號 PID?可主動模擬各類異常場景。

七、進程狀態判斷的核心邏輯

第一步:是否異常終止?

  • 判斷依據:是否收到信號(如?SIGSEGV/SIGFPE)。
  • 處理方式
    • 是:優先排查代碼中的硬件級錯誤(如野指針、除零)。
    • 否:進入下一步判斷。

第二步:退出碼是否成功?

  • 判斷依據:正常終止時的退出碼(return?或?exit?的值)。
  • 處理方式
    • 退出碼=0:程序邏輯執行成功。
    • 退出碼≠0:程序邏輯執行失敗(如參數錯誤、文件讀取失敗等)。

八、進程終止:return、exit 與_exit 的區別

1.進程終止的三種核心方式

return(C關鍵字)

  • 作用范圍
    • 在普通函數中:僅表示當前函數返回,程序繼續執行調用處的后續代碼(不終止進程)。
    • main函數中:等價于exit(返回值),會終止進程并設置退出碼(如return 0表示成功)。
  • 核心特點
    • 依賴函數調用關系,不能在非main函數中直接終止進程。
    • main函數中使用時,會隱式調用exit完成資源清理(如刷新緩沖區)。
  • 代碼示例:return 在不同場景的差異
    // 場景1:return在普通函數中僅返回
    void show() {printf("進入show函數\n");return; // 函數返回,不終止進程printf("show函數結束(不會執行)\n"); // 此行代碼不會執行
    }int main() {show(); // 調用show函數后返回printf("回到main函數繼續執行\n"); // 會執行return 12; // main中return等價于exit(12),終止進程
    }

    運行結果

    進入show函數
    回到main函數繼續執行

    echo $?輸出12(退出碼為 12)。

exit(C 標準庫函數)

  • 作用
    • 在任意函數中調用:立即終止進程,并執行清理操作(如刷新緩沖區、關閉文件流)。
    • 可顯式設置退出碼(范圍:0~255,0 表示成功,非 0 表示錯誤)。
  • 與 main 中 return 的等價性
    int main() {exit(12); // 完全等價于 return 12;
    }

    驗證:編譯運行后,echo $?輸出12

_exit(系統調用)

  • 作用
    • 直接調用操作系統內核接口終止進程,不執行任何用戶空間清理操作(如不刷新緩沖區)。
    • 屬于底層系統調用,比exit更 “輕量”,但可能導致數據丟失(若有未刷新的緩沖區)。
  • 與 exit 的關系
    exit(n) = 先執行清理操作(刷新緩沖區等) → 再調用 _exit(n);

2.exit vs _exit:緩沖區刷新的關鍵區別

緩沖區的刷新規則

  • printf的緩沖區位于用戶空間
    • 若輸出內容包含\n,或調用fflush,或進程通過exit終止,緩沖區會被刷新,數據輸出到終端。
    • 若進程通過_exit終止,緩沖區不會被刷新,數據可能丟失。

代碼示例 1:帶\n的輸出(緩沖區自動刷新)

int main() {printf("帶\n的輸出:hello world!\n"); // \n觸發緩沖區刷新_exit(11); // 即使調用_exit,數據已刷新,會顯示return 0;
}

運行結果:

代碼示例 2:不帶\n的輸出(依賴終止方式刷新)

int main() {printf("不帶\n的輸出:hello world!"); // 數據暫存用戶空間緩沖區// exit(11);    // 調用exit會刷新緩沖區,數據會顯示_exit(11);     // 調用_exit不刷新緩沖區,數據不顯示return 0;
}

運行結果

  • exit(11):終端顯示輸出,echo $?輸出11
  • _exit(11):終端無輸出,echo $?輸出11

清理操作的差異

特性exit(庫函數)_exit(系統調用)
緩沖區處理刷新用戶空間緩沖區(如printf的數據)不刷新緩沖區,直接終止進程
資源清理關閉文件流、執行注冊的清理函數僅回收內核資源,不處理用戶空間邏輯
調用層級上層庫函數(調用_exit前先做清理)底層系統調用(直接終止進程)
適用場景日常開發(確保數據正確輸出)底層場景(如需要快速終止的程序)

3.return vs exit:作用域與靈活性對比?

代碼示例:return?在非 main 函數中

void show() {printf("進入show函數\n");return 13;printf("show函數結束(不會執行)\n"); // 此行代碼不會執行
}int main() {show(); // 調用show后直接終止,不會回到mainprintf("回到main\n");return 12;
}

運行結果:

echo $?輸出13(exit 設置的退出碼)。

代碼示例:exit?在非 main 函數中終止

void show() {printf("進入show函數\n");exit(13); // 無論在哪層函數,exit都會終止進程printf("show函數結束(不會執行)\n"); // 此行代碼不會執行
}int main() {show(); // 調用show后直接終止,不會回到mainprintf("回到main\n");return 12;
}

運行結果:

echo $?輸出13(exit 設置的退出碼)。

特性return(僅在 main 中終止進程)exit(任意位置終止進程)
終止范圍僅在main函數中終止進程在任意函數中調用均終止進程
代碼位置必須位于main函數末尾可位于程序任意位置(如循環、條件語句中)
緩沖區處理等價于exit(隱式調用exit顯式刷新緩沖區
典型場景main函數邏輯正常結束時返回結果需在非main函數中強制終止進程

4.核心結論

  • returnmain中等價于exit,但在普通函數中僅返回;
  • exit是 “安全終止”,會刷新緩沖區,確保數據輸出;
  • _exit是 “暴力終止”,適合底層場景,但可能導致數據丟失。
  • 優先使用exitmain中的return,確保程序行為可預期。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89896.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89896.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89896.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Milvus docker-compose 部署

文章目錄 前言Milvus docker-compose 部署1. 下載2. 修改配置3. 啟動4. 測試 前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0c;實在白嫖的…

EveryThing搜索具體路徑下文件中的內容

1.打開EveryThing 2.點擊搜索&#xff0c;選擇高級搜索 3.選擇需要搜索的文件的路徑以及文件中需要包含的內容 4.之后就可以搜索到對應的目標文件

【算法】寬度優先遍歷BFS

二叉樹的寬搜 429、N叉樹的層序遍歷 題解 BFS核心思想 二叉樹的寬搜一般都是借助隊列來實現的&#xff0c;實現的原理為首先將根節點進行放入隊列中&#xff0c;然后將根節點進行彈出的時候&#xff0c;將這個節點的孩子節點進行放入隊列中&#xff0c;然后繼續彈出隊頭的元…

【STM32】通用定時器基本原理

STM32 通用定時器基本原理&#xff08;基于 STM32F1&#xff09;參考資料&#xff1a;STM32F1xx官方資料&#xff1a;《STM32中文參考手冊V10》-第14章通用定時器STM32 定時器分類 STM32F103 系列共有三類定時器&#xff1a;&#x1f50e; 通用定時器&#xff08;TIM2~TIM5&…

【Go語言-Day 14】深入解析 map:創建、增刪改查與“鍵是否存在”的奧秘

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

Vue腳手架搭建項目+基礎知識

1. 使用腳手架創建項目1.1 準備工作winR&#xff0c;在彈出的數據框中輸入cmd&#xff0c;數據命令查看node以及npm版本 下載vue cli1.2 創建項目1.2.1 創建一個英文目錄文件夾&#xff0c;cmd打開命令命令提示符1.2.2 vue ui命令打開控制臺1.2.3 創建項目創建成功1.3 項目結構…

微信小程序下單頁—地址列表頁—新增地址頁 頁面交互

新增地址流程&#xff1a; 下單頁 → 地址列表頁 (1次跳轉)地址列表頁 → 新增地址頁 (1次跳轉)保存地址 → 返回地址列表頁 (1次返回&#xff0c;自動刷新列表) 選擇地址流程&#xff1a; 地址列表頁 → 選中地址 → 返回下單頁 (1次返回) 更換地址&#xff1a; 下單頁 → 地址…

JVM與JMM

為了更清晰地對比JVM和JMM&#xff0c;我們可以采用表格形式&#xff0c;從定義、功能、結構、與多線程關系等方面進行詳細比較&#xff1a; 對比項JVM&#xff08;Java Virtual Machine&#xff09;JMM&#xff08;Java Memory Model&#xff09;定義一種虛構的計算機&#x…

【Docker基礎】Docker數據卷管理:docker volume rm及其參數詳解

目錄 1 引言&#xff1a;Docker Volume 的生命周期管理 2 docker volume rm命令基礎 2.1 命令作用 2.2 命令語法 3 參數深度解析 3.1 基礎參數表 3.2 高級參數詳解 3.2.1 --force&#xff08;-f&#xff09; 4 Volume刪除前置條件 4.1 可刪除狀態判斷 4.2 常見報錯處…

嵌入式系統內核鏡像相關(十)

文章目錄 前言一、點亮多個led燈的基礎實驗以及其中的問題1.1 基礎流程1.1.1 alinx教程的問題1.1.1.1 驅動程序中的亮/滅邏輯修改&#xff01;1.1.1.1.1 邏輯錯誤的修改1.1.1.1.2 多燈亮/滅 1.1.1.2 驅動程序中引腳的問題以及與裸機開發的區別&#xff08;重要&#xff09;1.1.…

Word和Excel批量轉PDF新方法,操作簡單

PDF是一種跨平臺的文檔格式&#xff0c;無論在任何設備上查看&#xff0c;其排版、字體和圖像都不會發生變化。這確保了文檔的一致性&#xff0c;避免了由于不同軟件版本或操作系統引起的顯示問題。這款小巧的工具大小不到2MB&#xff0c;使用起來異常簡單。只需要把需要轉換的…

AI搜索 MCP最佳實踐

背景 那些 LLM 不知道的事 嘗試直接詢問LLM“今天天氣如何”時&#xff0c;會發現LLM無法回答——它既不知道“今天”是哪天&#xff0c;也無法獲取地理位置信息。這揭示了LLM的局限&#xff1a;缺乏與外部工具和實時數據的交互能力。 為解決這一問題&#xff0c;MCP&#x…

JVM 簡介與作用

&#x1f680; JVM 簡介與作用 &#x1f4da; 深入理解 Java 虛擬機的核心概念與重要作用 &#x1f4d6; 目錄 &#x1f914; 什么是 Java 虛擬機&#xff08;JVM&#xff09;&#x1f310; JVM 在 Java 生態中的核心地位&#x1f500; JVM 跨平臺原理剖析&#x1f4dd; 總結 …

? OpenAudio S1:影視級文本轉語音與語音克隆Mac整合包

? OpenAudio S1&#xff1a;影視級文本轉語音與語音克隆Mac整合包 &#x1f680; OpenAudio S1 簡介 OpenAudio S1 是由 Fish Audio 開發的 Fish Speech 系列的最新一代人工智能語音生成模型。該模型旨在大幅提升 AI 語音生成的技術水平&#xff0c;為用戶提供更加自然、富有表…

spring加載外部properties文件屬性時,讀取到userName變量值和properties文件的值不一致

問題 使用spring DI注入外部properties文件屬性時&#xff0c;讀取到userName變量值和properties文件的值不一致。 bean屬性注入&#xff1a; <!--加載配置文件--> <context:property-placeholder location"classpath:*.properties"/><bean id"…

黑馬點評系列問題之基礎篇p7 06初識redis無法在虛擬機查到圖形化界面存進去的鍵

問題描述 在RESP中輸入了一些鍵(name,age等這些) 但是在圖形化界面里面輸入的&#xff0c;在非圖形化界面就找不到&#xff0c;在非圖形化界面里輸入的&#xff0c;在圖形化界面里就可以查到。 原因分析及解決 經過多次實驗&#xff0c;發現是因為在添加鍵名的時候&#xff0…

在VMware虛擬機中安裝Windows 98時,Explorer提示“該程序執行了非法操作,即將關閉”的解決辦法

在使用iso文件&#xff08;MD5: 0E496B5DCC519F550AAF0BCFBB4A11EA&#xff09;安裝Windows98時&#xff0c;遇到此提示。 雖然原因未知&#xff0c;也無需深入探究&#xff0c;但是根據網友在 https://www.bilibili.com/opus/435866522585702782 中給出的相似經驗&#xff…

在瀏覽器中使用SQLite(官方sqlite3.wasm)

有人可能會問&#xff1a;既然瀏覽器里又內置得IndexedDB&#xff0c;而且在IndexedDB里存數據&#xff0c;關了瀏覽器數據也不會丟&#xff0c;為什么還要在瀏覽器里用SQLite? 實際上&#xff0c;當 IndexedDB 內的數據量增多&#xff0c;數據和數據之間的關系變得復雜&…

數據結構(Java)--位運算

前言 本文為本小白學習數據結構的筆記&#xff0c;將以算法題為導向&#xff0c;向大家更清晰的介紹數據結構相關知識&#xff08;算法題都出自B站馬士兵教育——左老師的課程&#xff0c;講的很好&#xff0c;對于想入門刷題的人很有幫助&#xff09; 為什么要使用為位運算 位…

秋招Day14 - Redis - 應用

Redis如何實現異步消息隊列&#xff1f; List配合LPUSH和RPOP。 另外就是用 Redis 的 Pub/Sub 來實現簡單的消息廣播和訂閱。 但是這兩種方式都是不可靠的&#xff0c;因為沒有 ACK 機制所以不能保證訂閱者一定能收到消息&#xff0c;也不支持消息持久化。 Redis如何實現延時…