首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

函數指針、回調函數、系統調用:三者區別與聯系深度解析

     編輯:關於C語言

1. 函數指針

指向函數入口地址的指針變量,實現靜態綁定(編譯/鏈接時確定目標)。

int add(int a, int b) { return a + b; }
int (*fp)(int, int) = add;  // 賦值
int c = fp(2, 4);           // 調用

2. 回調函數

將函數指針作為參數傳遞給另一函數,實現動態綁定(運行時確定具體行為),體現「好萊塢原則」:Don't call us, we'll call you。

int add(int a, int b) { return a + b; }  // 回調實現
int executor(int a, int b, int (*fp)(int, int)) {  // 中間層
    return fp(a, b);
}
int main() {
    int c = executor(2, 4, add);  // 傳入函數名
    printf("%d\n", c);
}

核心特徵:

  • 函數名作為參數傳遞。
  • 調用者與實現分離,調用者無需關心具體算法細節。
  • 廣泛用於框架、事件驅動、泛型算法(如 qsort 比較函數)。

3. 系統調用

用戶態程序請求內核服務的受控接口,涉及特權級切換。

用戶態調用 read()
    → 軟中斷 0x80 (或 syscall/sysenter 指令)
    → 系統調用號傳遞(EAX/RAX)
    → 內核系統調用表查找入口
    → 內核態執行對應處理函數
    → 返回用戶態,恢復上下文

實現機制:

  • 中斷/快速系統調用指令觸發 CPU 特權級從 Ring 3 到 Ring 0。
  • 參數通過寄存器傳遞(x86: EBX, ECX, EDX, ESI, EDI, EBP;x86_64: RDI, RSI, RDX, R10, R8, R9)。
  • 返回值在 EAX/RAX。
  • 完成後經 iret/sysret 返回用戶態。

對比總結

維度函數指針回調函數系統調用
本質代碼地址變量函數指針作參數的調用模式用戶態→內核態受控轉移
綁定時機靜態(賦值時)動態(調用時)運行時(中斷向量表)
權限用戶態用戶態跨特權級
典型用途間接調用、狀態機框架回調、插件、泛型算法I/O、進程控制、內存管理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved