【问题标题】:Error checking with uname(2)?使用 uname(2) 检查错误?
【发布时间】:2015-02-25 04:49:42
【问题描述】:

调用uname(2)后是否需要检查错误?

根据手册页:

成功时,返回零。出错时,返回 -1,并且 errno 为 适当设置。

在错误标题下,

EFAULT buf 无效。

是列出的唯一错误。

因此,如果给定一个有效的struct utsname 缓冲区,我是否可以假设uname 永远不会失败?

【问题讨论】:

    标签: c linux posix uname


    【解决方案1】:

    没有。

    仅仅因为EFAULT 是列出的唯一errno,并不意味着只要您传递一个有效的缓冲区,uname 就永远不会失败。它可能因任何其他原因而失败。即如果uname 的返回码是-1,那么无论errno 的值如何,它都会失败。

    errno 仅在函数/系统调用指示失败时才有意义;它本身并不定义库函数/系统调用的成功/失败。

    【讨论】:

    • @P.P.但它为什么会失败呢?除了在内核编译期间禁用该功能之外还有其他原因,例如它已通过LD_LIBRARY_PATH 替换为另一个实现。但后者需要另一个版本的 libc,对吧。
    • @user877329 使用 LD_LIBRARY_PATH 和/或 LD_PRELOAD 等基本上是黑客行为,如果是这样的话,所有的赌注都没有了。 uname 失败的可能性可能接近于 0(不包括内核中的错误等场景)。在Linux 上,信息来自正在运行的内核。但是 POSIX 没有定义这些信息的来源。因此,在另一个操作系统上,它可能会以不同的方式实现,并且可能由于某种原因而失败。从用户的角度来看,检查返回值是一种务实的方法,而不是依赖于任何实现/操作系统的知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2011-09-14
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    相关资源
    最近更新 更多