函數指針、回調函數、系統調用區別
1.函數指針
1 int add(int a, int b) 2 { 3 return a+b; 4 } 5 6 int (*fp)(int,int); 7 8 int main() 9 { 10 int c; 11 fp = add; //有指針賦值操作,靜態綁定 12 c = fp(2,4); 13 printf("c = %d\n",c); 14 return 0; 15 }
2.回調函數
1 int add(int a, int b) //回調函數 2 { 3 return a+b; 4 } 5 6 int fun(int a, int b, void(*fp)())//中間函數,動態綁定,與傳遞的函數名有關 7 { 8 return fp(a,b); 9 } 10 11 int main() 12 { 13 int c; 14 c = fun(2,4); 15 printf("c = %d\n",c); 16 return 0; 17 }
體現: 1.函數名作為參數傳遞給調用函數。
2.將調用者和被調函數分開,回調函數實現具體的功能,調用者無需關注實現的具體細節。
3.系統調用
系統調用 --> (0x80)軟中斷(系統調用表) --> 內核函數 --> 返回到系統調用層
read --> 系統調用號--內核函數入口 --> 實現功能 --> 返回調用結果
實現方式: 通過中斷實現,使用寄存器傳參
進程經歷了從用戶態到內核態的切換,處理完成後再恢復到用戶態繼續完成系統調用的過程。