【问题标题】:Understanding errno in C理解 C 中的 errno
【发布时间】:2016-11-06 22:59:00
【问题描述】:

如果我想使用可能返回错误的函数,例如 thread_mutexattr_init(&myAttr),如果此函数返回错误,它将自动设置 errno 与错误的编号,或者我应该将 errno 设置为返回 this功能?

例如什么是正确的?

if((errno = pthread_mutexattr_init(&myAttr)) != 0){
    if(errno == EBUSY){
        perror("some error message because of EBUSY");
    }else{
        perror("another error message");
}

或者这个:

if(pthread_mutexattr_init(&myAttr) < 0){
    if(errno == EBUSY){
        perror("some error message because of EBUSY");
    }else{
        perror("another error message");
    }  
}

【问题讨论】:

    标签: c errno


    【解决方案1】:

    第一个版本是正确的(第二个实际上是错误的 - pthread_mutexattr_init() 需要在成功时返回零或在失败时返回正错误号;它没有定义设置 errno 所以@中的值987654326@ 不一定相关)。

    POSIX 不强制 pthreads 函数设置 errno(它们可能会或可能不会设置它 - 没有要求)。返回值本身就是错误号。如果返回值为0,则成功,如果是其他任何内容,您可以将其分配给errno 以查找错误(或使用任何其他int 变量来保存该值,然后将其传递给strerror(),例如示例)。

    【讨论】:

    • 虽然 POSIX 标准并没有说禁止 pthread 函数设置errno,但errno 的定义说: errno 的值只能在调用一个明确声明要设置的函数……&lt;errno.h&gt; 说:&lt;errno.h&gt; 标头应定义以下宏,这些宏应扩展为int 类型的整数常量表达式,不同的正值(除了下面提到的)……
    • 由于pthread_mutexattr_init()未定义为设置errno,因此在调用后检查errno是不可接受的(明智的)。该函数从不返回负数:成功时返回 0,失败时返回正整数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多