2014-12-28 30 views
0

調用uname(2)後是否需要檢查錯誤?使用uname(2)檢查錯誤?

根據手冊頁:

如果成功,則返回零。出錯時,返回-1,並且適當地設置errno爲 。

錯誤標題下,

EFAULT BUF無效。

是列出的唯一錯誤。

因此,如果給定有效的struct utsname緩衝區,我是否可以假設uname永遠不會失敗?

回答

0

只是因爲EFAULT是列出的唯一errno,但這並不意味着uname絕不會只要你傳遞一個有效的緩衝失敗。它可能因任何其他原因失敗。即如果uname的返回碼是-1,那麼它失敗,不管errno的值如何。

errno僅在函數/系統調用指示失敗時纔有意義;它本身並沒有定義庫函數/系統調用的成功/失敗。

+0

好的。謝謝。 – yossarian

+0

@ P.P。但是,爲什麼它會失敗呢?除了在內核編譯過程中禁用該功能還有其他任何原因,例如通過'LD_LIBRARY_PATH'將其替換爲另一個實現。但後者需要另一個版本的libc,對。 – user877329

+1

@ user877329使用LD_LIBRARY_PATH和/或LD_PRELOAD等基本上是黑客攻擊,如果是這樣的話,所有的賭注都是關閉的。 uname失敗的可能性可能接近於0(不包括內核中的錯誤等情況)。在[Linux]上(http://man7.org/linux/man-pages/man2/uname.2.html),信息來自正在運行的內核。但POSIX並沒有定義這個信息來自哪裏。因此,在另一個操作系統上,它可能以不同的方式實現,並可能由於某種原因而失敗。從用戶的角度來看,檢查返回值是實用的方法,而不是依賴任何實現/操作系統的知識。 –