Linux下的C語言入門(ubuntu為例)
Linux下的C語言入門(以ubuntu為例)
一、編輯器vi(vim)
vi是最常用的文字編輯器,我們可以使用它來編寫C語言程式碼。
vi hello.c //編輯一個名為hello.c的檔案
進入vi編輯器後,有兩種模式:命令模式、插入模式。
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將所有的資源或裝置均看作一個檔案
比如標準輸出輸入流、錯誤流分別對應stdout
、stdin
、stderr
三個檔案,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.作業系統對記憶體的管理
注意:其中棧底是高地址,棧頂是低地址。