linux中c语言errno的使用

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

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

如何把errno的数字转换成相应的文字说明?
方式一:可以使用strerrno函数

char*strerror(interrno)

使用方式如下:

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;
}

linux中c语言errno的使用

时间: 2024-10-11 21:45:24

linux中c语言errno的使用的相关文章

linux 中 C 语言的使用 -- 结构体多态

在 Linux 内核代码,特别是驱动代码中经常见到的用法是使用一个标准结构,后面的代码基于这个结构来实现,类似面向对象的多态特性. 在 C 语言里面借助结构体和函数指针实现的这个功能,这里我们写了个例子,提取了关键代码: #include <stdio.h> struct s_new{ char name[10]; char* (* my_method)(char *name); }; char* powerful(char *name){ printf("%s is powerfu

linux中C语言发送广播报文

2. 指令的解决方法: oute add -net 255.255.255.255 netmask 255.255.255.255 dev eth0 metric 1 或者 route add -host 255.255.255.255 dev eth0 需要用到函数:setsockopt(); setsockopt()函数,用于任意类型.任意状态套接口的设置选项值.尽管在不同协议层上存在选项,但本函数仅定义了最高的"套接口"层次上的选项. #include <sys/types

linux中c语言编程main函数和参数

linux下main函数的的标准调用函数的标准形式 int main(int char,char *argv[]) 在main函数的两个参数中,argc必须是整型变量,其是命令行的参数的数目,argv必须是指向字符串的指针数组,这些指针分别指向各个的命令行参数的地址. 原文地址:https://www.cnblogs.com/zoutingrong/p/12250466.html

linux中errno使用(转)

当linux中的C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,在实际编程中用这一招解决了不少原本看来莫名其妙的问题.但是errno是一个数字,代表的具体含义还要到errno.h中去阅读宏定义,而每次查阅是一件很繁琐的事情. 有下面几种方法可以方便的得到错误信息  (1)void perror(const char *s)函数说明perror ( )用来将上一个函数发生错误的原因输出到标准错

Linux 中的MYSQL数据库常用管理语言

Linux 中的MYSQL数据库管理语言1 登录数据库mysql -u (用户) -p输入密码 2 查看数据库 show databases ;3 使用数据库 use 库名 :4 查看库中的表 show tables :5 查看表的结构 describe 表名 :6 创建和删除数据库Create database 库名 :Drop database 库名 :7 创建表Create table 表名 (字段1 类型,字段2 类型,- ,primary key (主键名)):8 删除表Drop ta

linux中对errno是EINTR的处理

慢系统调用(slow system call):此术语适用于那些可能永远阻塞的系统调用.永远阻塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类.如:若没有客户连接到服务器上,那么服务器的accept调用就没有返回的保证. EINTR错误的产生:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误.例如:在socket服务器端,设置了信号捕获机制,有子进程,当在父进程阻塞于慢系统调用时由父进程捕获到了一个有效信号时,内核会致

python errno 模块 与linux中errno.h中的值的对应关系

Linux/include/uapi/asm-generic/errno.h 1 #ifndef _ASM_GENERIC_ERRNO_H 2 #define _ASM_GENERIC_ERRNO_H 3 4 #include <asm-generic/errno-base.h> 5 6 #define EDEADLK 35 /* Resource deadlock would occur */ 7 #define ENAMETOOLONG 36 /* File name too long *

浅谈Linux中的信号机制(二)

首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Linux内核源码评头论足.以后的路还很长,我还是一步一个脚印的慢慢走着吧,Linux内核这座山,我才刚刚抵达山脚下. 好了,言归正传,我接着昨天写下去.如有错误还请各位看官指正,先此谢过. 上篇末尾,我们看到了这样的现象:send进程总共发送了500次SIGINT信号给rcv进程,但是实际过程中rcv只接受/处理了1

Linux中brk()系统调用,sbrk(),mmap(),malloc(),calloc()的异同【转】

转自:http://blog.csdn.net/kobbee9/article/details/7397010 brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的:       每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这一块分配的.如果这块空间不够,malloc函数族(realloc,calloc等)就调用sbrk函数将数据段的下界移动,sbrk函数在内核的管理