国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

三種方法實(shí)現(xiàn)Linux系統(tǒng)調(diào)用

2024-08-28 00:01:06
字體:
供稿:網(wǎng)友
這篇文章主要介紹了三種方法實(shí)現(xiàn)Linux系統(tǒng)調(diào)用,感興趣的朋友可以參考一下

系統(tǒng)調(diào)用(System Call)是操作系統(tǒng)為在用戶態(tài)運(yùn)行的進(jìn)程與硬件設(shè)備(如CPU、磁盤、打印機(jī)等)進(jìn)行交互提供的一組接口。當(dāng)用戶進(jìn)程需要發(fā)生系統(tǒng)調(diào)用時(shí),CPU 通過軟中斷切換到內(nèi)核態(tài)開始執(zhí)行內(nèi)核系統(tǒng)調(diào)用函數(shù)。下面介紹Linux 下三種發(fā)生系統(tǒng)調(diào)用的方法:

一、通過 glibc 提供的庫函數(shù)
glibc 是 Linux 下使用的開源的標(biāo)準(zhǔn) C 庫,它是 GNU 發(fā)布的 libc 庫,即運(yùn)行時(shí)庫。glibc 為程序員提供豐富的 API(Application Programming Interface),除了例如字符串處理、數(shù)學(xué)運(yùn)算等用戶態(tài)服務(wù)之外,最重要的是封裝了操作系統(tǒng)提供的系統(tǒng)服務(wù),即系統(tǒng)調(diào)用的封裝。那么glibc提供的系統(tǒng)調(diào)用API與內(nèi)核特定的系統(tǒng)調(diào)用之間的關(guān)系是什么呢?

通常情況,每個(gè)特定的系統(tǒng)調(diào)用對應(yīng)了至少一個(gè) glibc 封裝的庫函數(shù),如系統(tǒng)提供的打開文件系統(tǒng)調(diào)用 sys_open 對應(yīng)的是 glibc 中的 open 函數(shù); 其次,glibc 一個(gè)單獨(dú)的 API 可能調(diào)用多個(gè)系統(tǒng)調(diào)用,如 glibc 提供的 printf 函數(shù)就會調(diào)用如 sys_open、sys_mmap、sys_write、sys_close 等等系統(tǒng)調(diào)用; 另外,多個(gè) API 也可能只對應(yīng)同一個(gè)系統(tǒng)調(diào)用,如glibc 下實(shí)現(xiàn)的 malloc、calloc、free 等函數(shù)用來分配和釋放內(nèi)存,都利用了內(nèi)核的 sys_brk 的系統(tǒng)調(diào)用。

舉例來說,我們通過 glibc 提供的chmod 函數(shù)來改變文件 etc/passwd 的屬性為 444:

#include <sys/types.h>#include <sys/stat.h>#include <errno.h>#include <stdio.h>int main(){  int rc;  rc = chmod("/etc/passwd", 0444);  if (rc == -1)    fprintf(stderr, "chmod failed, errno = %d/n", errno);  else    printf("chmod success!/n");  return 0;}

在普通用戶下編譯運(yùn)用,輸出結(jié)果為:

chmod failed, errno = 1
上面系統(tǒng)調(diào)用返回的值為-1,說明系統(tǒng)調(diào)用失敗,錯(cuò)誤碼為1,在 /usr/include/asm-generic/errno-base.h 文件中有如下錯(cuò)誤代碼說明:

#define EPERM       1                /* Operation not permitted */
即無權(quán)限進(jìn)行該操作,我們以普通用戶權(quán)限是無法修改 /etc/passwd 文件的屬性的,結(jié)果正確。

二、使用 syscall 直接調(diào)用
使用上面的方法有很多好處,首先你無須知道更多的細(xì)節(jié),如 chmod 系統(tǒng)調(diào)用號,你只需了解 glibc 提供的 API 的原型;其次,該方法具有更好的移植性,你可以很輕松將該程序移植到其他平臺,或者將 glibc 庫換成其它庫,程序只需做少量改動(dòng)。
但有點(diǎn)不足是,如果 glibc 沒有封裝某個(gè)內(nèi)核提供的系統(tǒng)調(diào)用時(shí),我就沒辦法通過上面的方法來調(diào)用該系統(tǒng)調(diào)用。如我自己通過編譯內(nèi)核增加了一個(gè)系統(tǒng)調(diào)用,這時(shí) glibc 不可能有你新增系統(tǒng)調(diào)用的封裝 API,此時(shí)我們可以利用 glibc 提供的syscall 函數(shù)直接調(diào)用。該函數(shù)定義在 unistd.h 頭文件中,函數(shù)原型如下:

long int syscall (long int sysno, ...)

sysno 是系統(tǒng)調(diào)用號,每個(gè)系統(tǒng)調(diào)用都有唯一的系統(tǒng)調(diào)用號來標(biāo)識。在 sys/syscall.h 中有所有可能的系統(tǒng)調(diào)用號的宏定義。 ... 為剩余可變長的參數(shù),為系統(tǒng)調(diào)用所帶的參數(shù),根據(jù)系統(tǒng)調(diào)用的不同,可帶0~5個(gè)不等的參數(shù),如果超過特定系統(tǒng)調(diào)用能帶的參數(shù),多余的參數(shù)被忽略。 返回值 該函數(shù)返回值為特定系統(tǒng)調(diào)用的返回值,在系統(tǒng)調(diào)用成功之后你可以將該返回值轉(zhuǎn)化為特定的類型,如果系統(tǒng)調(diào)用失敗則返回 -1,錯(cuò)誤代碼存放在 errno 中。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 壶关县| 鹤岗市| 昆山市| 龙州县| 英德市| 黄浦区| 墨脱县| 宁晋县| 蒙城县| 长沙县| 逊克县| 丰镇市| 凉山| 田东县| 浦北县| 枣庄市| 达拉特旗| 锦州市| 天等县| 习水县| 香港 | 张家口市| 宜春市| 天柱县| 霍州市| 鄱阳县| 广州市| 陆河县| 工布江达县| 台南县| 丁青县| 化州市| 利津县| 和硕县| 沿河| 辽宁省| 静安区| 苏尼特左旗| 新河县| 加查县| 英山县|