2017-07-14 55 views
1

我已注意到我的vxWorks 6平臺上成功調用了套接字上的write,並返回了請求寫入的字節數,並且還將errno從0變爲19(ENODEV)。可以在成功時設置errno嗎?

我發現這很令人驚訝。

操作成功後可以設置errno嗎?

回答

1

errno.h維基說:

值(錯誤號)是由當他們發現錯誤某些庫 功能存儲在錯誤號。在程序啓動時,存儲的值 爲零。 庫函數僅存儲大於零的值。 任何庫函數都可以在返回之前更改存儲的值,無論是 還是不檢測錯誤。大多數函數指示他們通過返回一個特殊值來檢測到 錯誤,通常爲返回指針的函數 爲NULL,返回整數的函數返回-1。幾個 函數要求調用者將errno預置爲零,然後測試它 以查看是否檢測到錯誤。

所以從ENODEV一個套接字write奇異值似乎有理由認爲一些內部操作設置errnowrite恢復(或不關心),但未被允許重置errno爲0或分開它之前是什麼。

言下之意是,errno不能被除立即其返回值表示errno是有意義的一個功能之後,就認爲有意義。

由此得出errno以後不能用來推斷一系列errno-影響操作中的故障的想法。

這樣的使用只能是可能的,如果庫函數不清除errno中旬序列,而是因爲他們沒有明確errno,內部恢復的錯誤條件仍然體現在errno

如果您需要知道某個函數是否失敗,您需要立即檢查它的結果,並且只有在適用的情況下才能諮詢errno。

您不能使用全局共享變量errno通過函數調用的層次結構來隧道退出狀態,也不能通過其他方式單獨返回成功/失敗狀態。

相關問題