Linux中應用程式如何使用系統呼叫

2021-05-23 18:16:35 字數 1847 閱讀 9605

最近在做android,其中乙個任務是寫乙個能在linux命令列執行的測試ap,執行這個ap就能關閉裝置電源,即power off。

在linux核心中已經找到了關閉電源的函式kernel_power_off(),然後也知道了在sys_reboot()函式中呼叫kernel_power_off()的,但是linux的應用程式怎麼呼叫sys_reboot()呢? 經過1天的研究,終於搞明白了

這樣的函式屬於linux的系統呼叫函式(system call),需要用system call的方式呼叫,一共有下面3中途徑:

一、使用標準c庫函式

例如我們使用open(), read(), write()等標準c函式時,實際上是經過c庫包裝了的sys_open(),sys_read(),sys_write()等函式,這個包裝過程不用我們操心。這應該是屬於隱性呼叫system call。

二、在linux 2.6.18以前版本

include/asm-arm/unistd.h檔案中定義了7個_syscall巨集,分別是:

_syscall0(type, name)  

_syscall1(type, name,type1,arg1)  

_syscall2(type, name,type1,arg1,type2,arg2)  

_syscall3(type, name,type1,arg1,type2,arg2,type3,arg3)  

_syscall4(type, name,type1,arg1,type2,arg2,type3, arg3,type4,arg4)  

_syscall5(type, name,type1,arg1,type2,arg2,type3, arg3,type4,arg4,type5,arg5)  

_syscall6(type, name,type1,arg1,type2,arg2,type3, arg3,type4,arg4,type5,arg5,type6,arg6)

這7個巨集是用來產生系統呼叫的函式名的,其中type表示系統呼叫的返回值型別,name表示該系統呼叫的名稱,typen、argn分別表示第n個引數的型別和名稱,它們的數目和_syscall後面的數字一樣大。

另外,include/linux/syscalls.h檔案中定義有所用系統呼叫函式的原型,例如:

asmlinkage int sysinfo(struct sysinfo * info);

在需要系統呼叫的時候,先找到要呼叫的函式的宣告,看有多少個引數,然後用上面7個巨集中的對應的乙個,產生函式名,還是以sysinfo為例:

_syscall1(int, sysinfo, struct sysinfo *, info);

然後在呼叫的地方直接用sysinfo()函式就可以了:

struct sysinfo s_info;  

int error;  

error = sysinfo(&s_info);  

三、在linux 2.6.19之後的版本

上面的7個巨集明顯有問題:不近麻煩,而且最多只有6個引數,在2.6.19以後的linux中,廢除了_syscallx這7和巨集,而使用syscall()函式,這個函式定義在syscall.h中:

int syscall(int number, ...); 

有乙個新的概念:系統呼叫號,就是所用系統呼叫對應的編號,它們定義在include/asm-arm/unistd.h中。

當需要系統呼叫時,直接用這個函式,引數number就是需要的函式的系統呼叫號,例如上面的例子就變成:

struct sysinfo s_info;  

syscall(__nr_sysinfo, &s_info);

上面的方法中描述的目錄可能每個平台上都不太一樣,但大概都差不多,檔名應該是一樣的。

select poll 在應用程式中如何使用

select 和poll 系統呼叫的本質一樣,前者在 bsd unix 中引入的,後者在 system v 中引入的。一 select 應用程式中最廣泛用到的是 bsd unix 中引入的 select 系統呼叫,其原型如下 int select int maxfdp,fd set readfds,...

linux應用程式中的Singal

linux應用程式中的singal 標頭檔案 include 功 能 設定某一訊號的對應動作 函式原型 void signal int signum,void handler int int 或者 typedef void sig t int sig t signal int signum,sig ...

linux應用程式中,記憶體布局

方法 通過檢視應用程式程序中的程序位址對映檔案實現。例如檢視2053號程序的記憶體布局 命令如下 cat proc 2053 maps 結果如下 通過我們的下面來程式分析各種 變數在程式中的記憶體位置。檔名 addr.c include include int a 全域性未初始化變數 int b 2...