GNU C library 笔记1

 

内容:Introduction 和 Error Reporting
1. glibc 所实现全部或部分规范下的功能有

  • ISO C: The international standard for the C programming language.
  • POSIX: The ISO/IEC 9945 (aka IEEE 1003) standards for operating systems.
  • Berkeley Unix: BSD and SunOS.
  • SVID: The System V Interface Description.
  • XPG: The X/Open Portability Guide.

如果只需要 ISO C 的功能,能在编译时使用 -ansi 选项。glibc 实现了全部的 ISO C 功能。POSIX 是 ISO C 的超集,他额外的包括了 file system interface primitives、device-specific terminal control functions、process control functions。Berkeley Unix 实现了前两者多数功能,源于 4.2 BSD、4.3 BSD, and 4.4 BSD Unix 系统(一般称为 Berkeley Unix)及 SunOS (基于 4.2 BSD 不过又实现了 System V 的部分功能),他额外的包括了 symbolic links、the select function、BSD signal functions、sockets。SVID 是 System V Interface Description,也就是描述 AT&T Unix System V operating system 的一份文件,某种意义上是 POSIX 的超集,不过没有已有的 Unix 实现了其全部功能,glibc 也仅仅实现了其部分功能。他额外实现的功能包括 the methods for inter-process communication(IPC)、shared memory、hsearch、drand48 系列函数、fmtmsg、一些其他的数学函数。XPG(The X/Open Portability Guide)描述了什么样的系统满足类 Unix 系统的基本需要,glibc 服从该需求。

2. 头文件里面某些函数的实现使用 macro 做到的,理由是一般这样会更快。不过不必差别他们,因为一般定义了同名的函数,如 abs(int) 既有函数定义也有 macro 定义,使用 & 操作时,由于 macro 调用时不能匹配到 () 因此仍然能取到函数的地址。如果需要显式的调用函数能用 () 将函数名包围,如 (abs)(3),又或使用 #undef abs 将定义过的 macro 取消。

3. ISO C 允许重复 #include 头文件,不过 glibc 使用了 #define #ifndef 等预处理器命令避免了同一头文件重复装载,因此能放心的 #include glibc 的头文件。

4. 除了 ISO C 定义的一些保留字,由于 glibc 实现了一些额外的功能,建议不要使用可能和之冲突的一些命名方式。

5. 怎么开启某种标准下 glibc 的功能。前面提到能利用 -ansi 仅仅使用 ISO C 以内的功能。其他的通过定义 macro 实现条件编联,实现方式分两种,能在 .c 里面 #define,或用 -D 把这个 macro 传递给 gcc。为了实现 POSIX 的功能,应定义 _POSIX_SOURCE (_POSIX_C_SOURCE 决定实现的 POSIX 标准类型,如 1、2、>3 实现的功能逐步增多)。类似的有 _BSD_SOURCE、_SVID_SOURCE、_XOPEN_SOURCE。为了处理大文件产生的问题,应定义 _LARGEFILE_SOURCE,又比如 64 位文件系统应定义 _LARGEFILE64_SOURCE。_ISOC99_SOURCE 允许使用 ISO C 99 的标准。_GNU_SOURCE 将允许使用全部的 glibc 的功能。

#define _GNU_SOURCE
#include
#include

int
main( int argc, char *argv[] )
{
printf( "%s\n%s\n%s\n", argv[0],
program_invocation_short_name,
program_invocation_name ) ;

return 0 ;
}

该例子给出了怎么使用非 ISO C 的 program_invocation_(short_)name 变量(程式名带或不带路径)的例子。使用 _REENTRANT 和 _THREAD_SAFE 时确保使用对应的函数。

6. error handling 模型,这种依赖于全局变量 errno 的做法 ms 被 BS bs 了 -.-b 指责的原因是不能处理多线程倒是文件中解释了怎么处理 signal handling 时 errno 的处理(先备份,再修改以免丢失),不过如果忘了这样做可能会把一些潜在的错误覆盖掉,其错误的定义在 errno.h 文件中。可使用 string.h 里面的 strerror( int errno ) 获得该 errno 下的一个字符串解释,不过有更简单的函数,如 perror( const char * ) 输出指定字符串后加上一个冒号和空格再输出错误解释(errno.h)。有一些功能更强大的函数 strerror_r 将字符串写入指定的缓存(多线程时需要),另外为了使得输出更统一(符合 GNU Coding Standard),在 error.h 中定义了一些更加方便的函数,如 error 系列 err 系列,在解析文件时能用到的 error_at_line 系列、warn 系列。注意 error 函数能指定一个调用 exit 的值,
这样就不会返回了,不过能让其返回增大 error_message_count。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值