man strerror strerror_r strerror_l

名称

        strerror, strerror_r, strerror_l - 返回描述错误值的字符串

概要

        #include <string.h>

        char *strerror(int errnum);

        int strerror_r(int errnum, char *buf, size_t buflen);

                /* 兼容XSI */

        char *strerror_r(int errnum, char *buf, size_t buflen);

                /* GNU版本 */

        char *strerror_l(int errnum, locale_t locale);

    对于glibc来说要有功能测试宏才能使用(参考feature_test_macros):

        strerror_r():

            如果下面的条件成立则使用兼容XSI的版本:

            (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE

            否则,使用GNU版本。

说明

        strerror返回一个指向字符串的指针,该字符串描述了由参数errnum表示的错误代

        码,可能使用当前语言环境的LC_MESSAGES部分来选择适当的语言。(例如,如

        果errnum为 EINVAL,则返回的描述将为“无效参数”。)该字符串不应由应用程

        序修改,但可能会被后续的strerror或strerror_l调用修改。除此之外,没有其他的

        库函数修改该字符串,包括perror。

    strerror_r()

        strerror_r类似于strerror,但它是线程安全的。该函数有两个可选版本:在

        POSIX.1-2001中定义的XSI兼容的版本(自glibc 2.3.4起就可获得,但直到glibc 2.13

        才与POSIX兼容),一个GNU版本(自glibc 2.0起就可获得)。正如概要里面描

        述的,提供了相应的功能测试宏就使用XSI兼容的版本,其他情况使用GNU版本。

        如果没有显式定义功能测试宏,那么(自glibc 2.4起)_POSIX_SOURCE默认定义为

        200112L,所以默认情况下使用的是XSI兼容的版本。

        XSI兼容的版本是可移植应用程序的首选,它把错误描述串存放到用户指定的缓冲

        区参数buf中,缓冲区的长度为buflen。

        GNU版本的strerror_r返回一个指向字符串的指针,该字符串的内容包含了错误消

        息,指针要么指向函数内部定义的参数buf,要么指向某个(不可变的)静态字符

        串(在这种情况下参数buf未被使用)。如果字符串存储在参数buf,那么最多存

        放buflen个字节(如果buflen太小且errnum未知,则字符串可能会被截断)。字

        符串总是包含一个结束符(‘\0’)。

    strerror_l()

        strerror_l跟strerror类似,但将errnum映射到locale指定的语言环境中与语言环

        境相关的错误消息。如果locale是特殊语言环境对象LC_GLOBAL_LOCALE或不是有

        效的语言环境对象句柄,则strerror_l的行为未定义。

返回值

        strerror,strerror_l和strerror_r返回适当的错误描述串,或者当errnum未知时返

        回"未知的错误nnn"。

        strerror_r成功时返回0。出错时返回一个(正数)错误码(自glibc 2.13起),或

        者返回-1并设置errno为对应的错误码(glibc 2.13之前的版本)。

        POSIX.1-2001和POSIX.1-2008要求成功调用strerror或strerror_l时应保持errno不

        变,并注意,由于没有保留函数的返回值来指示错误,如果应用程序希望检查错误,

        那么应该在调用相关函数之前将errno初始化为零,在调用函数之后检查errno。

错误

        EINVAL  errnum不是一个合法的错误码。

        ERANGE 提供的存储空间不足,无法存放错误描述串。

线程安全特征

接口

特征

strerror()

线程安全

多线程不安全 竞争:strerror

strerror_r(), strerror_l()

线程安全

多线程安全

版本

        strerror_l在glibc 2.6中首次出现。

标准

        strerror遵循POSIX.1-2001, POSIX.1-2008, C89和C99。strerror_r遵循POSIX.1-2001

        and POSIX.1-2008。

        strerror_l遵循POSIX.1-2008。

        GNU版本的strerror_r是一个是非标准的扩展。

        POSIX.1-2001允许在调用strerror遇到错误时设置errno,但没有指定在发生错误时

        应该返回什么值作为函数结果。在某些系统上,如果错误码未知,则strerror返回

        NULL,而在其他系统上,strerror返回类似于“发生错误nnn”的字符串并将errno

        设置为EINVAL。C99和POSIX.1-2008要求返回值为非NULL。

推荐阅读

        err,errno,error,perror,strsignal,locale

版本记录

        这个页面是Linux man-pages项目4.04版本的一部分。关于该项目的信息和bug报

        道可以在该网站找到:http://www.kernel.org/doc/man-pages/。

                                2015-08-08

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ta是一个搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值