Chinaunix首页 | 论坛 | 博客
  • 博客访问: 178827
  • 博文数量: 13
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 832
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-16 22:43
个人简介

最近关注Python,Linux,LLVM

文章分类

全部博文(13)

文章存档

2014年(13)

分类: 其他UNIX

2014-03-07 15:34:20

UNIX的具体实现差异大,但标准接口早就稳定很多年了,尤其是认证UNIX(如HP UX, IBM AIX, Oracle Solaris, Mac OS X 10.5+),必须实现POSIX.1-2001/SUS v3,而APUE的核心内容都在上述标准范围内。

APUE(UNIX环境高级编程)都有三个版本了,从官网下载2005年的第二版,书中覆盖了FreeBSD 5.2.1/Linux 2.4.22/Solaris 9/Mac OS X 10.3,比较古老了。下面我在2013年发布Mac OS X 10.9(gcc 4.2.1基于LLVM 3.3)上编译所有代码

1. 目录树顶层部分内容。

  1. bash-3.2 $ll | head -20
  2. total 1728
  3. drwxr-xr-x 248 Guorui staff 8432 1 24 16:59 ./
  4. drwx------+ 11 Guorui staff 374 1 24 16:37 ../
  5. -r--r--r-- 1 Guorui staff 656 5 29 2005 DISCLAIMER
  6. -rw-r--r-- 1 Guorui staff 552 5 29 2005 Make.defines.freebsd
  7. -rw-r--r-- 1 Guorui staff 568 5 29 2005 Make.defines.linux
  8. -rw-r--r-- 1 Guorui staff 555 1 24 16:59 Make.defines.macos
  9. -rw-r--r-- 1 Guorui staff 550 5 29 2005 Make.defines.solaris
  10. -rw-r--r-- 1 Guorui staff 678 5 29 2005 Makefile
  11. -rw-r--r-- 1 Guorui staff 1511 5 30 2005 README
  12. drwxr-xr-x 11 Guorui staff 374 5 28 2005 advio/
  13. drwxr-xr-x 14 Guorui staff 476 5 29 2005 call/
  14. drwxr-xr-x 24 Guorui staff 816 5 29 2005 calld/
  15. drwxr-xr-x 11 Guorui staff 374 5 28 2005 daemons/
  16. drwxr-xr-x 7 Guorui staff 238 5 28 2005 datafiles/
  17. drwxr-xr-x 9 Guorui staff 306 5 28 2005 db/
  18. drwxr-xr-x 13 Guorui staff 442 5 28 2005 environ/
  19. drwxr-xr-x 17 Guorui staff 578 5 28 2005 exercises/
  20. lrwxr-xr-x 1 Guorui staff 13 5 28 2005 fig1.10@ -> proc/shell2.c
  21. lrwxr-xr-x 1 Guorui staff 10 5 28 2005 fig1.3@ -> file/ls1.c

2. 编译过程。
1)首先读下README,然后进入 Make.defines.macos中修改当前源码所在目录,完毕。
2)输入“make macos”开始编译,警告很多,直到出现一个未定义符号的链接错误终止编译了:

  1. gcc -ansi -I/Users/Guorui/Downloads/apue.2e/include -Wall -DMACOS -DDEBUG -o call main.o call.o put.o take.o takeput.o escape.o loop.poll.o ../sockets/clconn.o ../lib/libapue.a
  2. clang: warning: argument unused during compilation: '-ansi'
  3. Undefined symbols for architecture x86_64:
  4. "_CMSG_LEN", referenced from:
  5. _recv_fd in libapue.a(recvfd.o)
  6. ld: symbol(s) not found for architecture x86_64
  7. clang: error: linker command failed with exit code 1 (use -v to see invocation)
  8. make[1]: *** [call] Error 1
  9. make: *** [macos] Error 1
3) 寻找和解决编译错误。发现宏'CMSG_LEN'未定义,因为OS X在x86-64架构下的兼容标准已经变为严格符合SUSv3了,
默认去掉了一些传统UNIX的扩展函数。不妨再加入那些扩展函数,于是在Make.defines.macos加入'-D_DARWIN_C_SOURCE'。
再次编译,依然很多警告,无视,幸好全部成功。
4) 随便找了一个例子运行,用系统调用生成空洞文件。

  1. bash-3.2 $l
  2. access* changemod.c fileflags.c ftw4.c linux.mk macos.mk solaris.mk umask* zap.c
  3. access.c devrdev* filetype* hello* longpath* mycd* testerror* umask.c
  4. cdpwd* devrdev.c filetype.c hello.c longpath.c mycd.c testerror.c unlink*
  5. cdpwd.c file.hole freebsd.mk hole* ls1* seek* uidgid* unlink.c
  6. changemod* fileflags* ftw4* hole.c ls1.c seek.c uidgid.c zap*
  7. bash-3.2 $./hole
  8. bash-3.2 $ll file.hole
  9. -rw-r--r-- 1 Guorui staff 16394 1 24 18:11 file.hole

3.总体来看只新增了一个宏就完成全部编译,没任何代码修改,没什么难度。至于研究具体的调用行为,则是看这本书的目的了,
而且SUSv3中的标准工具和接口行为正确性,OpenGroup认证UNIX时已经测试了,无需我们担心。

阅读(4639) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~