使用者空間實現系統呼叫的兩種方式

2021-08-26 09:09:02 字數 981 閱讀 2976

一種是間接的系統呼叫:syscall(sys_***); 其中 sys_*** 是系統呼叫號;

另一種是通過api函式,api函式一般會自動呼叫核心空間中同名的系統呼叫函式。

舉例如下:

#include

#include

#include

#include

int main(void)

編譯:[root@google linux]# gcc -o syscall.o syscall.c

執行:[root@google linux]# ./syscall.o

syscall(sys getpid)=4710

getpid()=4710

系統呼叫執行過程示意圖如下:

api庫函式完全執行在使用者空間,很多是由編譯器提供的,但庫函式歸根結底還是要由核心態的系統呼叫來具體執行和實現。比如:標準c庫函式printf()可以被看做是乙個通用的輸出語句,但它實際做的是將資料轉化為符合格式的字串並且呼叫系統呼叫 write()輸出這些字串。這一點可以用strace命令跟蹤到。

strace描述如下:

name

strace - trace system calls and signals

synopsis

strace  [  -dffhiqrttttvxx  ]  [  -acolumn ] [ -eexpr ] ...  [ -ofile ] [ -ppid ] ...  [ -sstrsize ] [

-uusername ] [ -evar=val ] ...  [ -evar ] ...  [ command [ arg ...  ] ]

strace -c [ -eexpr ] ...  [ -ooverhead ] [ -ssortby ] [ command [ arg ...  ] ]

執行緒實現的兩種方式 使用者空間和核心中

特點 整個執行緒包放入使用者空間中,核心對執行緒包一無所知。從核心角度考慮,就是按正常的方式管理,即單執行緒程序 優點 1 使用者級執行緒包可以在不支援執行緒的作業系統上實現 2 執行緒切換比核心快更多 3 允許每個程序有自己定製的排程演算法 缺點 執行緒發生i o或頁面故障引起的阻塞時,如果呼叫阻...

呼叫 系統呼叫函式write 的兩種實現

我們知道呼叫 系統呼叫 有兩種方式。1 將系統呼叫指令封裝為 c庫函式,通過庫函式進行系統呼叫,操作簡單。2 不依賴任何庫函式,直接通過彙編指令 int與作業系統通訊。我們平常寫的c語言用的就是第一種系統呼叫,通過函式呼叫write函式,我們下面用組合語言來重寫一下,利用我們定義的simu writ...

spring cloud的兩種呼叫方式

新建乙個spring cloud專案 引入依賴包 org.springframework.cloud spring cloud starter eureka org.springframework.cloud spring cloud starter ribbon 修改配置檔案 name servi...