Linux 系統應用程式設計 出錯處理 errno

2021-07-09 07:09:00 字數 2233 閱讀 8224

1. errno變數

檔案 中定義了符號 errno 以及可以賦予它的各種常量,這些常量都是以字元 e 開頭。例如,若 errno 等於常量 eacces,表示產生了許可權問題(例如,沒有開啟所要求檔案的足夠許可權)。

當 unix 函式出錯時,常常返回乙個負值,而且將整型變數 errno 設定成含有附加資訊的各個常量。例如,open 函式如果成功執行則返回乙個非負檔案描述符,如出錯則返回 -1。在 open 出錯時,有大約 15 種不同的errno 值(檔案不存在、許可權問題等)。

對於 errno 應該知道兩條規則:

規則一:如果沒有出錯,則errno的值不會被乙個例程清除。

因此,僅當函式的返回值指明出錯時,才校驗 errno 的值。

規則二:任一函式都不會將errno的值設定為0,在中定義的所有常量都不為0。

出錯標誌 errno 是乙個整型數值,這個對於使用者提示不夠有好。c 標準定義了兩個函式,用於幫助列印出錯資訊:

1)、strerror()

#include #include char *strerror(int errnum);
返回值:指向訊息字串的指標

此函式將 errnum(它通常就是 errno 值)對映為乙個出錯資訊字串,並且返回此字串的指標。

2)、perror()

perror 函式基於 errno 的當前值,在標準出錯上產生一條出錯資訊,然後返回。

#include void perror(const char *msg);
它首先輸出由 msg 指向的字串,然後是乙個冒號,乙個空格,接著是對應於 errno 值的出錯資訊,最後是乙個換行符。

例子:下面**展示了這兩個出錯函式的使用方法::

#include #include #include #include int

main(int argc, char *argv)

執行結果如下:

fs@ubuntu:~/qiang/error$ ./error 

eacces: permission denied

./error: no such file or directory

fs@ubuntu:~/qiang/error$

2. 列印所有錯誤資訊

c 標準庫定義了sys_nerr 用於記錄錯誤資訊總個數,下面程式通過迴圈來列印所有資訊。

#include #include #include #include int main(int argc, char *argv)

exit(0);

}

執行結果如下:

fs@ubuntu:~/qiang/error$ ./print_err 

error # 0: success

error # 1: operation not permitted

error # 2: no such file or directory

error # 3: no such process

error # 4: interrupted system call

....

error #132: operation not possible due to rf-kill

error #133: unknown error 133

error #134: unknown error 134

fs@ubuntu:~/qiang/error$

3. 多執行緒擴充套件

在支援執行緒的環境中,多個執行緒共享程序位址空間,每個執行緒都有屬於它自己的區域性 errno 以避免乙個執行緒干擾另乙個執行緒。

函式 strerror() 不是執行緒安全的。因為該函式將 errnum 對應的字串儲存在乙個靜態的緩衝區中,然後將該緩衝區的指標返回。另乙個執行緒呼叫 strerror() 就會重新設定靜態緩衝區的內容。

4. 出錯恢復

可將 中定義的各種出錯分成致命性的和非致命性的兩類。對於致命性的錯誤,無法執行恢復動作,最多只能在使用者螢幕上列印出一條出錯資訊,或者將一條出錯資訊寫入日誌檔案,然後終止。而對於非致命性的錯誤,有時可以較妥善地進行處理。

Linux系統應用程式設計 檔案IO

檔案描述符 files struct file結構體記錄在task struct結構體中,file指向檔案描述符。乙個程序預設開啟三個檔案描述符 stdin fileno 0 stdout fileno 1 stderr fileno 2 新開啟檔案返回檔案描述符表中未使用的最小檔案描述符 open...

Linux串列埠應用程式設計

常見的資料通訊的基本方式可分為並行通訊與序列通訊兩種。1.並行通訊是指利用多條資料傳輸線將乙個字資料的各位元位同時傳送。它的特點是傳輸速度快,適用於傳輸距離短且傳輸速度較高的通訊。2.序列通訊是指利用一條傳輸線將資料以位元位為單位順序傳送。特點是通訊 線路簡單,利用簡單的線纜就可實現通訊,降低成本,...

Linux應用程式設計 mmap

二話不說,上來就問下那個man name mmap,munmap map or unmap files or devices into memory synopsis include void mmap void addr,size t length,int prot,int flags,int f...