2012-07-28 135 views
19

我有两个调用两种不同的方法:如何设置errno值?

void func1() 
{ 
    // do something 
    if (fail) 
    { 
    // then set errno to EEXIST 

    } 

} 

,第二种方法:

void func2() 
{ 
    // do something 
    if (fail) 
    { 
    // then set errno to ENOENT 

    } 

} 
  1. 当我设置errno到一定的价值,它有什么作用?只是错误检查?

  2. 如何设置在上述方法func1errnofunc2EEXISTENOENT

感谢

回答

42

对于所有实用的目的,你可以把errno像一个全局变量(尽管它通常是不)。因此,包括errno.h,只是使用它:

errno = ENOENT; 

你应该问自己,如果errno是你的目的最好的错误报告机制。函数是否可以被设计为自己返回错误代码?

+11

传统上,'errno'用于报告*系统错误*。你觉得你的图书馆或你的代码是系统的一部分吗?如果不是,请使用其他机制来报告错误。 – 2012-07-28 12:02:51

+3

不一定,像strtol()这样的效用函数似乎也会返回ERANGE,例如,这不是一个真正的_system error_。 – proteus 2015-01-03 22:50:39

+1

可能适合设置errno的示例将在传递给funopen()的读取或写入函数回调中。在这种情况下,您的实现预计会匹配系统调用的合约(read()或write()),所以在发生错误时返回-1并将errno与特定错误一起设置是有意义的。 – orpheist 2015-06-23 18:25:08

3
#include <errno.h> 
void func1() 
{ 
    // do something 
    if (fail) 
    { 
    errno = ENOENT; 
    } 
} 
5

IMO,标准errno为系统级设计。我的经验是不污染他们。如果你要模拟的C标准errno机制,你可以做一些定义,如:

/* your_errno.c */ 
__thread int g_your_error_code; 

/* your_errno.h */ 
extern __thread int g_your_error_code 
#define set_your_errno(err) (g_your_error_code = (err)) 
#define your_errno (g_your_error_code) 

,也仍然可以实现your_perror(err_code)。更多信息请参考glibc的实现。