IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

linux中c语言errno的使用

博学无忧 2014-12-01 23:21:00 累计浏览 2,035 次
本机暂存

   在linux中使用c语言编程时,errno是个很有用的动动。他可以把最后一次调用c的方法的错误代码保留。但是如果最后一次成功的调用c的方法,errno不会改变。因此,只有在c语言函数返回值异常时,再检测errno。

   errno会返回一个数字,每个数字代表一个错误类型。详细的可以查看头文件。/usr/include/asm/errno.h

   如何把errno的数字转换成相应的文字说明?

   方式一:可以使用strerrno函数

char *strerror(int errno)

   使用方式如下:

fprintf(stderr,"error in CreateProcess %s, Process ID %d ",strerror(errno),processID)

   将错误代码转换为字符串错误信息,可以将该字符串和其它的信息组合输出到用户界面。

   注:假设processID是一个已经获取了的整形ID

   方式二:使用perror函数

void perror(const char *s)

   函数说明

   perror ( )用来将上一个函数发生错误的原因输出到标准错误(stderr),参数s 所指的字符串会先打印出,后面再加上错误原因 字符串。此错误原因依照全局变量 errno 的值来决定要输出的字符串。

   另外并不是所有的c函数调用发生的错误信息都会修改errno。例如gethostbyname函数。

   errno是否是线程安全的?

   errno是支持线程安全的,而且,一般而言,编译器会自动保证errno的安全性。

   我们看下相关头文件 /usr/include/bits/errno.h

   会看到如下内容:

   #  if !defined _LIBC || defined _LIBC_REENTRANT

   /* When using threads, errno is a per-thread value.  */

   #   define errno (*__errno_location ())

   #  endif

   # endif /* !__ASSEMBLER__ */

   #endif /* _ERRNO_H */

   也就是说,在没有定义__LIBC或者定义_LIBC_REENTRANT的时候,errno是多线程/进程安全的。

   为了检测一下你编译器是否定义上述变量,不妨使用下面一个简单程序。

#include <stdio.h>
#include <errno.h>
 
int main( void )
{
#ifndef __ASSEMBLER__
        printf( "Undefine __ASSEMBLER__/n" );
#else
        printf( "define __ASSEMBLER__/n" );
#endif
 
#ifndef __LIBC
        printf( "Undefine __LIBC/n" );
#else
        printf( "define __LIBC/n" );
#endif
 
#ifndef _LIBC_REENTRANT
        printf( "Undefine _LIBC_REENTRANT/n" );
#else
        printf( "define _LIBC_REENTRANT/n" );
#endif
 
        return 0;
}

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. Linux如何统计进程的CPU利用率 (累计阅读 16,307)
  2. 我的 RHCA 之路 (累计阅读 14,011)
  3. Linux内存点滴 用户进程内存空间 (累计阅读 13,228)
  4. 给程序员新手的一些建议 (累计阅读 13,088)
  5. Linux 性能监控、测试、优化工具 (累计阅读 13,011)
  6. 关于linux内存free的一些事情 (累计阅读 12,866)
  7. ps - 按进程消耗内存多少排序 (累计阅读 12,685)
  8. Google怎么用linux (累计阅读 12,580)
  9. Linux Used内存到底哪里去了? (累计阅读 11,866)
  10. find命令的一点注意事项 (累计阅读 11,863)