【问题标题】:How does one check the meaning of a numerical return value in C under Linux?在Linux下如何检查C中数值返回值的含义?
【发布时间】:2012-01-10 16:05:30
【问题描述】:

假设我正在调用 write() 并返回错误 -8。如何检查这代表哪个记录的错误返回值?

【问题讨论】:

    标签: c linux error-handling


    【解决方案1】:

    你通常会使用

      man functionname
    

    或许

      man -S2 functionname # specify other section (2, 3, 5, 7)
    

    大多数函数在成功时返回 0,在失败时返回非空值,说明它们还设置了 errno。可以得到errno的含义全局变量1

    • 通过查看errno.h
    • 通过使用strerror 函数 (#include <string.h>)
    • 或使用方便的助手perror,它会根据strerror 和给定的前缀打印错误消息:

       perror("oops, popen failed with: ");
      

    1 好吧,从技术上讲,它不需要是全局变量。根据您的操作系统/库,它可能是宏、线程局部变量等...

    【讨论】:

    • 实际定义在:/usr/include/asm-generic/errno.h/usr/include/asm-generic/errno-base.h——当然是errno.h拖进来的。
    • perror 值得一提,但它不仅仅是检查和发现:)
    • @sehe,不是当问题被标记为“linux”时。
    • @BrettHale:嗯?它仍然取决于平台,即使问题被标记为brazen-unicorns :)
    • @Vlad Lazarenko:perror 添加了冒号。如果您像这样在参数中放入一个,那么实际输出中将有两个。 oops, popen failed with: :SOME_ERROR
    【解决方案2】:

    查看strerror 联机帮助页。 (注意,虽然write() 应该只返回最坏的-1errno 中的错误代码)。

    【讨论】:

      【解决方案3】:

      正式它不是返回-8,而是一个错误代码。这些错误代码可以在手册中找到(例如这里:http://linux.die.net/man/2/write),您应该使用这些代码来验证一切是否正常。

      所以,你会使用:

       write(..);
      if( errno == EFAULT ) { ...}
      

      【讨论】:

        【解决方案4】:

        试试“strerror”和“errno”。

        【讨论】:

          【解决方案5】:

          你不应该打印返回值本身,而是strerror(return_value)。您也可以查看man errno 了解错误描述。

          【讨论】:

            猜你喜欢
            • 2012-12-22
            • 2015-06-21
            • 2010-09-21
            • 1970-01-01
            • 1970-01-01
            • 2021-12-14
            • 2022-08-19
            • 2012-07-26
            • 1970-01-01
            相关资源
            最近更新 更多