看見網上很多地方都用到這個標頭檔案,一直不理解,今天找了一些資料,可以方便自己理解
errno是乙個巨集,它定義在對應的標頭檔案裡面,這個在上面的鏈結裡也有說到
errno是乙個全域性變數,它儲存了最近一次的錯誤。
我常看見的乙個**是:
errno != eexist
eexist的中文翻譯是錯誤已經存在
也就是說,最近一次系統呼叫的錯誤已經存在,可以用來做為判斷條件
eexist 是個巨集定義,是error exist 的縮寫,exist 是「存在」的意思。
errno是個全域性變數,在errno.h標頭檔案中定義,用於儲存錯誤碼,方便根據錯誤碼來查詢出錯原因。
這個mkfifo函式建立管道時,如果有已存在的同名管道,就會將errno賦值為eexist。
erron != eexist,也就是判斷mkfifo函式是否出現「已存在同名管道」的錯誤。
if((mkfifo(fifo_server,o_creat|o_excl|o_rdwr)<0)&&(errno!=eexist))
這段**翻譯成漢字描述就是:
如果((mkfifo函式建立管道,返回值小於0),並且,(錯誤原因不是 「已存在同名管道」))
上面更詳細的解說是,如果我們用mkfifo()函式建立乙個有名管道發生錯誤(發生錯誤返回值小於0),但是這個錯誤不是因為這個管道檔案已經存在(有名管道存在再去建立是會出現失敗的),而是因為其他原因,這個時候就可以把判斷條件寫成
errno != eexist,它代表這個錯誤(管道檔案)是不存在的,是乙個新的錯誤,當然,這個新的錯誤會存放在errno中,因為上面說過,errno是儲存最近一次的錯誤。
關於標頭檔案
自定義標頭檔案通常放在使用該標頭檔案的原始檔所在的目錄中,並使用 include myhead.h 來包含。標頭檔案是不編譯的,因為c語言編譯過程之前有個預編譯過程。在這個過程中用標頭檔案中的內容替換原始檔中 include 命令,所以在編譯器看來,沒有標頭檔案,只有原始檔。預編譯過程還包括條件編譯...
關於 errno的使用
errno 是乙個全域性的變數,在 errno.h 中有它的定義 if defined mt defined dll defined mac crtimp extern int cdecl errno void define errno errno else ndef mt ndef dll crt...
關於errno與perror,strerror函式
為什麼,要強調errno看起來好像是乙個整形變數呢?因為有的標準 如iso c 只規定了errno的作用,而沒有規定它的實現方式,它可能被定義成乙個變數,也有可能被定義成乙個巨集,這個具體要看編譯器自己的實現。早些時候,posix.1曾把errno定義成extern int errno這種形式,但現...