primerlinux
❶ 在linux下學c++,可以使用c++primer這本書嗎
可以啊 c++的學習和你使用什麼操作系統或者編譯器無關,雖然可能在不同操作系統或編譯器下有些不同,但這些和c++是無關的。
❷ linux c 引用傳遞參數
C/C++函數參數的傳遞方式有三種:值傳遞(pass by value)、指針傳遞(pass bypointer)、引用傳遞(pass by reference)。
C/C++函數參數的傳遞通道是通過堆棧傳遞,默認遵循__cdecl(C聲明方式),參數由調用者從右往左逐個壓入堆棧,在函數調用完成之後再由調用者恢復堆棧。(Win32API遵循stdcall傳參規范的,不在本文討論范圍)
下面是測試代碼
void Swap(__int64* _pnX, __int64* _pnY)
{
__int64 nTemp = *_pnX;
*_pnX = *_pnY;
*_pnY = nTemp;
}
void Swap(__int64& _nX, __int64& _nY)
{
__int64 nTemp = _nX;
_nX = _nY;
_nY = nTemp;
}
void SetValue(__int64 _nX)
{
__int64 nTemp = _nX;
}
// Test001
void GetMemory(__int64* _pBuff)
{
_pBuff = new __int64[4];
}
// Test002
void GetMemory(__int64** _ppBuff)
{
*_ppBuff = new __int64[4];
}
int _tmain(int argc, _TCHAR* argv[])
{
__int64 nA = 0x10;
__int64 nB = 0x20;
// Test to pass by pointer
Swap(&nA, &nB);
// Test to pass by reference
Swap(nA, nB);
// Test to pass by value
SetValue(nA);
// Test the pointer that points the pointer
__int64* _pArray = NULL;
GetMemory(&_pArray);
delete[] _pArray;
_pArray = NULL;
// Test the pointer
GetMemory(_pArray);
return 0;
}
指針傳遞和引用傳遞
// 下面看一下對應的反匯編的代碼(VS版)
__int64 nA = 0x10;
0041370E mov dword ptr [nA],10h
mov dword ptr [ebp-8],0
__int64 nB = 0x20;
0041371C mov dword ptr [nB],20h
mov dword ptr [ebp-18h],0
// Test to pass by pointer
Swap(&nA, &nB);
0041372A lea eax,[nB]
0041372D push eax
0041372E lea ecx,[nA]
push ecx
call Swap (4111E5h)
add esp,8
// Test to pass by reference
Swap(nA, nB);
0041373A lea eax,[nB]
0041373D push eax
0041373E lea ecx,[nA]
push ecx
call Swap (4111E0h)
add esp,8
// GCC版
0x00401582 <+30>: lea eax,[esp+0x18]
0x00401586 <+34>: mov DWORD PTR [esp+0x4],eax
0x0040158a <+38>: lea eax,[esp+0x1c]
0x0040158e <+42>: mov DWORD PTR [esp],eax
0x00401591 <+45>: call 0x401520 <Swap(int*, int*)>
0x00401596 <+50>: lea eax,[esp+0x18]
0x0040159a <+54>: mov DWORD PTR [esp+0x4],eax
0x0040159e <+58>: lea eax,[esp+0x1c]
0x004015a2 <+62>: mov DWORD PTR [esp],eax
0x004015a5 <+65>: call 0x401542 <Swap(int&, int&)>
通過上面的反匯編代碼,我們可以看出指針傳遞和引用傳遞在機制是一樣的,都是將指針值(即地址)壓入棧中,調用函數,然後恢復棧。Swap(nA, nB)和Swap(&nA, &nB);在實際上的匯編代碼也基本上一模一樣,都是從棧中取出地址來。由此可以看出引用和指針在效率上是一樣的。這也是為什麼指針和引用都可以達到多態的效果。指針傳遞和引用傳遞其實都是改變的地址指向的內存上的值來達到修改參數的效果。
值傳遞
下面是值傳遞對應的反匯編代碼
// Test to pass by value
SetValue(nA);
0041374A mov eax,dword ptr [ebp-8]
0041374D push eax
0041374E mov ecx,dword ptr [nA]
00413751 push ecx
00413752 call SetValue (4111EAh)
00413757 add esp,8
因為我的機器是32位的CPU,從上面的匯編代碼可以看64Bit的變數被分成2個32Bit的參數壓入棧中。這也是我們常說的,值傳遞會形成一個拷貝。如果是一個自定義的結構類型,並且有很多參數,那麼如果用值傳遞,這個結構體將被分割為非常多個32Bit的逐個拷貝到棧中去,這樣的參數傳遞效率是非常慢的。所以結構體等自定義類型,都使用引用傳遞,如果不希望別人修改結構體變數,可以加上const修飾,如(const MY_STRUCT& _value);
下面來看一下Test001函數對應的反匯編代碼的參數傳遞
__int64* _pArray = NULL;
004137E0 mov dword ptr [_pArray],0
// Test the pointer
GetMemory(_pArray);
mov eax,dword ptr [_pArray]
push eax
call GetMemory (411203h)
0041381B add esp,4
從上面的匯編代碼可以看出,其實是0被壓入到棧中作為參數,所以GetMemory(_pArray)無論做什麼事,其實都與指針變數_pArray無關。GetMemory()分配的空間是讓棧中的臨時變數指向的,當函數退出時,棧得到恢復,結果申請的空間沒有人管,就產生內存泄露的問題了。《C++ Primer》將參數傳遞分為引用傳遞和非引用傳遞兩種,非引用傳遞其實可以理解為值傳遞。這樣看來,指針傳遞在某種意義上也是值傳遞,因為傳遞的是指針的值(1個4BYTE的值)。值傳遞都不會改變傳入實參的值的。而且普通的指針傳遞其實是改變的指針變數指向的內容。
下面再看一下Test002函數對應的反匯編代碼的參數傳遞
__int64* _pArray = NULL;
004137E0 mov dword ptr [_pArray],0
GetMemory(&_pArray);
004137E7 lea eax,[_pArray]
004137EA push eax
004137EB call GetMemory (4111FEh)
004137F0 add esp,4
從上面的匯編代碼lea eax,[_pArray] 可以看出,_pArray的地址被壓入到棧中去了。
然後看一看GetMemory(&_pArray)的實現匯編代碼。
0x0040159b <+0>: push ebp
0x0040159c <+1>: mov ebp,esp
0x0040159e <+3>: sub esp,0x18
0x004015a1 <+6>: mov DWORD PTR [esp],0x20
0x004015a8 <+13>: call 0x473ef0 <_Znaj>
0x004015ad <+18>: mov edx,DWORD PTR [ebp+0x8]
0x004015b0 <+21>: mov DWORD PTR [edx],eax
0x004015b2 <+23>: leave
0x004015b3 <+24>: ret
藍色的代碼是分配臨時變數空間,然後調用分配空間函數分配空間,得到的空間指針即eax.
然後紅色的匯編代碼即從ebp+0x8的棧上取到上面壓入棧中的參數_pArray的地址.
mov DWORD PTR [edx],eax即相當於把分配的空間指針eax讓edx指向,也即讓_pArray指向分配的空間eax.
總之,無論是哪種參數傳遞方式,參數都是通過棧上的臨時變數來間接參與到被調用函數的。指針作為參數,其本身的值是不可能被改變的,能夠改變的是其指向的內容。引用是通過指針來實現的,所以引用和指針在效率上一樣的。
❸ linux內核 進程如何銷毀
要了解進程的終止,你必須先了解進程結構體task_struct,期中有一些與進程終止相關的非常重要的域,task_struct在內核源代碼的linux/sched.h中定義。
進程終止有多種方式,無論何種方式,都會調用內核函數sys_exit()函數,而最終調用do_exit()函數(在kernel/exit.c中定義)在do_exit()函數中首先會做一些檢測,包括確保要終止的進程ID不是0或者1,再保證該進程不是處在中斷處理程序之中,之後將要終止進程的task_struct結構體中的flag域設置為PF_EXITING表示該進程已經結束,然後就是比較正式的銷毀過程,釋放進程佔用的資源。比如釋放其佔用的的分配內存(exit_mm()),釋放進程間通信的信號量(exit_sem()),釋放進程創建或者打開的文件描述符(exit_files()),釋放文件系統數據(exit_fs()),釋放線程(exit_thread())等等,最後向其父進程發送SIGCHILD信號,將進程狀態設置為終止,調用schele(),將CPU控制權交給其他進程。
這是大概的銷毀過程的,更詳細的過程請參考linux kernel primer這本書以及linux內核源代碼。
❹ 學習Linux的步驟是怎樣的
對於Linux的學習,可以分為四個階段,Linux初級入門階段→Linux中級進階→Linux高級進階→Linux資深方向細化階段
第一階段:初級階段
初級階段需要把linux學習路線搞清楚,任何學習都是循序漸進的,所以學linux也是需要有一定的路線。
1. Linux基礎知識、基本命令;
2. Linux用戶及許可權基礎;
3. Linux系統進程管理進階;
4. linux高效文本、文件處理命令;
5. shell腳本入門
第二階段:中級進階
中級進階需要在充分了解linux原理和基礎知識之後,對上層的應用和服務進行深入學習,其中說到服務肯定涉及到網路的相關知識,是需要花時間學習的。
1. TCP/IP網路基礎;
2. Linux企業常用服務;
3. Linux企業級安全原理和防範技巧;
4. 加密/解密原理及數據安全、系統服務訪問控制及服務安全基礎;
5. iptables安全策略構建;
6. shell腳本進階;
7. MySQL應用原理及管理入門
第三階段:Linux高級進階
1. http服務代理緩存加速;
2. 企業級負載集群;
3. 企業級高可用集群;
4. 運維監控zabbix詳解;
5. 運維自動化學習;
第四階段:Linux資深方向細化
1. 大數據方向;
2. 雲計算方向;
3. 運維開發;
4. 自動化運維;
5. 運維架構師
以上是Linux的一個學習方向和路線,對於Linux學習是一個需要堅持的過程,也許通過自學或者培訓,3至6個月都可以把基本知識學會,但是重在實踐,深入的思考和不斷的摸索,你會發現Linux更多的美!
❺ Linux學習書籍求推薦
Linux學習書籍求推薦
1、《Linux與Unix Shell 編程指南》
c語言基礎
1、《C Primer Plus,5th Edition》【美】Stephen Prata著
2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan David M. Rithie(K & R)著
3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE)
4、《嵌入式Linux應用程序開發詳解》
Linux內核
1、《深入理解Linux內核》(第三版)
2、《Linux內核源代碼情景分析》毛德操 胡希明著
研發方向
1、《UNIX Network Programming》(UNP)
2、《TCP/IP詳解》
3、《Linux內核編程》
4、《Linux設備驅動開發》(LDD)
硬體基礎
1、《ARM體系結構與編程》杜春雷著
2、S3C2410 Datasheet
英語基礎
1、《計算機與通信專業英語》
系統教程
1、《嵌入式系統――體系結構、編程與設計》
2、《嵌入式系統――採用公開源代碼和StrongARM/Xscale處理器》毛德操 胡希明著
3、《Building Embedded Linux Systems》
理論基礎
1、《演算法導論》
2、《數據結構(C語言版)》
3、《計算機組織與體系結構?性能分析》
4、《深入理解計算機系統》【美】Randal E. Bryant David O』Hallaron著
5、《操作系統:精髓與設計原理》
6、《編譯原理》
7、《數據通信與計算機網路》
8、《數據壓縮原理與應用》
入門篇
《LINUX權威指南》書不錯,寫的很全面也比較廣,涉及的不深,做為入門書籍不錯,可以比較全面的了解linux 。另外比較熱門的也可以看看《鳥哥的私房菜》等書,偏管理類的書。如果想做server方向的可以找來看看。
驅動 篇
《LINUX設備驅動程序 》就是網上說的「LDD」,經典之作,必備書籍。國產經典《Linux驅動詳細解》也是一本非常不錯的書,很實用,書中源代碼分析比較多,基於2440的,對linux外圍驅動有很全面的講解
內核篇
浙江大學的《LINUX內核源代碼情景分析》,外國鬼子的《萊昂氏UNIX源代碼分析》還有《深入理解linux內核》都是出名的經典巨作。另外趙 炯的《LINUX內核完全剖析–基於0.12內核》也非常不錯,對內核代碼進行了詳細的注釋,非常有助於對內核的理解和代碼的分析。
shell篇
《LINUX與UNIX Shell編程指南》
應用 編程
不用說了肯定是《unix環境高級編程》被稱為unix編程的聖經。
TCP/IP篇
《TCP/IP詳解》作者W.Richard Stevens也是《unix環境高級編程》的作者,牛人出的書沒有一本不是經典的。但是英年早逝,默哀一下。
c語言
《The C Programming Language》正是作者造出來的c語言,書能垃圾就怪了
《c和指針》和《c缺陷和陷阱》兩本必備。包含了c語言最容易出錯的地方,加深c語言功力的好材料。
關於演算法
《演算法導論》
1 熟悉linux基本環境 >>> 《鳥哥的私訪菜》《unix初級教程》 《linux編程寶典》(市面上無,圖書館有), 等等。
2 熟悉操作系統的基礎知識 >>> 《現代操作系統》 《操作系統概念》
3 熟悉系統編程 >>> 《unix環境高級編程第二版》《unix操作系統設計與實現》
4 內核 按先後順序: 《 linux內核設計與實現》 《linux設備驅動程序》 《深入理解 linux內核》 《linux內核源代碼情景分析》 《深入理解linux虛擬內存系統》
5 其他一些書籍: 《freebsd操作系統設計與實現》 《solaris內核結構》 《unix高級教程:系統技術內幕》 《現代體系結構的unix系統:內核程序員的smp與cache技術》 《保護方式下的80386及其編程》 (後3本市面上沒了,大學圖書館里一般都有》 《Intel64 and IA-32 Arichitectures Software Developer』s Manual》
6 其實內核玩深了,體系和編譯也要學好 《計算機體系結構:量化研究方法》 《編譯原理》(龍書)
Linux編程推薦書籍一覽表
shell 編程
《LINUX與UNIX SHELL編程指南》
BASH寶典:
Advanced Bash Scripting Guide (如果你使用的是 GNU/Debian 系統,可以用 apt-get install abs-guide 安裝該文檔)
BASH Programming – Introction HOW-TO
Bash Man
用戶級編程書籍:
Advanced Programming in the UNIX Environment(中文版《UNIX環境高級編程》第二版) 作者 W.Richard
Stevens/尤晉元等
GNU/Linux編程指南 作者 Kurt Wall
Linux 程序設計權威指南 作者 於明儉、陳向陽、方漢
《The Art of Unix Programming》作者 E.S.R
Computer Systems A Programmer』s Perspective
(中文名)《深入理解計算機系統(修訂版)》
《Unix Systems Programming》(中文版《UNIX系統編程》)作者: (美)KAY
A.ROBBINS, STEVE ROBBINS 譯者:陳涓 趙振平
網路編程:
Unix Network Programming V1 & V2,Unix網路編程卷1、2 作者 W.Richard Stevens
《unix網路編程》
XWindow編程
Definitive Guides to the X WindowSystem 作者 Dan Heller, Paula M. Ferguson
內核源代碼閱讀(結合源代碼)和編程
(入門)
《邊干邊學Linux內核指導》
(高級)
《Linux Kernel Development》
《Linux內核源代碼情景分析》
《深入分析Linux內核源代碼》 陳莉君
《 Understanding Linux Network Internals 》即《 深入理解Linux網路內幕(英文影印版)》Christian Benvenuti
內核模塊編程
《The Linux Kernel Mole Programming Guide》
Linux設備驅動編程
Linux設備驅動程序/Linux Device
Drivers 作者 Alessandro Ruibini
多線程編程
《多線程編程指南》
❻ linux系統怎麼安裝primer3
一、工具篇 「公欲善其事,必先利其器」。編程是一門實踐性很強的工作,在你以後的學習或工作中,你將常常會與以下工具打交道, 下面列出學習C語言編程常常用到的軟體和工具。 1、操作系統 在UNIX或Linux系統中學習C很方便,所以在開始您的學習旅程前請先選擇一個UNIX或Linux操作系統,目前可供個人免費使用的UNIX或Linux系統有FreeBSD、RedHat Linux、SUSE Linux等,而且在安裝包中還提供很多實用的工具,如:gcc, make等。 如果您一直使用Windows,身邊又沒有多餘的機器安裝UNIX,則可以使用VMware,通過VMware安裝虛擬系統。 2、編譯工具 目前絕大多數Unix或Lnux系統都提供CC或GCC編譯器,最簡單的cc命令格式如下: cc -o hello hello/ 2)Secure shell/putty 一個支持ssh協議得客戶端工具,多數情況下用來連接linux系統。 二、書籍篇 「書是人類進步得階梯」。學習一門新的知識,當然要選擇幾本適合自己得書籍,下面介紹一些我自己學習C語言使用過的書籍: 1/ 4. UNIX環境編程 學習了以上內容之後,我相信,你就可以進行unix環境編程了。不過你可能需要對操作系統理論有一點點的了解,這樣學起來會比較輕松一些。 Unix環境編程,你應該著重IO和進程兩大塊內容。 《Unix環境高級編程》中對Unix環境編程有著非常詳細且深入的論述,而且書中有大量實用性例子程序,不過可能得花上幾個月得時間,好好啃一啃了。 在扎實掌握以上內容,不代表你得C語言學習支路已經完成,相反,才剛剛開始。以後你需要用學到得知識去解決大量不同實際問題,在不斷得實踐過程中,你會近一步加深對C的理解。有了以上基礎之後,你會發現,在實踐過程中需要的其他知識,你會非常快速的掌握。
❼ linux內核 進程如何銷毀
要了解進程的終止,你必須先了解進程結構體task_struct,期中有一些與進程終止相關的非常重要的域,task_struct在內核源代碼的linux/sched.h中定義。
進程終止有多種方式,無論何種方式,都會調用內核函數sys_exit()函數,而最終調用do_exit()函數(在kernel/exit.c中定義)在do_exit()函數中首先會做一些檢測,包括確保要終止的進程ID不是0或者1,再保證該進程不是處在中斷處理程序之中,之後將要終止進程的task_struct結構體中的flag域設置為PF_EXITING表示該進程已經結束,然後就是比較正式的銷毀過程,釋放進程佔用的資源。比如釋放其佔用的的分配內存(exit_mm()),釋放進程間通信的信號量(exit_sem()),釋放進程創建或者打開的文件描述符(exit_files()),釋放文件系統數據(exit_fs()),釋放線程(exit_thread())等等,最後向其父進程發送SIGCHILD信號,將進程狀態設置為終止,調用schele(),將CPU控制權交給其他進程。
這是大概的銷毀過程的,更詳細的過程請參考linux
kernel
primer這本書以及linux內核源代碼。
❽ THE LINUX KERNEL PRIMER怎麼樣
一直以為自己在挑書方面是很幸運的,總是在適當的時候挑到恰當的書。可惜這次我遺憾了,這本書我讀晚了,所以它對我的價值已經不怎麼高了。當時在china-pub上看到的時候,吸引我的不是其內容,而是定價,雖然定價75,但打折後只要30,如果你去得不晚,應該還有戲。壞消息是,本書只見到英文版......某種程度上這也是個大好的消息...... 但我畢竟還是會推薦它,給剛開始接觸Linux內核的朋友,假如一開始就能從頭讀這本書,會節約很多體力。什麼叫primer?primer的內涵不在於初等或者低級,而是打底,也就是打基礎。本書介紹了從頭開始學習Linux內核的所有細節,甚至包括大量的代碼分析。雖然沒有《情景分析》那麼透徹,但其循序漸進的風格很值得借鑒。再說,《情景分析》也夠老了,常看見一些朋友剛開始就抱個《情景分析》苦讀,敬佩之餘也覺得很遺憾。考慮到各人成長路途不同,也不能說人家一開始就這么搞是不好的,我也認識剛開始就做到知識跨越的高人,人和人畢竟不同...當然,如果你不是對自己那麼太自負的話,最好還是選擇primer,反正虧不了你。
❾ 怎麼學習linux
Linux主體分為「運維」與「開發」兩個方向,無論你是Linux相關從業者,還是說愛好都可以歸類到這里,其中「運維」一般是初學者或者轉行人員的首選,而Linux運維主要是對伺服器穩定、性能與安全方面的維護和調試。
實際上Linux入門並不困難,只要具備Linux基礎,讀懂Linux的命令格式,大多數的服務架構都是可以按照文檔部署出來。當然做Linux開發,個人建議去參加培訓學習更有效率,如果報班學習則大概需要4-6個月時間。
學習主要內容有:
1)網路基礎與linux系統的管理
2)優化及高可用技能
3)虛擬化與雲平台技術
4)開發運維
畢業後可從事的工作有:
1)Linux運維工程師
2)資料庫工程師
3)雲計算運維工程師
4)自動化運維工程師
5)雲計算架構工程師等
互聯網行業目前還是最熱門的行業之一,學習IT技能之後足夠優秀是有機會進入騰訊、阿里、網易等互聯網大廠高薪就業的,發展前景非常好,普通人也可以學習。
想要系統學習,你可以考察對比一下開設有相關專業的熱門學校,好的學校擁有根據當下企業需求自主研發課程的能力,能夠在校期間取得大專或本科學歷,中博軟體學院、南京課工場、南京北大青鳥等開設相關專業的學校都是不錯的,建議實地考察對比一下。
祝你學有所成,望採納。
❿ 想從事linux下c++開發,需要學哪些知識幫忙推薦每個學習階段的一些書籍,越詳細越好。
《21天學會C++》
或者
《C++ Primer 》
《 C++編程規范》作者 : Herb Sutter/Andrei Alexandrescu
《Exceptional C++ Style中文版》 作者 : Herb Sutter
《C++面向對象程序設計》薩維奇 (Walter Savitch) / 周靖 / 清華大學出版社
《C++ : The Complete Reference 》Herbert Schildt / Osborne/McGraw-Hill
《C++沉思錄》(美)凱尼格,(美)莫歐著,黃曉春
《Effective C++:改善程序與設計的55個具體做法》(美)梅耶 著,侯捷 譯
《More Effective C++:35個改善編程與設計的有效方法》(美)梅耶著,侯捷
《零起點學通C++》范磊 編著
一、Linux操作系統
二、Linux C++開發環境搭建、開發工具的使用
三、C++語言
四、C++ Boost模板庫
五、ACE框架
六、資料庫開發
七、軟體工程
unix 高級編程、系統編程燈書籍