errno、 _doserrno、 _sys_errlist 和 _sys_nerr
這些通用的變數會保留所使用的錯誤代碼 perror 和 strerror 函式來列印錯誤訊息。更安全的功能版本,列在此表格應該用它們的全域變數的位置。
全域變數 |
功能的對等用法 |
---|---|
_doserrno |
|
_errno |
在 STDLIB 中宣告這些變數。以 h
extern int _doserrno;
extern int errno;
extern char *_sys_errlist[ ];
extern int _sys_nerr;
備註
errno與_errno連線到相同的變數。errno使用程式碼定義#define errno (*_errno())
errno設定系統層級呼叫中發生錯誤。因為errno存放可能被變更的值加以設定,這個值的最後一次呼叫後續的呼叫。一定要檢查errno立即之前和之後可能會將其設定的呼叫。
在發生錯誤, errno不一定是設定為 [加班工時和系統呼叫所傳回的錯誤碼。對於 I/O 作業,使用_doserrno來存取作業系統的錯誤代碼對等用法的errno代碼。對於大部分的非 i/o 作業的值_doserrno尚未定義。
每個errno值時才可以使用列印錯誤訊息perror或儲存在字串,使用strerror。perror與strerror使用_sys_errlist陣列和_sys_nerr中的項目數_sys_errlist,來處理錯誤的資訊。
文件庫的數學常式集errno藉由呼叫 _matherr。若要以不同方式處理算術錯誤,撰寫您自己的常式,根據_matherr參考描述,並命名為_matherr。
所有errno為預先定義的常數 ERRNO 中定義的值。H,UNIX 相容,而且如下所示。只有ERANGE, EILSEQ和EDOM詳列於 ANSI 標準。
常數 |
系統錯誤訊息 |
值 |
---|---|---|
EPERM |
不允許這項操作 |
1 |
ENOENT |
無此檔案或目錄 |
2 |
ESRCH |
沒有這項處理 |
3 |
EINTR |
插斷的函式 |
4 |
EIO |
I/O 錯誤 |
5 |
ENXIO |
沒有此類的裝置或位址 |
6 |
E2BIG |
引數清單太長 |
7 |
ENOEXEC |
執行格式錯誤 |
8 |
EBADF |
檔案號碼錯誤 |
9 |
ECHILD |
繁衍 (spawn) 的處理程序 |
10 |
EAGAIN |
沒有更多的處理程序或沒有足夠記憶體或最大的巢狀層級上限 |
11 |
ENOMEM |
沒有足夠的記憶體 |
12 |
EACCES |
拒絕的權限 |
13 |
EFAULT |
不正確的地址 |
14 |
EBUSY |
裝置或忙線中的資源 |
16 |
EEXIST |
檔案已存在 |
17 |
EXDEV |
交互裝置連結 |
18 |
ENODEV |
沒有這種裝置 |
19 |
ENOTDIR |
不是一個目錄 |
20 |
EISDIR |
是一個目錄 |
21 |
EINVAL |
無效的引數 |
22 |
ENFILE |
在系統中開啟太多檔案 |
23 |
EMFILE |
開啟太多檔案 |
24 |
ENOTTY |
不適當的 I/O 控制作業 |
25 |
EFBIG |
檔案太大 |
27 |
ENOSPC |
在裝置上已無空間 |
28 |
ESPIPE |
無效的搜尋 |
29 |
EROFS |
唯讀的檔案系統 |
30 |
EMLINK |
太多的連結 |
31 |
EPIPE |
管道中斷 |
32 |
EDOM |
數學引數 |
33 |
ERANGE |
結果太大 |
34 |
EDEADLK |
就會發生資源鎖死 |
36 |
EDEADLOCK |
與 Microsoft C 上的舊版的相容性的 EDEADLK 一樣 |
36 |
ENAMETOOLONG |
檔名太長 |
38 |
ENOLCK |
沒有可用的鎖定 |
39 |
ENOSYS |
不支援的函式 |
40 |
ENOTEMPTY |
目錄不是空的 |
41 |
EILSEQ |
不合法的位元組序列 |
42 |
STRUNCATE |
已截斷字串 |
80 |