?? software-building-8.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.7">
<TITLE>在 Linux 下建立軟體套件: 第三個例子: Fortune</TITLE>
<LINK HREF="Software-Building-9.html" REL=next>
<LINK HREF="Software-Building-7.html" REL=previous>
</HEAD>
<BODY>
<A HREF="Software-Building-9.html">Next</A>
<A HREF="Software-Building-7.html">Previous</A>
<A HREF="Software-Building.html#toc8">Contents</A>
<HR>
<H2><A NAME="s8">8. 第三個例子: Fortune</A></H2>
<P>最後例子需要某些 C 程式設計知識. 大部分的 Linux 軟體是用 C 寫的,
而且至少學點 C 明顯的對任何想軟體安裝的人會有助益.
<P>惡名昭彰的(notorious) <EM>fortune</EM> 程式在每次 Linux
開機起來時秀出幽默的諺語 "fortune cookie".
不幸地 (有雙關意思的), 設法在 Red Hat 發行套件 2.0.30 的核心下建立,出現了
一堆嚴重的錯誤.
<P>
<HR>
<PRE>
~/fortune# make all
gcc -O2 -Wall -fomit-frame-pointer -pipe -c fortune.c -o
fortune.o
fortune.c: In function `add_dir':
fortune.c:551: structure has no member named `d_namlen'
fortune.c:553: structure has no member named `d_namlen'
make[1]: *** [fortune.o] Error 1
make[1]: Leaving directory `/home/thegrendel/for/fortune/fortune'
make: *** [fortune-bin] Error 2
</PRE>
<HR>
<P>
<P>
<P>
<P>看一下 <CODE>fortune.c</CODE>, 有關聯的幾行在這.
<P>
<HR>
<PRE>
if (dirent->d_namlen == 0)
continue;
name = copy(dirent->d_name, dirent->d_namlen);
</PRE>
<HR>
<P>我們需要找出 <CODE>dirent</CODE> 的 structure, 但它沒有宣告(declared)在
<EM>fortune.c</EM> 檔案中, 想用 <B>grep dirent</B>
來秀出是否在其它原始碼的檔案中, 但也沒有. 然而, 在 <EM>fortune.c</EM>
檔的最上方有下列這行.
<P>
<HR>
<PRE>
#include <dirent.h>
</PRE>
<HR>
<P>這似乎是系統函式庫的 include 檔案, 所以要找 <EM>dirent.h</EM> 的合理位置是在
<EM>/usr/include</EM>. 事實上, <EM>dirent.h</EM> 的確有在 <EM>/usr/include</EM>
中, 但該檔沒有包含 <CODE>dirent</CODE> 的 structure. 然而, 參考另一個
<EM>dirent.h</EM> 檔.
<P>
<HR>
<PRE>
#include <linux/dirent.h>
</PRE>
<HR>
<P>
<P>最後, 去 <EM>/usr/include/linux/dirent.h</EM>, 我們可找到我們所需要宣告的
structure.
<P>
<HR>
<PRE>
struct dirent {
long d_ino;
__kernel_off_t d_off;
unsigned short d_reclen;
char d_name[256]; /* We must not include
limits.h! */
};
</PRE>
<HR>
足夠地確定, 這個 structure 宣告沒有包含 <EM>d_namelen</EM>,
但有一對與其相當的選擇. 其中最可能的是 <EM>d_reclen</EM>, 因為
這個 structure member 表示某樣東西的 length 而且它是 short integer.
其他大略, <EM>d_ino</EM>, 可能是 inode number, 判斷它的 name 和 type.
事實上, 我們大概是處理 "directory entry" structure, 而元素表示檔案屬性,
它的名稱, inode, 和 length (以 blocks 作單位). 這似乎對我們的猜想很合理.
<P>我們編輯檔案 <EM>fortune.c</EM>, 而且改變在551行和553行的 <CODE>d_namelen</CODE>
變成 <CODE>d_reclen</CODE>. 再試試 <CODE>make all</CODE>. <B>Success.</B>
這次建立沒有錯誤. 我們現在能夠從 <EM>fortune</EM> 獲得 "cheap thrills"
<P>
<HR>
<A HREF="Software-Building-9.html">Next</A>
<A HREF="Software-Building-7.html">Previous</A>
<A HREF="Software-Building.html#toc8">Contents</A>
</BODY>
</HTML>
?? 快捷鍵說明
復制代碼
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -