如(rú)果一(yī)個(gè)程序員(yuán)從(cóng)來(lái)φ¥↔沒有(yǒu)在Linux、Unix下(">÷xià)開(kāi)發過程序,一(yī)直在Wind ®✔←ows下(xià)面開(kāi)發程序,同樣是(shì)工(gōng)作(z§£φuò)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éng)會(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òng)的(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ě)做(zuò)過很(hěn)多( ÷duō)Windows下(xià)面的(d€≥∞e)項目,在Linux下(xià)面做(zuò)開(kāi)發确實比我在Wi→♥ndows下(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à)&rd" quo;,意思就(jiù)是(shì)說(shuō)&ldq∞♠∞uo;在同樣勤奮,同樣努力程度,同樣基礎知(z÷λ€hī)識,同樣工(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,ODBC,FILE IOΩ≤♠δ等,可(kě)以找資料的(de)地(dì)方主要(yào)是(shì)微(wē✘ ₹↔i)軟官方的(de)文(wén)檔MSDN,也(yě)隻有(yǒu)M♥σSDN才是(shì)最全的(de)地(d✘≠&©ì)方,下(xià)來(lái)是(shì)第三方網站(zhàn)♠ε> vckbase,CSDN,codeproject 這(z§ 'hè)幾個(gè)網站(zhàn)。但(dàn)是(s×γ©hì)從(cóng)這(zhè)些(xiē)網站(zhàn)找到(dào)的₽←•(de)代碼,都(dōu)是(shì)針φ↑®對(duì)一(yī)個(gè)特定的(de)小(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òng),後期維護修改代碼時(shí),回頭看γλ≠♠(kàn)自(zì)己寫的(de)代碼,才深刻體(tǐ)會(huì↕©)到(dào),自(zì)己當時(shí)寫的(de)代碼架構是(sδδφ≠hì)多(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ì)在Li↓£♥nux下(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)時(s←♦φ₹hí)候就(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)多(duō"≤)的(de)Windows AP γI。截止到(dào)2009年(nián)9月(yuè),Windows總AP↕₩βI數(shù)量為(wèi)2258個(gè),并且Windows '<→βAPI 的(de)參數(shù)多(duō),參數(shù)類型複雜(záσεφ™),要(yào)記住這(zhè)麽多(duō)東(dōng)西∏(xī)不(bù)是(shì)一(yī)件(j↕÷ε↑iàn)容易的(de)事(shì)情,至少(shǎo)也(yě)和(↕♣δ₹hé)學習(xí)一(yī)門(mén)外 ÷(wài)語一(yī)樣,大(dà)學英語四級要(y≤≈ào)求掌握的(de)總詞彙量達到(dào)4500個(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ō)少(sβ∞£σhǎ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)A→PI個(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 Opσ₩≈enFile WriteFile DeleteF×↔ile ReadFileEx WriteFileEx CloseHandle₽β↑λ
上(shàng)面這(zhè)些(xiē) αAPI是(shì)Windows下(xià)面對(duì)文(w$$✘φén)件(jiàn)操作(zuò)的(de)™↔↑API,總共是(shì)8個(gè),看(kàn)看(kàn)Crea<∏teFile的(de)參數(shù)吧(ba),
HANDLE WINAPI CreateFile( __in&™€↓nbsp;LPCTSTR lpFileName, __in&nbs ™γp;DWORD dwDesiredAcce€₽ss, __in DWORD dwShareMode, _ ≈_in LPSECURITY_ATTRIBUTE'←£S lpSecurityAttribut≥ §↓es, __in DWORD dwCreation £∑Disposition, __in DWORD dwFlag™£♥sAndAttributes, __in&nbs™ε©>p;HANDLE hTemplateFile );
這(zhè)些(xiē)參數(shù)的(de)意←♥≤®義和(hé)類型,請(qǐng)問(wè♥©n)你(nǐ)需要(yào)花(huā)多(duō)少(s÷₩hǎ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 fclose
共四個(gè),我們再看(kàn)看(kàn)參數(shù)吧(ba),<✔Ω
FILE *fopen( const&nbs§♦¶p;char *filename, const&→λnbsp;char *mode );
兩個(gè)參數(shù),請(qǐng÷™&)問(wèn)你(nǐ)需要(yào)花(₹≠huā)多(duō)少(shǎo)時(shí)"&ε間(jiān)掌握呢(ne)?可(kě)能(néng)有φβ&(yǒu)的(de)人(rén)會(huì)提出意見(jiàn),說(shuō≈₹₹↕)上(shàng)面C的(de)API也(yě)能↔β£×(néng)在Windows下(xià)面運行(xíng)啊© ©。
沒錯(cuò),是(shì)能(néng)在Windoδ÷ ws下(xià)面運行(xíng),但(dà♦₩n)是(shì)你(nǐ)就(jiù)掌握這(zhλ'∞è)跨平台的(de)C的(de)API夠嗎(¥✘ma)?難道(dào)所有(yǒu)在Wiγ×ndows下(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)了(le)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è)在Windo≥₽ws下(xià)面創建線程的(de)例子(zǐ),第一(yī)個(gè)是(s↔≠₽↔hì)創建安全工(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 &÷λ←βamp; Robert Wiener 著,侯捷 譯 這(zhè)本書(shū)。
//線程安全的(de)工(gōng)作(zuò)線程函數(shù)±≥♣<
uintptr_t _begint>↓hreadex(
void *security, &ε≈&↕nbsp;unsigned stack_size, ←©' unsigned ( *start_ ≠≈address )( void ™≠;* ), void *aα←rglist, unsigned↔&"© initflag, &nb&®sp;unsigned *thrdaddr &<®αnbsp;);
//界面線程函數(shù)
HANDLE WINAPI CreateThread( __in✘£ &λδnbsp; LPSECURITY_ATTRσ¶IBUTES lpThreadAttribut§¶>es, __in &nb♠≈sp;  π÷∞λ;SIZE_T dwStackSize,§≈ __in π LPTHREAD_START✘¥_ROUTINE lpStartAddress, __i®φn &nbsΩ"p; LPVOID lpPara↓÷∑§meter, __in δ♦γ &n$✘bsp;DWORD dwCreationFlags☆÷, __out &nbsλ§↔p; LPDWORD lpThre α↑adId );
做(zuò)Windows下(xià)面的(de)開(kāi)發>±,上(shàng)面兩個(gè)創建線程的(de)↓↔函數(shù)我們都(dōu)必須掌握。當然了(le), 你(nǐ↕✘≤©)也(yě)可(kě)以隻需要(yào)知(zhī)道(dào) ∞ _beginthreadex 來(láiγ☆±)在Windows下(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)CreateThread。™"掌握這(zhè)麽多(duō)的(de)API累吧(ba)?就(j£γiù)和(hé)你(nǐ)上(shàng)學的(de)時(shí)候背單詞λφφ 一(yī)樣累。
下(xià)面我再列一(yī)下(xià)Linux下(x★δ≥ià)面創建線程的(de)函數(shù)♣α,
int pthread_create(  λσ£;pthread_t *restrict thread, con£✘st pthread_attr_t *restrict attr,☆βγ void *(*star♦₩&t_routine)(void*), void *re∏∑≤¶strict arg);
看(kàn)到(dào)了(le)吧(ba),©&你(nǐ)隻需要(yào)知(zhī)道(÷→&dào)這(zhè)個(gè)就(jiù)可(kě)以了(le)。
C的(de)API絕大(dà)部分(fēn)都(dōu)可(kě)以在Win<↕∑§dows下(xià)面運行(xíng),在Windows下(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π∑≤是(shì)很(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én₹§ g)修改都(dōu)很(hěn)關鍵,這( zhè)也(yě)就(jiù)是(shì)新手寫的(de)代碼到(dào)最後★✔連他(tā)自(zì)己本人(rén)都(dōu)很(hěn)難維護的(d♥♠σγe)原因,更别說(shuō)讓别人(rén)來(♣δσlái)維護了(le)。
API相(xiàng)當于基本功,系統架構、數(shù)£&據結構是(shì)內(nèi)功,基本功練得(de¥$)越快(kuà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ě)以參考,水(shuǐ)平'§♣提高(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ì)wxW≈€idget界面庫,用(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ì)Linu≈•βx下(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://blo₹εg.csdn.net/langeldep/arσ ♦ticle/details/7069874'