- 論壇徽章:
- 11
|
UNIX的具體實(shí)現(xiàn)差異大,但標(biāo)準(zhǔn)接口早就穩(wěn)定很多年了,尤其是認(rèn)證UNIX(如HP UX, IBM AIX, Oracle Solaris, Mac OS X 10.5+),必須實(shí)現(xiàn)POSIX.1-2001/SUS v3,而APUE的核心內(nèi)容都在上述標(biāo)準(zhǔn)范圍內(nèi)。
APUE(UNIX環(huán)境高級編程)都有三個版本了,從官網(wǎng)下載2005年的第二版,書中覆蓋了FreeBSD 5.2.1/Linux 2.4.22/Solaris 9/Mac OS X 10.3,比較古老了。下面我在2013年發(fā)布Mac OS X 10.9(gcc 4.2.1基于LLVM 3.3)上編譯所有代碼
1. 目錄樹頂層部分內(nèi)容。- bash-3.2 $ll | head -20
- total 1728
- drwxr-xr-x 248 Guorui staff 8432 1 24 16:59 ./
- drwx------+ 11 Guorui staff 374 1 24 16:37 ../
- -r--r--r-- 1 Guorui staff 656 5 29 2005 DISCLAIMER
- -rw-r--r-- 1 Guorui staff 552 5 29 2005 Make.defines.freebsd
- -rw-r--r-- 1 Guorui staff 568 5 29 2005 Make.defines.linux
- -rw-r--r-- 1 Guorui staff 555 1 24 16:59 Make.defines.macos
- -rw-r--r-- 1 Guorui staff 550 5 29 2005 Make.defines.solaris
- -rw-r--r-- 1 Guorui staff 678 5 29 2005 Makefile
- -rw-r--r-- 1 Guorui staff 1511 5 30 2005 README
- drwxr-xr-x 11 Guorui staff 374 5 28 2005 advio/
- drwxr-xr-x 14 Guorui staff 476 5 29 2005 call/
- drwxr-xr-x 24 Guorui staff 816 5 29 2005 calld/
- drwxr-xr-x 11 Guorui staff 374 5 28 2005 daemons/
- drwxr-xr-x 7 Guorui staff 238 5 28 2005 datafiles/
- drwxr-xr-x 9 Guorui staff 306 5 28 2005 db/
- drwxr-xr-x 13 Guorui staff 442 5 28 2005 environ/
- drwxr-xr-x 17 Guorui staff 578 5 28 2005 exercises/
- lrwxr-xr-x 1 Guorui staff 13 5 28 2005 fig1.10@ -> proc/shell2.c
- lrwxr-xr-x 1 Guorui staff 10 5 28 2005 fig1.3@ -> file/ls1.c
復(fù)制代碼 2. 編譯過程。
1)首先讀下README,然后進(jìn)入 Make.defines.macos中修改當(dāng)前源碼所在目錄,完畢。
2)輸入“make macos”開始編譯,警告很多,直到出現(xiàn)一個未定義符號的鏈接錯誤終止編譯了:- 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
- clang: warning: argument unused during compilation: '-ansi'
- Undefined symbols for architecture x86_64:
- "_CMSG_LEN", referenced from:
- _recv_fd in libapue.a(recvfd.o)
- ld: symbol(s) not found for architecture x86_64
- clang: error: linker command failed with exit code 1 (use -v to see invocation)
- make[1]: *** [call] Error 1
- make: *** [macos] Error 1
復(fù)制代碼 3) 尋找和解決編譯錯誤。發(fā)現(xiàn)宏'CMSG_LEN'未定義,因?yàn)镺S X在x86-64架構(gòu)下的兼容標(biāo)準(zhǔn)已經(jīng)變?yōu)閲?yán)格符合SUSv3了,
默認(rèn)去掉了一些傳統(tǒng)UNIX的擴(kuò)展函數(shù)。不妨再加入那些擴(kuò)展函數(shù),于是在Make.defines.macos加入'-D_DARWIN_C_SOURCE'。
再次編譯,依然很多警告,無視,幸好全部成功。
4) 隨便找了一個例子運(yùn)行,用系統(tǒng)調(diào)用生成空洞文件。- bash-3.2 $l
- access* changemod.c fileflags.c ftw4.c linux.mk macos.mk solaris.mk umask* zap.c
- access.c devrdev* filetype* hello* longpath* mycd* testerror* umask.c
- cdpwd* devrdev.c filetype.c hello.c longpath.c mycd.c testerror.c unlink*
- cdpwd.c file.hole freebsd.mk hole* ls1* seek* uidgid* unlink.c
- changemod* fileflags* ftw4* hole.c ls1.c seek.c uidgid.c zap*
- bash-3.2 $./hole
- bash-3.2 $ll file.hole
- -rw-r--r-- 1 Guorui staff 16394 1 24 18:11 file.hole
復(fù)制代碼 5. 總體來看只新增了一個宏就完成全部編譯,沒任何代碼修改,沒什么難度。至于研究具體的調(diào)用行為,則是看這本書的目的了,
而且SUSv3中的標(biāo)準(zhǔn)工具和接口行為正確性,OpenGroup認(rèn)證UNIX時已經(jīng)測試了,無需我們擔(dān)心。
|
|