如(rú)果一(yī)個(gè)程序員(yuán)從(có☆✘↑ng)來(lái)沒有(yǒu)在Linux、Unix'✔≠下(xià)開(kāi)發過程序,一(yī)直在Windoε$$ws下(xià)面開(kāi)發程序,同樣是(shì)工×φ₹(gōng)作(zuò)10年(nián¥↕),大(dà)部分(fēn)情況下(xià)與在Linux、&×∞♦unix下(xià)面開(kāi)發10年(niσ✘ án)的(de)程序員(yuán)水(shuǐ)平會(huì)↔≈差别很(hěn)大(dà)。這(zhè)篇文(wén)章(zhāng)并π∏♣不(bù)是(shì)想貶低(dī)Windows下(↔★xià)面開(kāi)發的(de)人(rén),做(zu&®βò)Windows開(kāi)發的(de)人(rén) £Ω☆看(kàn)了(le)可(kě)能(nén☆≈₹g)會(huì)感覺不(bù)舒服,我并不(± bù)是(shì)這(zhè)個(gè)意思,我€∑ 隻是(shì)說(shuō)說(shuō)我自(zì)己的(de)感γ♥¶↓受。
我最早開(kāi)始學習(xí)編程也(yě)是(shì)在≥©Windows下(xià)面的(de),學的(de)是(sh₩✘ì)VB,後來(lái)轉到(dào)VC++,當時(shí)用(yònγ¥✔g)的(de)是(shì)VC6.0,做(¶✘↓zuò)Windows下(xià)面的(de)開(kāi) Ω↔≥發5年(nián)後轉入Linux下(xià)面做(zuò¶÷₹)開(kāi)發的(de),開(kāi)始在Linux下(xià)γ★面做(zuò)開(kāi)發的(de)時(shí)候,也(yě)做(z•←₩☆uò)過很(hěn)多(duō)Windows下(xià)面的(de)項目$λδφ,在Linux下(xià)面做(zuò)開(kāi)發确實比我在Windo↕§σws下(xià)面做(zuò)開(kāi)發多(duō)學到(dào)了(leΩ♣↓≤)很(hěn)多(duō)的(de)東(✘§☆dōng)西(xī),從(cóng)開(kāi)源代碼裡(l$&ǐ)面吸取了(le)豐富的(de)營養,我不(bù)是(©₩shì)說(shuō)我是(shì)個(gè)高(gāo)手,γ∏φ隻是(shì)說(shuō)在Linux下(xià)面學習(xí),你(n☆↕ǐ)會(huì)進步得(de)更快(kuài)。
不(bù)過我需要(yào)強調一(yī)下(xià),我這(zhè)裡(lǐ)說(shuō)的(de)是(₽✔shì)“大(dà)部分(f€↓∏λēn)情況下(xià)”,意★π↓±思就(jiù)是(shì)說(shuō)“在同樣勤奮,同樣努ε∏γ力程度,同樣基礎知(zhī)識,同樣工(gōng)<'作(zuò)年(nián)限,同樣是(shì)做(zuò)應用€♦§(yòng)程序的(de)開(kāi)發”的(de)情♠β>況下(xià),如(rú)果說(shuō)的εδ(de)不(bù)對(duì),希望大(dà)家(jiā)在下(xià)面發表αΩ☆'看(kàn)法。
可(kě)能(néng)大(dà)家(jiā)會(huì)奇怪,為(wèi♦★)何會(huì)出現(xiàn)這(zhè)種情況呢(ne)?↑<聽(tīng)我慢(màn)慢(màn)道(dào)來(láiδδ)!
第一(yī):閉源與開(kāi)源
Windows下(xià)面的(de)程序基本都(dōu)是(shì)封閉✔源代碼的(de),特别是(shì)10年(nián)前,在Windows下(↕"≈xià)可(kě)以說(shuō)找不(bù)到(dào)可(kě)用('∞₽yòng)的(de)開(kāi)源的(de™®÷σ)軟件(jiàn),現(xiàn)在的(de)>→©<情況比以前好(hǎo)多(duō)了(le),很(hěn)多(≤&αduō)Linux下(xià)面開(kāi)源的(de)程序被移植到σλ↑ (dào)Windows下(xià)面來(lái),但(dà•®n)是(shì)Linux下(xià)面開(kāi)源的(∏>de)程序增加的(de)更多(duō)了(le)。
以前在Windows下(xià)面寫應用(yòε↑♠πng)程序,需要(yào)用(yòng)到(dào)MFC,WINSOCK,O σDBC,FILE IO等,可(kě)以找資料的(de)↕♥地(dì)方主要(yào)是(shì)微(wēi)軟官方的(de)文(∑ wén)檔MSDN,也(yě)隻有(yǒu)MSDN才是(shì)最÷λ→全的(de)地(dì)方,下(xià)來α↓(lái)是(shì)第三方網站(zhàn) vckbase,CS∏∞∞DN,codeproject 這(zhè)幾個(gè)δ₹ε網站(zhàn)。但(dàn)是(shì)從(cóng)這(zhè)些(xi©≈£♣ē)網站(zhàn)找到(dào)的(de)代碼,都(dōu)是(>±≤shì)針對(duì)一(yī)個(gè)特定的(d¥δ∞e)小(xiǎo)功能(néng),為(wèi)了(le)&☆≤演示如(rú)何實現(xiàn)這(zhèσ↔)個(gè)小(xiǎo)功能(néng)而寫的(de)代碼,寫代碼的( ₽≤de)水(shuǐ)平參差不(bù)齊,風(fēng)格各異,都(→™dōu)是(shì)一(yī)些(xiē)☆ demo性質的(de)小(xiǎo)東(dō§® ng)西(xī),簡單研究看(kàn)看(kàn)代碼,就(jiù)可♣ε£φ(kě)以集成到(dào)自(zì)己的(de)應用(y&✔∞òng)程序裡(lǐ)面。
如(rú)何構建一(yī)個(gè)完整的(de)應用(yòng)程序,架¶構良好(hǎo)的(de)應用(yòng)程序,大(dà)學裡(lǐ)面不π'™±(bù)會(huì)教你(nǐ),一(yī)切都(dō©→u)得(de)靠自(zì)己摸索。在公司裡(lǐ)♠ 面做(zuò)項目獲得(de)提升,直到(dào)項目商用(yòn'>☆g),後期維護修改代碼時(shí),回頭看(kàn)"↔自(zì)己寫的(de)代碼,才深刻體(tǐ)會(huì)到(dà ∞∞o),自(zì)己當時(shí)寫的(de)代碼架構是(sh♥®Ωì)多(duō)麽的(de)不(bù)合理(lǐ),維護修$™↓改是(shì)如(rú)此的(de)困難。
如(rú)果在互聯網上(shàng)找不(bù)到(dào)自( §zì)己需要(yào)的(de)資料,就(jiù)隻能(néng→✔)靠自(zì)己想一(yī)些(xiē)實現(xiàn)的(de)方φ£法,雖然功能(néng)完成了(le),可(kě)能(néng)完成的(σ™∞₽de)時(shí)候還(hái)很(hěn)有(yǒu)成就σ←(jiù)感,但(dàn)是(shì)等那(nà)天你(nǐ)★突然發現(xiàn)有(yǒu)人(rén€ ♣₩)實現(xiàn)這(zhè)個(gè)功能(néng),并σλ×®且用(yòng)了(le)一(yī)個(→↔λgè)巧妙的(de)方法,這(zhè)時(sh←>í)你(nǐ)才突然恍悟,我當時(shí)為(wèi)何就(jiùδα)想不(bù)到(dào)這(zhè)麽實現δ>(xiàn)呢(ne)?
在Windows下(xià)面開(kāi)發,不(bù)太容易找到(dào&✔∞≤)可(kě)以參考的(de)類似你(nǐ)要(yào)Ω®♦完成功能(néng)的(de)開(kāi×£♦∞)源項目。一(yī)切都(dōu)得(de)₽↑↕↑靠自(zì)己。但(dàn)是(shì)®≠在Linux下(xià)面就(jiù)不(bù)一♦(yī)樣了(le),當你(nǐ)要(yào)開(kāi)發一(yī)± 個(gè)新項目時(shí),可(kě)以想想有(yδ™ǒu)沒有(yǒu)什(shén)麽開(kāi)源項目也(yě)完成了(δ¶le)類似的(de)功能(néng),可≥€(kě)以下(xià)載到(dào)源代碼來(← ₹lái)做(zuò)一(yī)個(gè)參考,♥π對(duì)其中的(de)算(suàn)法、架構設計(j®•ì)等做(zuò)一(yī)個(gè)詳細的(de)了(le) ☆解,然後自(zì)己開(kāi)發的(de)時(>÷shí)候就(jiù)會(huì)比較得(de)心應手了(le),可(k≤→ě)以避免别人(rén)犯過的(de)錯(cuò)誤,少(≠♦±∏shǎo)走很(hěn)多(duō)彎路(lù®←₹≥)。
第二:要(yào)學習(xí)的(de)知∞♠(zhī)識量不(bù)一(yī)樣
學習(xí)window下(xià)的(de)開(kāi)發,你(•<σβnǐ)需要(yào)學習(xí)很(hěn)多(d↕uō)的(de)Windows API。截止到(dào)2009β↑✔年(nián)9月(yuè),Windows總A♦£ΩPI數(shù)量為(wèi)2258個(gè),并且Windows A'♥PI 的(de)參數(shù)多(duō),參數(shù)類型複雜(' ®εzá),要(yào)記住這(zhè)麽多(duō)東(dōng)西(xī)不¥ ☆∞(bù)是(shì)一(yī)件(jiàn)容易的(de)事(shì¶β)情,至少(shǎo)也(yě)和(hé)₽γπ學習(xí)一(yī)門(mén)外(wài)語一(yī)樣,大(dà)•φ學英語四級要(yào)求掌握的(de)總詞彙量達到(dào)450∑σ±0個(gè)單詞。可(kě)想而知(zhī),學會(huì) §↓這(zhè)麽多(duō)的(de)API≤λ& 用(yòng)法,有(yǒu)多(duō)難了(le)吧(€≈§σba)。
那(nà)麽學習(xí)Linux下(xià)的(de)開(kāi)↔ ♠發,要(yào)掌握多(duō)少(shǎo)API呢(ne)?Linux&©¥下(xià)的(de)內(nèi)核API,全部算π₽↔(suàn)下(xià)來(lái)也(yě)才335,但(<'dàn)是(shì)這(zhè)些(xiē)內®↑(nèi)核的(de)API隻有(yǒu)編寫驅動的(de)時(sh€≈Ωí)候才能(néng)用(yòng)到(dào),開γ★(kāi)發應用(yòng)程序基本用(yòng)不(bù)到(d ♥¥ào)內(nèi)核的(de)API,開(kāi)發應用(yòng)程β±序的(de)API基本都(dōu)是(shì)C的(deβ↔↔)API,而Linux所有(yǒu)的(de)C的(de)API個(gè)數(λ∏₹↔shù)是(shì)279個(gè),也(yě)就(ji≤£ù)是(shì)說(shuō)你(nǐ)隻需要(yào)掌握§♠∑不(bù)到(dào)300個(gè)的(de)API,就(ji®×ù)可(kě)以順利地(dì)在Linux下(xià)面開πδ(kāi)發應用(yòng)程序了(le),↕•♦相(xiàng)比學習(xí)Windows下(xià)面的(de)那( ₹nà)一(yī)堆API來(lái)說(shuō),你(nǐ)€✘<≤是(shì)不(bù)是(shì)可(kě)以♥γ×省下(xià)很(hěn)多(duō)時(shí)間(jiān)來(lái)Ωφ¥÷學習(xí)其他(tā)知(zhī)識呢(ne)?
下(xià)面我就(jiù)舉個(gè)簡單的(¶>$de)例子(zǐ):
CreateFile ReadFile OpenFiΩ≥≥✔le WriteFile DeleteFil∞&↓>e ReadFileEx WriteFileEx Cl☆oseHandle
上(shàng)面這(zhè)些(xiē¶∏σ¥)API是(shì)Windows下(xià)面對(duì)文(®£♥wén)件(jiàn)操作(zuò)的(de)API,總共是(shì)8個(g★&←è),看(kàn)看(kàn)CreateFile的(de)參數(s€☆×Ωhù)吧(ba),
HANDLE WINAPI CreateFile•©÷( __in LPCTSTR lpFileName, __in&n€&≠bsp;DWORD dwDesiredAcc♠≈✘¶ess, __in DWORD dwShareMode, _♦∏←δ_in LPSECURITY_£•♠ ATTRIBUTES lpSecurityAttrib≥•utes, __in DWORD dwCre¶€↑ationDisposition, __in ↕"DWORD dwFlagsAndAttributes, __in ≈&σ;HANDLE hTemplateFile );
這(zhè)些(xiē)參數(shù)的(de)意≤♦義和(hé)類型,請(qǐng)問(wèn)你(nǐ)需要(yà±o)花(huā)多(duō)少(shǎo)時(shíγ♦)間(jiān)來(lái)掌握呢(ne)φ♠♠£?
我們再看(kàn)看(kàn)Linux下(xià)面對(du™¥♣✘ì)文(wén)件(jiàn)操作(zuò)的(de)C的(≈££de)API有(yǒu)幾個(gè),
fopen fwrite fread fc&•lose
共四個(gè),我們再看(kàn)看(kàn)參數(shù)吧(ba♣∞),
FILE *fopen( const ch"∏ar *filename, const&nφ≠÷bsp;char *mode );
兩個(gè)參數(shù),請(qǐng)問(δαwèn)你(nǐ)需要(yào)花(huā)多(duō)少(s"γ₹✘hǎo)時(shí)間(jiān)掌握呢(ne)?可(kě)能(néng)有γ♠δ↔(yǒu)的(de)人(rén)會(huì)提出意≈★∏見(jiàn),說(shuō)上(shàng)面C的(de)AP±π☆I也(yě)能(néng)在Windows下(xià)面運行(xín≤↑α↓g)啊。
沒錯(cuò),是(shì)能(néng)在&§★Windows下(xià)面運行(xíng),但(dàn)是(shì)你¶↓(nǐ)就(jiù)掌握這(zhè)跨平台的(d↓πe)C的(de)API夠嗎(ma)?難道(dào)所有(yǒu)在WindowΩ♥≤s下(xià)面開(kāi)發的(de)人(rén)都™÷(dōu)喜歡用(yòng)C的(de)API,不(bù)會(huì)¥♦Ω 用(yòng)Windows本身(shēn)的(←®de)API嗎(ma)?你(nǐ)不(bù)需要(yào)學習( ≠ ♦xí)Windows下(xià)面的(de)API嗎(ma)?你(nǐδ↑)的(de)同事(shì)使用(yòng)了(l★λe)CreateFile這(zhè)個(gè)函數(shù),你(nǐ)不(β™εbù)需要(yào)搞懂(dǒng)它嗎γ£×(ma)?你(nǐ)不(bù)需要(yào)看(kàn)同事(×★±♦shì)的(de)代碼嗎(ma)?你(nǐ)不(bù)需要(yào) €去(qù)維護别人(rén)寫過的(de)代碼嗎(ma≤→ ₹)?
如(rú)果你(nǐ)還(hái)是(shì)這(± ☆zhè)麽想,那(nà)我還(hái)可(kě)以再舉其他®φπ(tā)例子(zǐ)!就(jiù)拿(ná)創建線程的(de)例≤®子(zǐ)吧(ba),下(xià)面是(shì)2個(gè)在Wind☆✔Ωows下(xià)面創建線程的(de)例子(zǐλγ),第一(yī)個(gè)是(shì)創建安全工(gōng)作(zu←₩♣ò)線程,第二個(gè)是(shì)創建界面線程,還(hái)有©↑(yǒu)一(yī)個(gè)函數(shù)我沒有(yǒu)放(©Ω™→fàng)下(xià)面,是(shì)創建不(bù)安全的(★✔Ωde)工(gōng)作(zuò)線程的(de),具體(tǐ)的(de♣π)原理(lǐ)大(dà)家(jiā)可(↕€kě)以參考《win32多(duō)線程程序設計(jì)》,作(zuò)者:≠Ωβ↓(美(měi))Jim Beveridge &∞≈; Robert Wiener 著,侯捷 譯 這(zhè)本書(shū)。
//線程安全的(de)工(gōng)作(zuò)線程函數(shù<✘$)
uintptr_t _beginthrea¥☆dex(
void *security, &λ™♠nbsp; unsigned stacε®<k_size, unsigned (&₽♥ *start_address )( ¥₹•void * ),  ¥♣ ; void *arg£♥™$list, unsigned&nφ∏"bsp;initflag, uns→♦ ♠igned *thrdaddr );
//界面線程函數(shù)
HANDLE WINAPI Create✘✘€Thread( __in&nb♠♥sp; &nbs∞ φ✔p;LPSECURITY_ATTRIBUTES lpThreadAttr©π♦αibutes, __in &n¶σbsp; SIZE_T±γ₹♣ dwStackSize, γ♣σ __in φ© LPTHREAD_START_ROUTIπΩ<NE lpStartAddress, __in "σ™; ★↓₩β LPVOID l×∏ pParameter, __in &n★φ≤✔bsp; &σ"♥nbsp; DWORD dwCreationFlags, &nφ bsp; __out &nb™&₹★sp; LPDWO♠σφRD lpThreadId );
做(zuò)Windows下(xià)面的(de)開(kāi)發,上(s₩≈¶hàng)面兩個(gè)創建線程的(de)函數(shù)我們都(dōu)必須♠ 掌握。當然了(le), 你(nǐ)也(yě)可(k< ×"ě)以隻需要(yào)知(zhī)道(dào)∏σ¶₽ _beginthreadex 來(lái)在Wi± ndows下(xià)面通(tōng)吃(chī),♣♥&但(dàn)是(shì)當看(kàn)到(dào)别人(rén)的←>♦(de)代碼使用(yòng)CreateThread的(₩§★de)時(shí)候,你(nǐ)可(kě)不(b←φ ù)要(yào)不(bù)習(xí)慣,MFC裡(lǐ↓εε)面很(hěn)多(duō)人(rén)都(dōu)用(yòng)Cre≠ateThread。掌握這(zhè)麽多(d€♣uō)的(de)API累吧(ba)?就(jiù)和(hé)你(nǐ)上(s"♥ hàng)學的(de)時(shí)候背單詞一(yī)樣累。
下(xià)面我再列一(yī)下(xià)Linux下(÷↑xià)面創建線程的(de)函數(shù),
int pthread_create(&nbs♣>↕÷p;pthread_t *restrict th↓φ read, const p©€☆thread_attr_t *restrict attr→®, void *(*start¶₹₩_routine)(void*), ♠ו§void *restrict argφ∑);
看(kàn)到(dào)了(le)吧(ba),你(nǐ)隻需要(yào)知α₽ ←(zhī)道(dào)這(zhè)個(gè)就(jiù)可(kě)以了(l< ¶'e)。
C的(de)API絕大(dà)部分(fēn)都(dōu)可(≈§÷πkě)以在Windows下(xià)面運行(xíng),在Wind ows下(xià)面學習(xí)開(kāi)發, 你(nǐ)不(bù)但(d↓>àn)要(yào)懂(dǒng)得(de∑≥<✔)C的(de)API,你(nǐ)還(hái)需要(yào)多(★↕duō)花(huā)時(shí)間(jiā←₹♦n)來(lái)學習(xí)Windows系統本身(shēn)的(de¶§→ )API, 你(nǐ)可(kě)能(néng)要(yào)說(shu®≈₩←ō),這(zhè)麽說(shuō)應該是(shì)Windows≈<♠下(xià)面學得(de)多(duō)啊,我要(yào)說(shuō)的'↓→"(de)是(shì)你(nǐ)掌握的(de)API是(s"πhì)很(hěn)多(duō),但(dàn≤"★)是(shì)對(duì)于一(yī)個(gè)軟'<≈件(jiàn)來(lái)說(shuō),最最重要(yà ✔±≤o)的(de)是(shì)系統架構、數(shù)據結構,架→≈•"構設計(jì)得(de)好(hǎo),對(duì)後期的(de)代碼維護、功φ€能(néng)修改都(dōu)很(hěn)關鍵δ↔€§,這(zhè)也(yě)就(jiù)是(shì)新手寫的(de)代碼到(dà≈♦¥o)最後連他(tā)自(zì)己本人(rén)都(dōu)很(hě★±♦n)難維護的(de)原因,更别說(shuō)讓别人(ré♣✔εn)來(lái)維護了(le)。
API相(xiàng)當于基本功,系統架構、數(shù)據結構是(shì)內↕∑→(nèi)功,基本功練得(de)越快(k< ←♠uài),我們就(jiù)越有(yǒu)更多(duōφ)的(de)時(shí)間(jiān)來(l ☆ái)練習(xí)內(nèi)功。練習(xí)內(nèi)功,我們要(yào)多(duō)向高(gāo)手學習(xí)。
在學習(xí)Windows下(xià)面®✔±開(kāi)發應用(yòng)的(de)道(dào)路(lù)π§↓上(shàng),我們需要(yào)掌握更多(duō)的(de←π)API,學習(xí)後, 讓我們的(de)路(lù)越走越窄,沒有(yǒu)©₽特别豐富的(de)開(kāi)源代碼可(kě)以參考,水(shα←uǐ)平提高(gāo)的(de)速度很(hěn)慢∏≤(màn)。
可(kě)喜的(de)是(shì),現(xiàn)在很(hěn)多(du₽♥ō)開(kāi)源的(de)項目被很(hěn)多(duō)人(rén)移植 ☆¥•到(dào)了(le)Windows下(xià)面,也♦≠α(yě)有(yǒu)很(hěn)多(duō)的(de)開(♦↓kāi)源項目是(shì)跨平台的(de),&¶φ常用(yòng)的(de)是(shì)w£✔φxWidget界面庫,用(yòng)法類似MFC,還(hái)<α♦有(yǒu)qt這(zhè)個(gè)界面庫,也(yě)很(hěn)強大(←±dà),還(hái)有(yǒu)開(kāi)源的(de)3D引擎O>ε★GRE,架構非常好(hǎo),很(hěn• )值得(de)學習(xí)其架構模式。但(dàn)是(shì)Linux下( ←✔§xià)面的(de)開(kāi)源庫要(yào)遠(yu©∑☆ǎn)遠(yuǎn)比Windows下(xià)面的(de)開©ε€(kāi)源庫豐富得(de)多(duō),我們可(kα≠σě)以方便地(dì)從(cóng)高(gāo)手∑♦≥的(de)代碼裡(lǐ)面學習(xí)數(shù)據結構,學σ習(xí)設計(jì)模式,學習(xí)編程技(jì)巧,這(zhè)也(§♣&yě)就(jiù)是(shì)Linux下(xià)面¶∑的(de)程序員(yuán),可(kě)能(néng)會(huì)比Wiε↓ndows下(xià)面的(de)程序員(yuán)水(shuǐ)' 平更高(gāo)的(de)原因,畢竟見(jiàn)多(duō)識廣嘛,熟讀(d∏↕ú)唐詩三百首,不(bù)會(huì)作(zuò)詩也(yěγ'∏)會(huì)吟啊!
本文(wén)轉載自(zì):https→★∏φ://blog.csdn.net/langeldep/article/Ω×details/7069874