【发布时间】:2013-08-23 10:51:09
【问题描述】:
我正在编写一个程序,其中大多数使用的库函数在错误时返回 -1 并设置 errno。程序的行为是,如果发生错误,它就会退出。要从程序外部确定确切的退出点和错误(例如使用gdb),我想使用以下方法:
err = func_1(..arglist_1..);
if(err != 0)
{
perror("func(..arglist..)");
return ((1u << 8) | errno);
}
//..
//.. some more funcs
//..
err = func_n(..arglist_n..);
if(err != 0)
{
perror("func(..arglist_n..)");
return (((unsigned)n << 8) | errno);
}
这里的问题是安全假设。
现实: errno 在 errno.h 内声明为 extern int errno;
假设 1: errno 的值 始终小于 255。
假设 2: errno 始终为正数。
根据errno.h 中定义的所有错误常数(EAGAIN 等),这些假设目前是正确的。这些在未来也能被假设为真的吗?
P.S.:我不想依赖perror() 来确定退出点。
【问题讨论】:
-
我怀疑这两种假设都是安全的。对于第二个,你认为
0是肯定的吗? -
没有
0被排除在外,因为this link here 说:No function in this volume of IEEE Std 1003.1-2001 shall set errno to 0. -
仅仅因为标准库中没有函数将其设置为
0,并不意味着其他人不会将其设置为0。对于某些标准库函数,判断调用是否失败的唯一方法是先将errno设置为0,然后看看函数做了什么。 -
@jxh:你是对的,Jonathan Leffler 的回答解释了我的一切。是的,我在某处研究过那些成功返回 -1 的函数,并且只能通过将 errno 设置为 0 来检查错误。
-
@jxh:尤里卡!!找到了!!
getpriority():-)就是这类函数的一个例子。