未來想從事Linux 後台開發,需要學習linux內核嗎?像讀內核源碼。還是學好linux網路編程,C,演算法。學習內核的意義有哪些呢?
先列出主要觀點,有時間再補充細節:
「學習Linux內核」對不同的人有不同的含義,學習方法、側重點、投入的精力也大不相同。我大致分三類:reader、writer、hacker。reader 就是了解某個功能在內核的大致實現 how does it work,一般不關心某些極端情況下(內存不足、受到攻擊)的處理方法,對於看不懂的地方也可以跳過。我自己最多算半個 reader,只看我感興趣的一小部分代碼(我只關心 TCP 收發數據,不管 IP routing/forwarding/fragment 等,更不會去關心 ethernet 層),而且讀一個函數一般只看主幹(happy path),不管 security/debugging/tracing,經常忽略錯誤處理分支。writer 是給內核加feature和改bug的人,需要更進一步的知識,寫代碼要考慮 how not to break it。hacker 是通過分析代碼找出安全漏洞並加以利用的人,研究 how to break it,讀代碼恐怕更注意找出error handling分支沒有覆蓋的case。
內核向用戶態提供的介面很穩定,但是內核的具體實現變化很快,你深入鑽研獲得的知識很容易就過時。比方說 Linux 的 TCP 實現在2015年3月新加了 TCP_NEW_SYN_RECV 這個非標準的 TCP state,同年6月發布的 kernel 4.1 才開始用它。如果你學的是一年前的 kernel,那麼建立TCP連接這方面的細節知識對於今年發布的 Ubuntu 16.04 可能已經過時了。
Linux內核的編碼風格不值得效仿。比如 tcp_v4_rcv 這個函數,有很多 goto:
tcp_ipv4.c [linux/net/ipv4/tcp_ipv4.c]Linux內核的一些做法在 C 語言中是合理的(比方說用包含函數指針的各種 xxx_ops struct 來手工實現虛函數表,通過控制 struct 內存布局來模擬繼承:tcp_sock 繼承 inet_connection_sock 繼承 inet_sock 繼承 sock 繼承 sock_common),在其他高級語言中往往有更簡便的實現方式,不必生搬硬套。遇到 xxx_ops-&>some_func(arg) 這種代碼,思路容易斷線,這個 xxx_ops 到底指向哪個具體實現?最好能把代碼跑起來,用調試器單步跟蹤,一下子就定位到了 callee。當然,讀 OO 代碼也會遇到這個困難,傳進來的這個 interface 在運行時到底是哪份實現?讀 Python 代碼就更難了,函數參數光有個名字,連 type 都沒有。
Linux內核比較注重代碼的通用性和復用性,要照顧那些雖然你用不到但少數人會用的需求。通用性方面,雖然現在大家都用乙太網,但是網路協議棧的代碼還在支持 FDDI、Token Ring(從 3.5 版起已刪除)、ATM 等,偶爾會擾亂視線,更在原本簡單直接的做法上增加間接層,加大了理解代碼的負擔。復用性方面,從 3.17 版開始,IPv4 和 IPv6 共享同一個 tcp_conn_request() 函數[tcp: add tcp_conn_request · torvalds/linux@1fb6f15 · GitHub]。原來的做法是各自有 tcp_v4_conn_request() 和 tcp_v6_conn_request(),新合併的 tcp_conn_request() 為了處理 v4/v6 的不同情況,用了一個 struct tcp_request_sock_ops* 參數,這代碼讀起來就比原來繞了。雖然我不關心 IPv6 的實現,但讀代碼的時候卻不能排除其干擾。
Linux內核廣泛採用的侵入式數據結構設計恐怕很難應用到一般程序開發中。基本上是個高維十字鏈表,一個節點(struct)可以同時位於多個hash/list/tree中。
如果你本身就要從事內核開發,那麼以上這些都不是問題。對於這用戶態寫server的人,學內核的目的是什麼,學到的知識能不能/要不要/如何用到日常開發中,這是值得思考的。
同樣的情況也出現在 Java 開發者身上,一般的 Java 程序員要不要讀 JVM 的實現?我記得 @RednaxelaFX 對此有過精彩的論述,我完全同意他的看法。特別是當你功力不夠時,強行去讀源碼,結果讀錯了地方(一個函數有多個實現,你讀的那個其實沒有被調用,甚至沒有被編譯),造成了錯誤的認識,回頭來還跟人爭論說JVM/kernel里是如何如何實現的,那還不如不讀。
逢人就推薦閱讀 Linux 內核源碼,就像向每個學數據結構的人推薦 TAOCP 一樣,是中文網路上特有的現象,我對此是不贊成的。(前幾年還有一問C++網路編程就推薦ACE庫的現象,現在少多了。)「以後想從事Linux 後台開發」
根據這個描述,題主應該是打算入linux系統開發這個坑說到linux或者unix開發,沒有用過這類系統以及沒接觸過底層系統開發的人都會錯誤地認為,系統開發就是開發系統,所以他們總是覺得,非要去看懂系統源碼才能幹系統開發。
實際上這也是這幾年我司招應屆生遇到的一個尷尬問題,就是好多人不敢投系統開發崗的原因是因為他們覺得自己沒讀過linux源碼,沒那個「資格」投系統開發。實際上系統開發這個崗的工作無外乎就是調用現有的linux操作系統外部編程介面(applicant programming interface, API)來實現一些「底層應用」,需要他們了解的無外乎就是socket介面,TCP/IP協議,以及一些基本的服務端編程經驗,例如你要是用linux的socket api for C寫過伺服器那就更好了。簡單介紹一下幾個與操作系統相關的開發層次:
1)硬體系統開發:這一層主要負責做一些諸如電路板設計,如VHDL,實現一個提供基本二進位映射的晶元器,或者將硬體指令燒制到CPU內部實現微指令集之類的工作,不屬於IT公司所說的底層開發。2)內核系統開發:這一層主要負責在給定的體系結構系統上實現一個操作系統,從無到有實現一個操作系統。所謂實現一個操作系統,無外乎就是實現操作系統的一些服務和功能,例如,提供文件讀寫啊,提供TCP/UDP的數據傳輸介面啊。這一層位於系統API之下,具體而言,就是試圖在硬體結構之上實現系統的編程介面的功能。什麼意思?大家應該都調用過read/write函數,但是有人想過這些函數是怎麼實現的嗎(就類似於大部分C語言學習者都用過printf但是很少有人去考慮實現一個printf吧),這就是內核開發乾的事兒,即實現那些你經常調用的系統函數。3)系統應用開發:這一層是大部分IT企業所說的系統開發乾的事兒,就是,調用我上面說的那些系統API去實現一些基本的應用功能,例如用linux提供的文件讀寫介面函數實現一個STL,例如用linux socket介面實現一個HTTP協議的伺服器(如nginx或apache之類的服務程序)。你可以發現,干這些活其實不需要真的去了解內核代碼,即不需要去了解這些程序所調用的API是怎麼實現的,你需要了解的無非是:我調用那些系統函數,這些系統函數是幹什麼的,接受什麼參數,按什麼順序調用;最後根據你需要實現的功能去編寫代碼。所以題主現在的問題是,他錯誤地把這個圖中「內核開發」那一塊的工作當成後台開發的全部,而實際情況是,後台系統開發的工作大部分都集中在第一層和第二層!對於linux開發,如何入門?
其實既然你打算入這個坑,那麼看看Linux源碼也沒壞處。但凡事都要循序漸進,我的建議是題主可以根據這樣一個姿勢入坑:- 首先,了解如何使用linux
換言之,你需要從了解這個系統「提供哪些功能/服務」開始,學習shell腳本,練習如何在命令行埠使用linux提供的各類操作,如文件刪除,創建,格式化,鏈接等等。這個過程是必不可少的,一個不了解linux提供什麼功能的人,去看代碼也看不懂它到底是打算實現個什麼玩意兒。
入門書推薦底下兩本:
1)鳥哥的linux私房菜(不想買書的可以去看他的博客 ==&>鳥哥的Linux私房菜簡體首頁)
2)Linux命令行和Shell腳本大全其中強烈推薦基礎較弱的可以用鳥哥那本來入坑,相對沒那麼複雜,原理介紹什麼的都還算淺顯易懂。2. 其次,學習使用linux系統庫函數
在你了解了linux操作系統提供哪些具體功能後,你肯定對它的某些功能非常感興趣,例如,你可能會問,這個許可權怎麼檢查,怎麼去實現一個cat/rm/rmdir之類的文件處理命令,怎麼去編程實現ping這類命令?那麼你就需要了解系統API,即了解linux都提供了你那些系統函數可供調用。學慣用書推薦兩本:- UNIX高級環境編程
- UNIX網路編程
第一本介紹UNIX系統的主要幾個編程介面,包括文件讀寫,網路介面讀寫等,讀完這本書中的API你會了解如何自己去實現那些shell腳本中的文件處理命令。
第二本重點介紹UNIX系統提供的套接字API(socket API)。這些套接API提供了用戶TCP和UDP傳輸層協議的編程介面,以及一些多線程的編程介面。
利用這些介面你可以實現一個你自己的「伺服器程序」,實際上,那些比較牛逼的apache或者nginx的伺服器程序就是通過調用linux的套接字介面,來實現了HTTP協議的伺服器程序。發現了嗎?Linux系統直接提供了TCP/UDP的傳輸層編程介面,而底層開發的時候,你不需要去了解TCP/UDP的具體實現機制,只需要關注如何設計應用層協議,如何編程實現應用層協議,如何優化TCP連接隊列等。這是目前我司招的學生主要乾的事情,至於優化linux的網路協議模塊,額,這基本上是一個低概率事件,實際情況是,如果可能,我們大多選擇優化應用層協議。
這也反映了一個問題,現在很多學校對HTTP協議只進行簡要介紹,但是對協議的具體實現提及甚為罕見。而在實際工作中,我們又很缺一些了解和實踐過HTTP等應用層協議的開發人員,這可能是個問題吧。
3. 學習應用層協議,閱讀開源伺服器源碼:在你足夠了解linux的底層socket API之後,你可以嘗試著去看一些開源伺服器,如nginx的源碼,了解一些應用層協議的具體機制,如HTTP。這方面資料你可以自己去百度
我看的是這兩本:
《HTTP權威指南(國內首本HTTP及其相關核心Web技術權威著作)》([美]David...)【簡介《Nginx高性能Web伺服器詳解》(苗澤...)【簡介4. 深入內♂部:由於你已經了解了系統介面,同時也學習了如何使用這些介面進行編程,那麼接下來再去了解linux系統的源碼就是遊刃有餘了。不過linux源碼那麼長,功能那麼多,你不是每個都需要去看的,根據需要選擇自己感興趣的部分進行閱讀,建議你可以先從了解linux的系統架構開始,接著選擇模塊進行代碼閱讀。- TCP/IP詳解:總共三卷,涉及到協議的實現機制(比那本國內的計算機網路要詳細的多),協議的實現,以及應用層協議的實現等,如果你打算入網路這個方向的坑,可以試著在讀完史蒂芬的《unix網路編程》兩卷之後去看看這三本神書,也是他寫的,雖然我沒讀過→_→
- 深入Linux內核架構:如果你想了解linux系統,那麼從架構入手是最吼滴,推薦下面兩本
《深入Linux內核架構 (德)莫爾勒 著》(德)莫爾勒 著
《Linux 內核完全剖析――基於0.12內核》(趙炯...)【簡介參考書目鏈接(購買需謹慎,沒到那步請先不要購入)- 第一階段:學習使用linux系統命令
[1] 《鳥哥的Linux私房菜 基礎學習篇(第三版)(Linux領域名人鳥哥帶你邁入Linux殿堂)》(鳥哥...)【簡介
[2] 《鳥哥的Linux私房菜:伺服器架設篇(第3版)(超級暢銷書第三次改版升級,適用於各種主流Linux版本!決戰大數據時代!IT技術人員不得不讀!)》(鳥哥...)【簡介[3] 《Linux命令行與Shell腳本編程大全(第2版)(輕鬆全面掌握命令行和shell 黑客進階必讀)》([美]Richard...)【簡介- 第二階段:學習linux系統函數
[4] 《UNIX環境高級編程(英文版 第3版)》([美]W...)【簡介
[5] 《UNIX網路編程(卷1套接字聯網API第3版)/圖靈計算機科》(美)史蒂文斯//芬納//魯道夫[6] 《UNIX網路編程 卷2 進程間通信 第2版 英文版》([美]W....)【簡介[7] 《Linux/UNIX系統編程手冊(上、下冊)》([德]Michael...)【簡介[8] 《UNIX編程環境》([美]Brian...)【簡介- 第三階段:使用linux API開發系統應用
[9] 《HTTP權威指南(國內首本HTTP及其相關核心Web技術權威著作)》([美]David...)【簡介
[10] 《Nginx高性能Web伺服器詳解》(苗澤...)【簡介[11] 《TCP/IP詳解 卷1:協議(英文版第2版) (TCP/IP領域不朽名著,Stevens傳世之作)》((美)Kevin...)【簡介- 第四階段:研讀linux內核源碼
其實沒啥好推薦的,等你到了這個階段問其他大神吧 TvT
PS:請務必記住,上面的書不是說你現在就馬上買進來!注意,必須是你到了這個學習的階段再買,否則買來浪費錢你還看不懂。- 推薦些源碼
學習使用linux API開發服務端程序的源碼你可以去看看nginx,這是目前實際應用比較多的,但是有個前提,就是你已經通過第二階段的學習,並進入第三階段再學。
nginx: download《Nginx高性能Web伺服器詳解》(苗澤...)【簡介- Linux系統開發學習路線圖總結
當然,無論你是往上走(系統應用開發),還是往下走(內核/開發操作系統),前兩個都是必經之路(當然有的大神早已對第一第二步是輕車熟路,還求輕噴- -)
至於題主說的,自己想做「linux後台開發」,那麼就是要往上走,因為目前國內比較需要的就是開發和維護伺服器程序,無外乎寫幾個腳本(第一階段),牛逼點的讓你開發個小的伺服器/日誌處理程序(第二階段),牛逼哄哄的就抓去優化現有的伺服器架構(往上走,第三階段),極少有需求會提及優化TCP/UDP程序介面的(往下走,第四階段)。
當然貌似有些公司就特別喜歡自己搞一套新的內核模塊裝逼,但我所在的部門很少去重構個內核啥的,我所了解的服務端底層開發還沒見有多少涉及到重寫內核的。
當然,如果你除了第一到第三階段的技能點都點滿外,還讀過linux內核代碼,那麼是加分項,面試官也不會因為你學了個不怎麼用的技術就去鄙視你,畢竟我周圍不少同事也沒讀過linux內核,他們大都處於第二步的初期學習階段
或者第一階段TwT
--------------------------------------------------------------還有題主說C語言,演算法什麼的,那是基礎好嗎,你數據結構都沒學好的話,估計也是通不過筆試的吧→v→linux後台開發具備能力集錦原文鏈接:http://blog.csdn.net/majianfei1023/article/details/45337085
Linux後台開發應該具備技能
一、linux和os:
1、命令:netstat tcpdump ipcs ipcrm 這四個命令的熟練掌握程度基本上能體現實際開發和調試程序的經驗
2、cpu 內存 硬碟 等等與系統性能調試相關的命令必須熟練掌握,設置修改許可權 tcp網路狀態查看 各進程狀態 抓包相關等相關命令 必須熟練掌握
3、awk sed需掌握
4、共享內存的使用實現原理、然後共享內存段被映射進進程空間之後,存在於進程空間的什麼位置?共享內存段最大限制是多少?
5、c++進程內存空間分布(注意各部分的內存地址誰高誰低,注意棧從高道低分配,堆從低到高分配)
6、ELF是什麼?其大小與程序中全局變數的是否初始化有什麼關係(注意.bss段)
7、使用過哪些進程間通訊機制,並詳細說明
8、makefile編寫,雖然比較基礎,但是會被問到
9、gdb調試相關的經驗,會被問到
10、如何定位內存泄露?
11、動態鏈接和靜態鏈接的區別
12、32位系統一個進程最多多少堆內存
13、多線程和多進程的區別(重點 必須從cpu調度,上下文切換,數據共享,多核cup利用率,資源佔用,等等各方面回答,然後有一個問題必須會被問到:哪些東西是一個線程私有的?答案中必須包含寄存器,否則悲催)
14、寫一個c程序辨別系統是64位 or 32位
15、寫一個c程序辨別系統是大端or小端位元組序
16、信號:列出常見的信號,信號怎麼處理?
17、i++是否原子操作?並解釋為什麼???????
18、說出你所知道的各類linux系統的各類同步機制(重點),什麼是死鎖?如何避免死鎖(每個技術面試官必問)
19、列舉說明linux系統的各類非同步機制
20、exit() _exit()的區別?
21、如何實現守護進程?
22、linux的內存管理機制是什麼?
23、linux的任務調度機制是什麼?
24、標準庫函數和系統調用的區別?
25、補充一個坑爹坑爹坑爹坑爹的問題:系統如何將一個信號通知到進程?
二、c語言:
1、宏定義和展開(必須精通)
2、位操作(必須精通)
3、指針操作和計算(必須精通)
4、內存分配(必須精通)
5、各類庫函數必須非常熟練的實現
6、哪些庫函數屬於高危函數,為什麼?(strcpy等等)
三、c++:
1、一個String類的完整實現必須很快速寫出來(注意:賦值構造,operator=是關鍵)
2、虛函數的作用和實現原理(必問必考,實現原理必須很熟)
3、sizeof一個類求大小(注意成員變數,函數,虛函數,繼承等等對大小的影響)
4、指針和引用的區別(一般都會問到)
5、多重類構造和析構的順序
6、stl各容器的實現原理(必考)
7、extern c 是幹啥的,(必須將編譯器的函數名修飾的機制解答的很透徹)
8、volatile是幹啥用的,(必須將cpu的寄存器緩存機制回答的很透徹)
9、static const等等的用法,(能說出越多越好)
四、數據結構或者演算法:
1、《離散數學》範圍內的一切問題皆由可能被深入問到(這個最坑爹,最重要,最體現功底,最能加分,特別是各類樹結構的實現和應用)
2、各類排序:大根堆的實現,快排(如何避免最糟糕的狀態?),bitmap的運用等等
3、hash, 任何一個技術面試官必問(例如為什麼一般hashtable的桶數會取一個素數?如何有效避免hash結果值的碰撞)
五、網路編程:
1、tcp與udp的區別(必問)
2、udp調用connect有什麼作用?
3、tcp連接中時序圖,狀態圖,必須非常非常熟練
4、socket服務端的實現,select和epoll的區別(必問)
5、epoll哪些觸發模式,有啥區別?(必須非常詳盡的解釋水平觸發和邊緣觸發的區別,以及邊緣觸發在編程中要做哪些更多的確認)
6、大規模連接上來,並發模型怎麼設計
7、tcp結束連接怎麼握手,time_wait狀態是什麼,為什麼會有time_wait狀態?哪一方會有time_wait狀態,如何避免time_wait狀態佔用資源(必須回答的詳細)
8、tcp頭多少位元組?哪些欄位?(必問)
9、什麼是滑動窗口(必問)
10、connect會阻塞,怎麼解決?(必考必問,提示:設置非阻塞,返回之後用select檢測狀態)
11、如果select返回可讀,結果只讀到0位元組,什麼情況?
12、keepalive 是什麼東東?如何使用?
13、列舉你所知道的tcp選項,並說明其作用。
14、socket什麼情況下可讀?
六、db:
1、mysql,會考sql語言,伺服器資料庫大規模數據怎麼設計,db各種性能指標最後2、:補充一個最最重要,最最坑爹,最最有難度的一個題目:一個每秒百萬級訪問量的互聯網伺服器,每個訪問都有數據計算和I/O操作,如果讓你設計,你怎麼設計?
單純後台開發的話,不需要linux內核的經驗了。後台開發著重在C和Linux網路編程(熟悉API)這些。如果你不確定的話,可以找找相關的招聘信息,看看裡面的描述就清楚了。學習linux內核的意義主要就是理解整個linux的設計思路,代碼風格,API設計思路以及各個功能模塊的架構,核心功能的實現方法等等。
學習內核的意義在於,由於你的同行和網友中有很多的樂於偏見和挖苦的人,他們會搬出諸如 RTFSC (Read The F**king Source Code)這樣的話。閱讀 Linux 源碼的經歷有助於你在討論問題的時候不至於喪失一些底氣甚至失去自信。在調試軟體 bug 的時候,對內核的熟悉也讓你容易把系統相關的 bug 迅速定位,也有助於你向發行版維護者或更上游的內核開發者報告 bug 以期問題得到更迅速的解決。
雖然知道更好,但是沒必要。熟悉網路編程和演算法更重要。如果開發需要用到內核調整,會有相應的系統工程師的。
它就是個支線任務,不是必須項但是可以幫你把主線打得更好。
如何學習主席的思想,林副統帥早已給出方法:「帶著問題學,活學活用,學用結合,急用先學,立竿見影,在『用』字上狠下功夫。」
從事Linux 後台開發個人感覺不需要學習Linux內核,要學習的是Linux網路編程以及Linux相關的系統級API,學習內核是為了更好的了解操作系統,做一些偏底層的開發,如驅動開發,嵌入式系統相關的開發,同時內核好的人,當調用上層時,能夠更好的理解上層調用的由來
或許我真的是一個很煩人的人,我只想回復一句,」在這片土地上搞內核的各種,不僅僅要考慮個人的因素,還要考慮環境,曲高和寡,大成尚可,否則難尋用武之地「, 說了這一句定招來無數」有志「之人的鄙視,也在預料之中。。。。
說點實際點的可以操作的:
1.CSAPP這本書看三遍:第一遍明白書中所有概念,第二遍做完所有習題,第三遍拿著這本書找出大部分面經的答案。這樣子算是對計算機有較好的認識了。2.累積經驗:去看開源軟體的源代碼,配合網上各種分析加深理解,包括但不僅限於 nginix,redis,mysql(這個理解邏輯層以及InnoDB和MyISAM原理即可),zookeeper,kafka。最後兩者只需要明白設計理念以及各個角色語義即可。3.學習一本C++經典教材和 C++語言的設計和演化(重點在理解設計理念和思路,語言標準和庫時刻在變化)以應付常規面試。4.(此條建議面向互聯網)理解互聯網技術的套路,例如:項目初期的時候是否適合多利用開源軟體加快開發速度?各個模塊如何進行橫向擴展?大型網站由小到大的演化框架思路?公司裡面做技術的以及寫業務的各自重要性在哪?怎麼利用不同的語言加快開發速度(天下之大並不是全部用C/C++是最優解決方案)?如何在項目的不同階段調整自己的技術側重點以跟隨公司的腳步?暫且想到這麼多,粗淺見識還望斧正做Linux後台開發,現在國內大部分公司有這樣的職位,其實其要求是Linux後台伺服器開發,需要掌握的是系統編程,參考書籍是Linux程序設計,UNIX環境高級編程,UNIX網路編程等,學內核的必要性很弱。我在華為做了4年Linux內核開發,又稱之為嵌入式開發,目前國內搞Linux內核開發的大公司很少,因為華為做CPU,那就必須做內核開發,這樣才能發揮CPU的性能,搞內核開發的小公司,都是嵌入式公司,而且大部分重點在驅動開發。阿里也有搞Linux內核,但是騰訊的操作系統層全部交給Suse去管理了。不要隨意去學一個東西,個人認為最難自學的有內核,設計模式,複雜演算法,編譯原理。搞清楚自己的目的再學習,不要把人生浪費在無意義的學習上,好多內核的書都寫的不咋地,那本深入理解Linux內核,個人認為翻譯的一般。
如果決定學習了,可以看看我這個,對理解內核的調用流很有幫助。GitHub - vonnyfly/kernel_visualization: Automaticly draw callgraphs for Linux/Solaris/FreeBSD kernel functions
linux內核學習曲線比較陡峭,前期不建議閱讀內核代碼,在學習其他內容時了解相關原理即可。可以先重點學習網路編程、c++(Java python也可以),看一些靠譜的書,比如《深入理解計算機系統》。
linux 內核開發.........
建議放棄吧,難度大,學習曲線曲折,相對前端,互聯網,移動開發收益差太多《軟體調試》作者張銀奎專門有講一門課:Linux內核開發與調試 | 博覽網 Boolan(一)深入理解Linux操作系統的基礎設施和核心機制;(二)學習開發Linux程序(內核模塊和應用程序)的工具和方法;(三)學習Linux平台上的調試工具和調試典型問題的方法。
一步一步來啊,先把c學好,寫一陣代碼再說,把應用級別的代碼寫熟了再去看Linux的原代碼也不遲。
你如果連c語言也不熟,基本的數據結構演算法不了解,就去看系統的代碼對你一點好處都沒有。只知道glibc的API用法,等於是知道了「世界是這個樣子」研究明白了內核之後,等於是知道了「噢~原來世界是這個樣子!」
有java基礎就學ssh做互聯網 只會c的話那就只能linux一條路走到黑了
我想題主的意思是希望在框架結構上對內核有個了解,這個有必要,也沒大部分人想像中那麼難,對全面地認識系統和debug有好處。但是不需要深入了解比如TCP增加了某個控制配置,這個沒有必要,不需要到這麼細的粒度。可以看看趙炯的linux0.11,陳麗君的linux設計與實現。內核相對於上層應用來說,百年不變,改得多的無非就是CPU的arch和外設的driver,大框架跟九十年代並沒什麼不同。總之,一次讀懂,終身管用。
推薦閱讀:
※c語言未來的前景(比如就業)是怎麼樣的?
※C語言怎麼寫窗口化程序?
※如何理性的評價各種編程語言的優劣?
※使用 C 語言進行伺服器端編程,未來職業前景與發展前途怎樣?
※如何評價翁愷老師?