iT邦幫忙

DAY 8
2

emacs的30天學習筆記系列 第 8

emacs 做中學第八天:

到了40歲,除了剩一張嘴,好像積極進取的心也沒了,web server並不是分享中的重要output,只是純粹Just for fun(好玩)。本來想直接trace lighttpd, 只是從那裏切入,真是傷腦筋。

平日tiptop 6.x的維護,因為4js法國原廠的除錯環境有點問題,有些地方會當掉,如開一個對話盒,將record array傳到report function會當,有時只能display 到console的方式,看丟出來的訊息。

可能是職業習性,幾乎不具無中生有,開發的能力,安慰自己的說話,是不要重覆打造輪子,重用別人的輪子。但是証據史實,長期的積累,常常是軟體之後最難被跨越的門檻。在成長的過程中,也把生態圈(eco system)佈建了起來。

Linux 剛呱呱落地時,minix的作者,http://www.minix3.org/
,以教授的角度,說它的核心是落伍過時的設計,而unix的其中一個爸爸,公開說這系統無法引起它的注意。連Linus 自己都說,如果他在北歐知道BSD 這個UNIX variant(變種),他應該不會開發Linux。柏克萊大學的BSD當時和AT&T在UNIX智慧財產權上有爭議,雖然諷刺的是,柏克萊大學的Hacker學生,對UNIX的貢獻,其質與量都遠遠超越他們當初拿到最陽春的UNIX。但無法自由使用,史托曼先生在美國他最熟悉的校園,沒法實現他的理想,只好無奈寄託於北歐小國的研究生。

當然歐陸的計算機科學家,一直人才輩出。從PASCAL的沃斯先生,C++之父,
HTML的創造者,delphi之父,隔海的英倫的圖靈先生,還有網路演算法的D先生。

20年後,Linux在桌面依舊沒起色,沒有走入老百姓家庭裏,在這不算短的日子裏,ECO SYSTEM 建立起來,不用在桌面,用在其他方面,已足以養家活口,跟據市場的生存機制,也可判斷,desktop依舊無利可圖。所以要張大眼往有利的方向走。

今年的COSCUP開始有了OPEN HARDWARE的概念,嵌入式實驗板的代表是beagle board,而更低階cpu的實驗版就是Arduino。又是烏托邦,又是ECO SYSTEM。
真是往古人的大同世界天下為公。

當然,MS 和Apple 永遠提醒著我們,這條路仍然艱辛。

Linux 是種演化,在20年前,大家總希望它帶來一場革命(Revolution)。

佔領華爾街的茉莉花行動逐準在全世界漫延開來。希望是場Evolution。
昨晚在混亂中,整理出了一些頭緒。昨晚真讓人糾結

今晚對兩大目標,進行trace。
一個是初始化階段,把網站根目錄的檔案掃描一遍
測試動作如下:(熱身,n 下一步,p 把變數印出來)

(gdb) p argv[4]
$6 = 0xbffff50b "/home/timloo/web_doc"

(gdb) p argv[0]
$8 = 0xbffff4e1 "/home/timloo/cheetah-1.8/cheetah"
(gdb) p dirpnt
$9 = (DIR *) 0x804e008
(gdb) p dir
$10 = 0xbffff50b "/home/timloo/web_doc"

$12 = 0x8056028 "/home/timloo/web_doc/2nd.html"
(gdb) p curdir->d_name
$13 = "2nd.html\000\376f\005\000\324yp\021\030\000\bindex.html\000\000\bC\021\002\000\222\256v\024\020\000\004..\000\000\004\004\200\005\000\021w\n1\020\000\004.\000\000\000\004\022g\005\000\377\377\377\177\024\000\b3rd.html", '\000' <repeats 171 times>
(gdb) p rv
$14 = 0
(gdb) p curfile
$15 = (servable *) 0x8056050
(gdb) p curfile->filename
$16 = 0x8056078 "2nd.html"
(gdb) p curfile->filename
$17 = 0x80560d8 "index.html"
(gdb) p fullpath
$18 = 0x80560e8 "/home/timloo/web_doc/."
(gdb) p fullpath
$19 = 0x8056108 "/home/timloo/web_doc/3rd.html"
(gdb) p generate_index
$20 = 0

小結: 原作者用一個串列資料結構(linked list),把網站根目錄下的檔案遞迴的掃一遍,放進串列裏。而 **.[b] , [b]..**也是檔案哦,要排掉,這段蠻驚訝的。操作檔案的function,很有特色,因為不熟,分不出是自訂義的function還是系統function,沒辦法 step into,就是系統函式。

另一個是,client / server 交談的格式。

在函式 handle_request 裏體現。

(gdb) p inbuffer                                                        
$5 = "GET / HTTP/1.1\000\000Host: localhost:9000\000\000User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.8) Gecko/20100723 Ubuntu/9.10 (karmic) Firefox/3.6.8\000\000Accept: text/html,application/xhtml+xml,applica"...

在中斷點印出值,瀏覽器傳給server的訊息。
然後截取出想要的資料。

然後回傳訊息給client。

(gdb) p outb                                                                         
$10 = "Content-Type: text/html\r\n\000;\000\000\000\000\000\n\000\000\000\236\367:\000\000\000\000\000\000\000\000\001  ;\000p&;\000\000\002\000\000\177ELF\001\001\001\000\000\000\000\000\000\000\000\000\003\000\003\000\001\000\

比較特別的是,response 給client的訊息,是一段一段的送的,所以不易看出全貌。原作者以safesend函式來傳。

./cheetah.c:109:static int safesend(int fd, char * out);
./cheetah.c:363: if(safesend(fd, out) == -1) return;
./cheetah.c:367: if(safesend(fd, outb) == -1) return;
./cheetah.c:371: if(safesend(fd, out) == -1) return;
./cheetah.c:375: if(safesend(fd, outb) == -1) return;
./cheetah.c:379: if(safesend(fd, msg404) == -1) return;
./cheetah.c:383: if(safesend(fd, outb) == -1) return;
./cheetah.c:391: if(safesend(fd, out) == -1) return;
./cheetah.c:401: if(safesend(fd, outb) == -1) return;
./cheetah.c:406: if(safesend(fd, outb) == -1) return;
./cheetah.c:413: if(safesend(fd, outb) == -1) return;
./cheetah.c:418: if(safesend(fd, outb) == -1) return;
./cheetah.c:453: if(safesend(fd, outb) == -1) return;
./cheetah.c:458: if(safesend(fd, outb) == -1) return;
./cheetah.c:462: if(safesend(fd, file->content) == -1) return;
./cheetah.c:544:static int safesend(int fd, char * out) {

一段一段的傳回。

今晚又發生了意外的小插曲,不知道是手賤誤按,還是@#$,
原來聽的port 8000 ,被佔掉了,

我在emacs裏的gdb模式,因為少了一些關鍵字,一直關閉,一直關閉,試了多次,
莫名奇怪。

後來出來shell,再gdb,發現bind port 失敗,

看了一下行程,真得多了一個莫名的行程出來。

程式把port 改成9000,又繼續往下測試了。

ps aux

timloo 3501 0.0 0.1 1704 520 pts/4 Ss+ 06:59 0:00 /home/timloo/cheetah-1.8/cheetah -d -l -v /home/t
timloo 3798 0.0 0.1 1748 524 ? S 07:41 0:00 /bin/sh /usr/lib/firefox-3.6.8/firefox
timloo 3803 0.0 0.1 1748 532 ? S 07:41 0:00 /bin/sh /usr/lib/firefox-3.6.8/run-mozilla.sh /us
timloo 3807 1.4 17.9 266600 91480 ? Sl 07:41 0:11 /usr/lib/firefox-3.6.8/firefox-bin
timloo 3829 0.0 3.9 67704 19884 ? Sl 07:41 0:00 /usr/lib/firefox-3.6.8/plugin-container /usr/lib/
timloo 3917 0.0 1.2 10784 6584 pts/2 S+ 07:51 0:00 gdb cheetah
timloo 3921 0.0 0.0 1704 444 pts/2 T 07:52 0:00 /home/timloo/cheetah-1.8/cheetah -d -l -v /home/t


結論:每晚皆有突發狀況,所以都是淺淺的trace一下。
http://www.w3.org/Protocols/rfc2616/rfc2616.html
rfc 2616 算是比較親和的http spec。

今晚可以理解BROWSER 默默的丟了不少訊息給web server ,web server 可以分段的把訊息傳回給browser。


上一篇
emacs 做中學第七天:mini web server :獵豹(cheetah)1.8,繼續GDB
下一篇
emacs 做中學第九天:學然後知不足,用然後知不好用
系列文
emacs的30天學習筆記38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言