我已注意到我的vxWorks 6平臺上成功調用了套接字上的write
,並返回了請求寫入的字節數,並且還將errno從0變爲19(ENODEV
)。可以在成功時設置errno嗎?
我發現這很令人驚訝。
操作成功後可以設置errno嗎?
我已注意到我的vxWorks 6平臺上成功調用了套接字上的write
,並返回了請求寫入的字節數,並且還將errno從0變爲19(ENODEV
)。可以在成功時設置errno嗎?
我發現這很令人驚訝。
操作成功後可以設置errno嗎?
在errno.h
維基說:
值(錯誤號)是由當他們發現錯誤某些庫 功能存儲在錯誤號。在程序啓動時,存儲的值 爲零。 庫函數僅存儲大於零的值。 任何庫函數都可以在返回之前更改存儲的值,無論是 還是不檢測錯誤。大多數函數指示他們通過返回一個特殊值來檢測到 錯誤,通常爲返回指針的函數 爲NULL,返回整數的函數返回-1。幾個 函數要求調用者將errno預置爲零,然後測試它 以查看是否檢測到錯誤。
所以從ENODEV
一個套接字write
奇異值似乎有理由認爲一些內部操作設置errno
和write
恢復(或不關心),但未被允許重置errno
爲0或分開它之前是什麼。
言下之意是,errno
不能被除立即其返回值表示errno
是有意義的一個功能之後,就認爲有意義。
由此得出errno
以後不能用來推斷一系列errno
-影響操作中的故障的想法。
這樣的使用只能是可能的,如果庫函數不清除errno
中旬序列,而是因爲他們沒有明確errno
,內部恢復的錯誤條件仍然體現在errno
。
如果您需要知道某個函數是否失敗,您需要立即檢查它的結果,並且只有在適用的情況下才能諮詢errno。
您不能使用全局共享變量errno
通過函數調用的層次結構來隧道退出狀態,也不能通過其他方式單獨返回成功/失敗狀態。