Linux系統程式設計手冊讀書筆記——第3章 系統程式設計概念
阿新 • • 發佈:2019-02-05
系統呼叫
- 系統呼叫使處理器從使用者態切換到核心態
- 每個系統呼叫都有一個唯一的數字來標識
系統呼叫流程:
- 引數入棧,傳入外殼函式,外殼函式將引數置入特定暫存器(包括系統呼叫編號),執行中斷指定。核心響應中斷指令,呼叫system_call()里程處理中斷。
- 如何處理中斷呢?
- 在核心棧儲存暫存器的值
- 稽核系統呼叫編號的有效性
- 通過編號找到相應的系統呼叫服務例程,呼叫時會先檢查引數的有效性,然後執行任務。結果狀態返回給system_call()例程
- 從核心棧中恢復暫存器的值,將系統呼叫返回值置於棧中
- 返回至外殼函式,切換回使用者態
如果系統呼叫服務例程返回值有誤,那麼外殼函式會使用該值設定全域性變數errno
外殼函式返回至呼叫程式,同時返回一個整型值(外殼函式返回值)
從C語言程式設計角度看,呼叫C語言函式庫的外殼函式等同於呼叫相應的系統呼叫服務例程
系統呼叫失敗時,全域性變數errno會被設定為一個正值,但系統呼叫成功時,errno不會被重置為0,因此要先檢查外殼函式的返回值,再檢查errno來確定程式出錯原因
確定系統glibc版本:
- $ /lib64/libc.so.6
- 對於glibc版本2.17來說,全域性變數 __GLIBC__ 為2,__GLIBC_MINOR__ 為 1
errno錯誤碼存在兩個檔案中:
/usr/include/asm-generic/errno-base.h
/usr/include/asm-generic/errno.h
#include<stdio.h>
void perror(const char *msg);
perror("success")
#include<string.h>
char *strerror(int errornum);
printf(strerror(1));
#include<errno.h>
extern int errno;
printf("errno = %d", errno);
#include<stdlib.h>
exit(EXIT_FAILURE);
exit(EXIT_SUCCESS);
- errMsg 列印errno對應的錯誤資訊和其他資訊
- errExit 在errMsg基礎上終止程式,可以使用exit()或者abort()
- err_exit 在errMsg基礎上終止程式,呼叫_exit()終止程式,
- errExitEN 與errExit區別在於,列印指定的 errnum對應的錯誤資訊
- 標準系統型別:大部分定義在在 sys/types.h中