- 論壇徽章:
- 2
|
來(lái)晚了。。。 很早就注意到這個(gè)活動(dòng)。。。 但年關(guān)時(shí)各種忙。。。 一直在慢慢修改草稿。。。 今天貌似已經(jīng)從C/C++版塊的置頂里去掉了。。。 再不改完就沒(méi)機(jī)會(huì)發(fā)的樣子。。。
于是趕緊地。。。
這確實(shí)是一本不可多得的好書(shū)。
這本書(shū)給我的感覺(jué)與《Windows核心編程》的很類(lèi)似:整體的、系統(tǒng)的認(rèn)識(shí)就靠它了。
并且本書(shū)的焦點(diǎn)就是Linux,而不像其他一些書(shū)籍的討論的是一個(gè)很寬泛的*nix。 對(duì)不知道APUE在說(shuō)啥的同學(xué)(比如我自己)不妨先看看這本。
1、您在Linux/UNIX系統(tǒng)編程行業(yè)的經(jīng)歷及經(jīng)驗(yàn)
接觸電腦的契機(jī)首先是游戲。。。 然后才是編程。
不過(guò)十多年前網(wǎng)絡(luò)上的各種資料比現(xiàn)在少得多,尤其是中文資料更少,自己英語(yǔ)水平也很差。。。 在沒(méi)人領(lǐng)進(jìn)門(mén)的情況學(xué)習(xí)Linux/UNIX下的編程很難誒。。。
實(shí)際情況是老師教什么就是什么,于是最開(kāi)始的編程環(huán)境自然是Windows。。。 根本就沒(méi)想過(guò)除了它之外還有沒(méi)有其他選擇。。。
本科的時(shí)候終于有人教了。但實(shí)際上沒(méi)學(xué)到什么東西。
上得臺(tái)面的原因可能是:確實(shí)有太多“周邊的”新事物要學(xué)。
比如編輯器,F(xiàn)在都還有印象的事情是進(jìn)了vi就不知道怎么退出。。。最終是在Windows上打開(kāi)VS讀取與編輯虛擬機(jī)里的文件然后在虛擬機(jī)里編譯并運(yùn)行。。。
再比如編譯器。在這個(gè)課程很久之后才弄明白從編寫(xiě)C/C++的源代碼到執(zhí)行直接到底發(fā)生了什么。更久之后才知道調(diào)試的情況。
沒(méi)有IDE只有一個(gè)“裸”gcc在那時(shí)候根本玩不轉(zhuǎn)。。。 調(diào)試什么的只能printf。。。
還要順帶學(xué)make。。。 只好復(fù)制粘貼然后不明所以地改到貌似能正確工作為止。。。
上不得臺(tái)面的原因可能是:課程老師吸引力不夠。。。
而在同一時(shí)間Windows那邊的課程已經(jīng)開(kāi)始玩GUI了。
雖然編程的方式從“進(jìn)入main后一步兩步三步四步望著天執(zhí)行什么由程序員說(shuō)了算”變到“進(jìn)入main后準(zhǔn)備好各種事情然后由用戶(hù)來(lái)決定該先執(zhí)行什么”會(huì)讓人一開(kāi)始難以適應(yīng)。
但這是在學(xué)編程而不需要再去熟悉編程的“周邊”環(huán)境。并且相比之前那種黑框白字的程序來(lái)說(shuō)要“絢”得多了。
于是精力就耗在這邊了。 總之就是沒(méi)入門(mén)。。。
有點(diǎn)跑題了,不過(guò)我覺(jué)得教育資源的缺少 —— 入門(mén)門(mén)檻高又沒(méi)老師(或師傅)帶領(lǐng),能留下的是少數(shù),又會(huì)導(dǎo)致下一代人的師傅更少 —— 是推廣難的一個(gè)很大原因。
之后為了避免依賴(lài)MSVC的特定行為所以在Windows下也會(huì)使用MinGW/MSYS,慢慢地對(duì)gcc,gnumake等工具比較熟悉了。
因?yàn)楫厴I(yè)論文需要實(shí)現(xiàn)一個(gè)可以分配可執(zhí)行內(nèi)存的庫(kù)于是終于逮到機(jī)會(huì)進(jìn)行Linux下的系統(tǒng)編程了。。。
看過(guò)APUE等書(shū)后可以編程,但依然感覺(jué)不得要領(lǐng),The Art of Unix Programming更是飄渺虛無(wú)。。。
最后在論壇的這個(gè)帖子里經(jīng)由雨過(guò)白鷺洲介紹知道了這本書(shū)。
因?yàn)闆](méi)有太多機(jī)會(huì)進(jìn)行Linux系統(tǒng)編程于是至今都沒(méi)能仔細(xì)通讀這本書(shū)。
但在使用許多*nix下工具時(shí)出于好奇或是想確認(rèn)這些工具能像預(yù)期般工作時(shí)都會(huì)拿出來(lái)翻翻。
比如一些web服務(wù)器是否用了epoll,sendfile等系統(tǒng)調(diào)用,一些程序是否在完成必要工作后確實(shí)丟棄了root權(quán)限,setuid/setgid程序是如何工作的,以及capabilities等等。
2、Linux/UNIX系統(tǒng)編程職業(yè)生涯的發(fā)展探討
因?yàn)樽约褐饕歉慵夹g(shù)方面的,所以對(duì)業(yè)務(wù)方面只是閑聊時(shí)聽(tīng)聽(tīng)。
這里說(shuō)幾個(gè)自己聽(tīng)到的也比較有趣的: 定制廣告機(jī)、基于雷達(dá)監(jiān)控的停車(chē)場(chǎng)管理系統(tǒng)、無(wú)盤(pán)啟動(dòng)。
它們都需要對(duì)Linux有很深的了解于是我們就無(wú)能為力了。。。
其實(shí)廣告機(jī)做過(guò)一段時(shí)間,感覺(jué)很吃力。。。 并且業(yè)務(wù)方面也停了于是就沒(méi)繼續(xù)做下去了。。。
3、對(duì)于新入門(mén)的Linux/UNIX系統(tǒng)編程人員來(lái)說(shuō),您有什么話(huà)對(duì)他們說(shuō)?
嗯。。。 一句正確的廢話(huà):“盡信書(shū)不如無(wú)書(shū)”。而且也不僅僅針對(duì)書(shū)。所有的文章、言論 —— 無(wú)論出自何人何處 —— 都應(yīng)該用作參考而不是代替自己思考。
對(duì)這個(gè)帖子也是這樣。這只是我自己的一些經(jīng)驗(yàn),肯定無(wú)法適應(yīng)于所有情況,甚至可能根本就是錯(cuò)的。
有了這樣的免責(zé)聲明后就可以胡亂瞎說(shuō)一些與這本書(shū)有關(guān)的經(jīng)驗(yàn)。
首先,不加思考地將書(shū)里所教授的技術(shù)直接應(yīng)用到編程里是一個(gè)很不好的習(xí)慣。
特定于這本書(shū)的內(nèi)容可以用Daemon有關(guān)的章節(jié)作例子。
實(shí)現(xiàn)守護(hù)進(jìn)程時(shí)肯定需要這些技術(shù)。但要抵制住“因?yàn)樽约毫私饬诉@些技術(shù)于是就要將它應(yīng)用到自己所寫(xiě)的程序里”的誘惑。
自己寫(xiě)一些程序用于練手肯定沒(méi)問(wèn)題。但要將它應(yīng)用到生產(chǎn)環(huán)境時(shí)可以考慮“該程序是否有必要自守護(hù)化”? 是否有方法可以將“守護(hù)化”作為一個(gè)可復(fù)用的功能?
其次,進(jìn)程本身以及進(jìn)程之間的繼承關(guān)系本身就是一種很有效的復(fù)用手段。
繼續(xù)以Daemon作為例子。
為每個(gè)程序?qū)崿F(xiàn)守護(hù)化的功能肯定是難以編寫(xiě)與調(diào)試的。
將這些功能實(shí)現(xiàn)為一個(gè)程序庫(kù)并在每個(gè)程序里復(fù)用這個(gè)庫(kù)雖然可以減輕這兩個(gè)問(wèn)題,但是就我自己的經(jīng)驗(yàn)來(lái)看這兩種方式實(shí)現(xiàn)出的程序?qū)τ脩?hù)來(lái)說(shuō)區(qū)別不大,依然是自守護(hù)化,依然難以使用與管理。
考慮另一種方式。
將原本打算實(shí)現(xiàn)守護(hù)化功能的程序當(dāng)作一個(gè)“普通程序”來(lái)實(shí)現(xiàn):保持在前臺(tái)、使用stdout,stderr、Ctrl-C退出等等。這樣不但利于實(shí)現(xiàn)也利于調(diào)試。它們專(zhuān)心實(shí)現(xiàn)自己打算提供的獨(dú)特的功能。
而守護(hù)化獲得的好處、日志記錄、崩潰重啟、端口管理等等都可以作為另一個(gè)(或一組)獨(dú)立的程序來(lái)實(shí)現(xiàn)。而它們專(zhuān)心實(shí)現(xiàn)這部分功能。
兩者一結(jié)合就可以用統(tǒng)一的方式管理許多服務(wù)程序的各個(gè)方面:?jiǎn)?dòng)腳本(不需要sysvinit,upstart,systemd混雜)、重啟策略、日志(目的地,rotate)、界面(CLI,GUI,Web)等等。
每個(gè)程序自己實(shí)現(xiàn)后一類(lèi)功能不僅僅難以做到極致,而且還會(huì)引發(fā)其他問(wèn)題。
upstart需要知道自守護(hù)化的程序到底fork了幾次。
daemontools與supervisord還需要一些hack來(lái)對(duì)付自守護(hù)化的程序。
這是何苦。。。
類(lèi)似地,書(shū)中還提到了inetd。
提供網(wǎng)絡(luò)服務(wù)并不一定需要使用socket有關(guān)的編程技術(shù)?梢跃帉(xiě)只使用標(biāo)準(zhǔn)輸入輸出、環(huán)境變量、命令行參數(shù)的程序 —— 容易編寫(xiě)調(diào)試 —— 并配合其他程的序來(lái)提供網(wǎng)絡(luò)服務(wù)。
inetd就是這樣一種“其他程序”。Ubuntu倉(cāng)庫(kù)里提供的5個(gè)ident服務(wù)有4個(gè)都依賴(lài)inetd,只有1個(gè)是獨(dú)立實(shí)現(xiàn)ident服務(wù)。
CGI服務(wù)器也是這樣一種“其他程序”。
總之,除了“實(shí)打?qū)嵱才鲇病钡木幋a方式之外可以考慮充實(shí)自己的“工具箱”,并針對(duì)具體問(wèn)題選擇合適的方式去實(shí)現(xiàn),而不是學(xué)會(huì)了錘子就將所有問(wèn)題當(dāng)作釘子。
在程序里使用直接使用daemon,socket等等是一種直接的、硬的編程方式。
而daemontools,ident,CGI背后隱含的編程思想是另一種間接的、軟的編程方式。它有助于產(chǎn)生更簡(jiǎn)單、容易編寫(xiě)與維護(hù)也更穩(wěn)定可靠的程序。
抵制住“因?yàn)榱私饽撤N工具就想在程序里使用”的誘惑 —— 包括后一種軟的思想也是一種誘惑 —— 并針對(duì)具體問(wèn)題進(jìn)行分析選擇。
以CGI為例。如果目的是為了提供動(dòng)態(tài)網(wǎng)頁(yè),當(dāng)訪(fǎng)問(wèn)數(shù)量上升后就會(huì)吃不消。這種情況下是不能選它的。而如果只是想避免使用ssh,讓一些管理用的腳本可以在瀏覽器里點(diǎn)擊就可以執(zhí)行,我覺(jué)得它就挺適合的。 |
|