1. 程式人生 > >Linux系統程式設計手冊讀書筆記——第3章 系統程式設計概念

Linux系統程式設計手冊讀書筆記——第3章 系統程式設計概念

系統呼叫

  • 系統呼叫使處理器從使用者態切換到核心態
  • 每個系統呼叫都有一個唯一的數字來標識

系統呼叫流程:

  • 引數入棧,傳入外殼函式,外殼函式將引數置入特定暫存器(包括系統呼叫編號),執行中斷指定。核心響應中斷指令,呼叫system_call()里程處理中斷。
  • 如何處理中斷呢?
    1. 在核心棧儲存暫存器的值
    2. 稽核系統呼叫編號的有效性
    3. 通過編號找到相應的系統呼叫服務例程,呼叫時會先檢查引數的有效性,然後執行任務。結果狀態返回給system_call()例程
    4. 從核心棧中恢復暫存器的值,將系統呼叫返回值置於棧中
    5. 返回至外殼函式,切換回使用者態

如果系統呼叫服務例程返回值有誤,那麼外殼函式會使用該值設定全域性變數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中