1. 程式人生 > 其它 >Linux下的C語言入門(ubuntu為例)

Linux下的C語言入門(ubuntu為例)

技術標籤:學習筆記c語言linux

Linux下的C語言入門(以ubuntu為例)

一、編輯器vi(vim)

vi是最常用的文字編輯器,我們可以使用它來編寫C語言程式碼。

vi hello.c	//編輯一個名為hello.c的檔案

進入vi編輯器後,有兩種模式:命令模式、插入模式。

一進來就時命令模式,輸入i在當前游標處開始插入字元,可以用上下左右箭頭控制輸入。摁esc鍵可回到命令模式,下面介紹命令模式下幾種常用的命令:

3 dd	//將游標所在行往下共3行程式碼剪下
3 yy	//將游標所在行往下共3行程式碼複製
p	//貼上
:set nu	//顯示行號
:sp filename	//新建一個檔案並開啟編輯視窗
:wq	//儲存並退出
:q	//退出
:q!	//強制退出

二、編譯命令

//將hello.c編譯,編譯輸出檔名為hello.out
gcc hello.c -o hello.out	

編譯編譯完成後,就可以執行hello.out檔案:

./hello.out

執行

三、使用gdb除錯程式碼

注意要使用gdb來除錯程式碼,在我們編譯的時候,編譯命令要多加一個引數-g

,格式如下:

gcc hello.c -o hello.out -g

然後就可以對程式除錯了:

gdb hello.out

然後進入到除錯環境(gdb),我們下面介紹一些基本的除錯命令:

l	//顯示原始碼
start	//開始除錯,可以執行到下一個斷點
break 6	//在第六行新增一個斷點
break max	//在函式max的起始位置新增斷點
info break	//顯示所有斷點
delete numofBreak	//刪除編號為numofBreak的斷點
n	//執行一行語句,注意不進入函式內部
s	//執行一行語句,遇到函式會進入函式內部
finish	//執行完當前函式
p a	//檢視變數a的值
p &a	//檢視變數a的地址
bt	//檢視函式棧,可以看到函式序號
f 1	//切換到序號為的1的函式
q	//退出gdb除錯

四、多檔案編譯及makefile的使用

命令格式:

gcc hello1.c hello2.c hello12.c -o hello.out -g

在hello1.c,hello2.c,hello12.c裡的函式可以相互呼叫,當我們的原始檔有很多很多時,每次都手動輸入這些命令麻煩且容易出錯,因此我們要使用make工具來管理這些編譯命令,以達到快捷編譯的效果。
使用方式:新建一個makefile檔案,然後在裡面編寫內容:

/*格式:
 *	outputfilename:file1 file2 file3
 *	|<- tab->| gcc file1 file2 file3 -o outputfilename -g
 *解釋:
 *	第一行是代表編譯生成outputfilename檔案所需要那些檔案
 *	第二行是編譯命令,注意其前面一定要有一個tab
 *注意:
 *	在第一行中如果存在非.c的檔案,
 *	需要下面按著格式寫明該檔案的編譯
 */

hello.out:hello1.o hello2.o hello12.c
        gcc hello1.o hello2.o hello12.c -o hello.out -g
        
hello1.o:hello1.c
        gcc hello1.c -o hello1.o -g
        
hello2.0:hello2.c
        gcc hello2.c -o hello2.o -g

當makefile檔案編寫儲存好之後,只需輸入make命令就可快捷地進行編譯。

五、拓展知識

linux下的命令也是一個個C語言的小程式,執行命令時會呼叫相應的程式

1.main()的真實寫法應為:

/*	
 *	argv代表argc陣列的長度,argc裡面儲存的是終端輸入的命令,
 *	每一個空格即增加一個長度,比如命令ls -l,該命令就會
 *	存入argc陣列中,而argv為2
 */
int main(int argv,char* argc[])

2.main函式中的return值代表該執行的成功與否

return 0;//執行正常
return 110;//返回110號錯誤

3.兩條命令之間可以用&&來連線

第二條命令則僅在第一條命令執行成功的情況下執行。

4.linux將所有的資源或裝置均看作一個檔案

比如標準輸出輸入流、錯誤流分別對應stdoutstdinstderr三個檔案,C語言中一旦引入stdio庫就引入這三個檔案。

//printf("please input");
fprintf(stdout,"please input");
fscanf(stdin,"%d",&a);
fprintf(stderr,"errormessage");
/*	
 *	注意上面的程式碼中的stdout,stdin,stderr
 *	可以用任何其他檔案替代
 */

5.重定向

./a.out 1>> a.txt
上面的命令可以將a.out的正確的輸出流stdout裡的內容輸出到a.txt中,>>是追加形式,>是覆蓋的形式

./a.out < input.txt
從input.txt中讀取輸入流

./a.out 1> a.txt 2> b.txt <input.txt
表示正確的輸出流輸出到a.txt,錯誤的輸出流輸出到b.txt,並從input.txt中讀取輸入流

6.管道

ls /etc/ |grep ab
命令的意思是將ls /etc/命令的輸出當作grep ab命令的輸入,這樣就可以列出/etc/目錄下所有包含ab的檔案或目錄

ps -e | grep ssh
ps是列出當前執行的程序,上述命令即為列出包含ssh的內容

7.作業系統對記憶體的管理

在這裡插入圖片描述
注意:其中棧底是高地址,棧頂是低地址。