C标准库源码解剖(9):控制函数assert.h, setjmp.h和signal.h
来源:互联网 发布:美国资产证券化数据 编辑:程序博客网 时间:2024/05/15 18:08
控制函数用于对C语言程序的标准控制流(如if/else、switch、for等)提供扩展,在头文件assert.h、setjmp.h和signal.h中提供,分别提供表达式断言功能、非本地跳转功能、信号处理功能。
1、assert.h:提供用于断言的assert宏。程序中若没有定义NDEBUG,则asset(exp)对表达式exp进行断言,若断言为假(即为0),则会调用__assert_fail函数打印一条“断言失败”的消息,并终止程序。若定义了NDEBUG宏,则assert通常为空语句。
解释:
(1)GNU还提供了一个扩展assert_perror,功能与assert类似,只不过打印指定的错误码对应的消息,通过__assert_perror_fail函数来实现。另外提供的_assert函数是为了与标准兼容,它的功能由__assert_fail取代。
(2)__assert_fail和__assert_perror_fail函数都是把指定格式的消息写入到buf中,然后打印buf中的消息,并刷新标准错误流的状态,释放消息缓冲区buf,最后要调用abort函数终止程序。
2、setjmp.h:标准库函数setjmp和longjmp实现基本形式的非本地跳转。setjmp用于保存调用者的堆栈环境(被保存在表示跳转缓冲区的jmp_buf型数组ENV中),然后返回0。longjmp用于跳转到保存堆栈环境的地方,并从那里的setjmp调用返回,返回指定的状态码,如果状态码为0则返回1。
注意setjmp和longjmp函数都是直接调用内部函数来完成工作的。头文件setjmp.h中的其他部分都是BSD、XOPEN或POSIX方面的扩展。
3、signal.h:定义了信号原子类型sig_atomic_t、信号处理函数的注册signal、发送信号的函数raise。它包含了bits/signum.h,这个Linux系统的头文件中定义了C标准中的信号及其他一些信号。标准C语言中的信号有SIGINT,SIGILL,SIGABRT,SIGFPE,SIGSEGV,SIGTERM,还要3个特殊的信号SIGERR,SIG_DFL, SIG_IGN,因此标准C语言中总共有9个信号。
signal.h代码如下:
bits/signum.h代码如下:
signal函数和raise函数的实现:
注意signal和raise函数并没有做任何特别的实现,只是处理了一下出错时的情况(返回SIG_ERR,即-1)。真正的实现使用Linux中有对应功能的函数,signal直接映射到Linux的ssignal函数,raise直接映射到Linux的gsignal函数。
- C标准库源码解剖(9):控制函数assert.h, setjmp.h和signal.h
- C标准库源码解剖(9):控制函数assert.h, setjmp.h和signal.h
- 控制函数assert.h, setjmp.h和signal.h
- C标准库源码解剖(3):字符处理函数ctype.h和wctype.h
- C标准库源码解剖(4):字符串处理函数string.h和wchar.h
- C标准库源码解剖(5):字符串处理函数string.h和wchar.h(续)
- C标准库源码解剖(6):字符串处理函数string.h和wchar.h(续)
- C标准库源码解剖(15):数学函数库math.h, tgmath.h和complex.h
- C标准库源码解剖(13):输入输出函数stdio.h
- C标准库源码解剖(14):通用函数stdlib.h
- C标准库源码解剖(13):输入输出函数stdio.h
- setjmp.h signal.h assert.h的用法
- C标准库源码解剖(11):扩展整数类型stdint.h和inttypes.h
- C标准库源码解剖(11):扩展整数类型stdint.h和inttypes.h
- C标准库源码解剖(2):错误报告errno.h
- C标准库源码解剖(7):日期与时间函数time.h
- C标准库源码解剖(8):日期与时间函数time.h(续)
- C标准库源码解剖(10):区域设置函数locale.h
- 收藏:惊人的专业,不凡的唱功,卓越的感情!——徐杰 鑽石夜總會 紅豆
- String类的几个方法
- 诺贝尔奖杂感
- Create a Windows CE Image That Boots to Kiosk Mode
- 父子关系及inverse 详解
- C标准库源码解剖(9):控制函数assert.h, setjmp.h和signal.h
- PHP 环境搭建要领 call to undefined function mysql_connect
- JSP中各种内置对象
- 什么是工作?认真,用心!(转载)
- 《Thinking in Java》RMI远程方法示例代码运行是可能遇到的问题及解决方法
- windows的文件复制粘贴个数限制
- 每天三题系列之杭电OJ 2006 2007 2008
- 最近的一些感悟
- solaris 10 无法上网解决办法