Linux操作系統(tǒng)實驗 實驗二 Linux(unix)環(huán)境程序設(shè)計基礎(chǔ)_第1頁
Linux操作系統(tǒng)實驗 實驗二 Linux(unix)環(huán)境程序設(shè)計基礎(chǔ)_第2頁
Linux操作系統(tǒng)實驗 實驗二 Linux(unix)環(huán)境程序設(shè)計基礎(chǔ)_第3頁
Linux操作系統(tǒng)實驗 實驗二 Linux(unix)環(huán)境程序設(shè)計基礎(chǔ)_第4頁
Linux操作系統(tǒng)實驗 實驗二 Linux(unix)環(huán)境程序設(shè)計基礎(chǔ)_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、實驗二 linux/unix環(huán)境程序設(shè)計基礎(chǔ)一. 實驗?zāi)康?. 掌握使用linux環(huán)境下的常用編輯工具編輯程序的方法。2. 熟悉shell程序設(shè)計的基本技術(shù)。3. 掌握linux環(huán)境下使用gnu gcc/gdb等工具進行程序設(shè)計的基本技術(shù)。二. 實驗指導(dǎo)1. linux的文本編輯工具在linux環(huán)境下可使用vi、emacs、kate、kedit等編輯工具編寫源代碼,其中emacs和vi可在字符模式下運行,而kate和kedit需在圖形用戶界面下使用,都是全屏幕編輯工具,使用簡單,kate帶有一個文件列表區(qū)、一個文件編輯區(qū)和一個命令輸入?yún)^(qū),是一個編寫程序的好工具。啟動vi、kate和kedit編

2、輯文件的命令行方法如下:$ vi 程序文件名 $ kate 程序文件名 $ kedit 程序文件名kate和kedit的圖形界面啟動方法:.開始菜單|運行命令|kate開始菜單|運行命令|kedit2. 文件編輯器vi vi是在unix 上被廣泛使用的中英文編輯軟件。vi是visual editor的縮寫,是unix提供給用戶的一個窗口化編輯環(huán)境。進入vi,直接執(zhí)行vi編輯程序即可。例:$vi test.c顯示器出現(xiàn)vi的編輯窗口,同時vi會將文件復(fù)制一份至緩沖區(qū)(buffer)。vi先對緩沖區(qū)的文件進行編輯,保留在磁盤中的文件則不變。編輯完成后,使用者可決定是否要取代原來舊有的文件。1、vi

3、的工作模式vi提供二種工作模式:輸入模式(insert mode)和命令模式(command mode)。使用者進入vi后,即處在命令模式下,此刻鍵入的任何字符皆被視為命令,可進行刪除、修改、存盤等操作。要輸入信息,應(yīng)轉(zhuǎn)換到輸入模式。(1)命令模式在輸入模式下,按esc可切換到命令模式。命令模式下,可選用下列指令離開vi:q!離開vi,并放棄剛在緩沖區(qū)內(nèi)編輯的內(nèi)容:wq將緩沖區(qū)內(nèi)的資料寫入磁盤中,并離開vi:zz同wq:x同wq:w將緩沖區(qū)內(nèi)的資料寫入磁盤中,但并不離開vi:q離開vi,若文件被修改過,則要被要求確認是否放棄修改的內(nèi)容,此指令可與:w配合使用(2)命令模式下光標的移動 h左移一

4、個字符j下移一個字符k上移一個字符l右移一個字符0移至該行的首$移至該行的末移至該行的第一個字符處h移至窗口的第一列m移至窗口中間那一列l(wèi)移至窗口的最后一列g(shù)移至該文件的最后一列w, w下一個單詞 (w 忽略標點)b, b上一個單詞 (b 忽略標點)+移至下一列的第一個字符處-移至上一列的第一個字符處(移至該句首)移至該句末移至該段首移至該段末ng移至該文件的第n列n+移至光標所在位置之后第n列n-移至光標所在位置之前第n列(3)輸入模式輸入以下命令即可進入vi輸入模式:a(append) 在光標之后加入資料a 在該行之末加入資料i(insert)在光標之前加入資料i 在該行之首加入資料o(o

5、pen)新增一行于該行之下,供輸入資料用o新增一行于該行之上,供輸入資料用dd刪除當前光標所在行x刪除當前光標字符x刪除當前光標之前字符u撤消重做f查找s 替換,例如:將文件中的所有fox換成duck,用:%s/fox/duck/gesc離開輸入模式更多用法見 info vi3. shell程序設(shè)計基礎(chǔ)shell是用戶與linux操作系統(tǒng)之間的接口,是命令語言、命令解釋程序和程序設(shè)計語言的總稱。用戶在提示符下輸入的命令都由shell先加以解釋,然后傳給linux內(nèi)核,或調(diào)用相關(guān)程序執(zhí)行。shell支持絕大多數(shù)高級語言中能見到的程序元素,如函數(shù)、變量、數(shù)組和程序控制結(jié)構(gòu),可以解釋執(zhí)行包含這些結(jié)構(gòu)

6、的shell程序。linux中有多種shell,如bash、ksh、csh等,默認的是bash。當用戶打開終端后,系統(tǒng)為該終端建立一個程序shell的進程,由進程去讀入、識別和執(zhí)行用戶輸入的各種命令。linux命令有可執(zhí)行二進制程序和shell程序,shell程序類似于dos中的批處理程序。(1) shell程序的編輯shell程序可用編輯工具vi、kate、kedit等編寫,并保存為一個磁盤文件。shell程序的第一行通常為#!/bin/bash,告知linux使用/bin/bash解釋執(zhí)行該程序。(2) shell程序的執(zhí)行方法一:bash shell文件名方法二:直接執(zhí)行。將shell程

7、序的權(quán)限設(shè)置為644。鍵入 ./shell程序名(3) i/o重定向shell程序中經(jīng)常涉及到輸入輸出。linux有通過3個特殊文件實現(xiàn)信息的輸入輸出:標準輸入(stdin, 文件描述符為0)、標準輸出(stdout,文件描述符為1)和標準錯誤輸出(stderr, 文件描述符為2)。shell通過標準輸入接受用戶的鍵盤命令,將執(zhí)行結(jié)果送往標準輸出從終端顯示,而將出錯信息寫到標準錯誤輸出,而從終端顯示。linux通過i/o重定向,可以改從文件輸入命令,將輸出結(jié)果或出錯信息改送文件。以下是一些示例:1) 輸出重定向命令格式:command file 或command file 將命令輸出信息寫到文

8、件例:ls l fileinfo 將當前目錄下的文件信息以長格式方式保存到文件fileinfo中,覆蓋原來的內(nèi)容;datefileinfo 將date命令的輸出追加到文件fileinfo后;2) 輸入重定向命令格式:command file 從文件讀命令信息例:wc& file 或command &file(4) 管道將前一命令的輸出作為后一命令的輸入。命令格式:命令1|命令2|命令3例:who | sort user_list 將who命令的結(jié)果排序,寫入文件user_list。(5) shell變量shell變量只有字符類型,其值為字符串,變量名以字母或下劃線開始,大小寫敏感,用$var的

9、形式引用名為var的變量的值。定義格式:變量名=變量值例:$ no=10$ hello=”hello everybody”$ echo $no$ echo $hello環(huán)境變量:shell定義的與工作環(huán)境有關(guān)的變量,可由用戶修改。home保存登錄主目錄的完全路徑名path保存命令搜索路徑,多個路徑間以”:”隔開pwd當前工作目錄的絕對路徑名ps1主提示符預(yù)定義變量:由shell定義,用戶不能修改。$? 前一命令執(zhí)行的返回狀態(tài)$當前進程的pid位置變量:shell程序命令行參數(shù)由shell寫到位置變量中,可在程序中引用$0當前進程的進程名$1第1個命令行參數(shù)$2第2個命令行參數(shù)$3第3個命令行參

10、數(shù)$#位置參數(shù)個數(shù)(6) 條件執(zhí)行語句格式:if 條件then 命令行else命令行fi條件格式: 測試語句 或 test 測試語句文件測試: -e filename 如果文件存在-r filename如果文件存在并可讀-x filename如果文件存在且可執(zhí)行-w filename如果文件存在且可寫-d filename如果文件存在且為目錄 -f filename如果文件存在且為普通文件數(shù)值測試:test n1 eq n2整數(shù)n1和n2相等test n1 ne n2 整數(shù)n1和n2不相等test n1 gt n2 整數(shù)n1大于n2test n1 ge n2整數(shù)n1大于或等于n2字符串測試:t

11、est s測試字符串非空test s1=s2字符串s1等于s2test s1!=s2字符串s1不等于s2test z s字符串s為空串例:#!/bin/bash if $# -ne 1 then echo “usage - $0 file-name”exit 1fiif test f $1then echo “$1 file exists”elseecho “sorry, $1 file does not exits” fi(7) case語句利用case語句可根據(jù)字符串或變量的值從多個選項中選擇一項執(zhí)行格式:case string inexpr1)命令行1;expr2)命令行2;*)其它命令

12、行;esac例:從命令行輸入一個簡單的算術(shù)表達式,計算結(jié)果:#!/bin/bashif test $#=3thencase 2 in+) let z=$1+$3 ;-) let z=$1-$3 ;/) let z=$1/$3 ;x|x) let z=$1*$3 ;*) echo errorexit 1;esacecho answer is $zfi測試:$./test 5 + 7(8) 循環(huán)for循環(huán)格式:for 變量名 in 數(shù)值列表do命令行donefor循環(huán)例:#!/bin/bashfor i in 1 2 3 4 5doecho welcome $i timesdonewhile循環(huán)格

13、式:while 命令行1do命令行2donewhile循環(huán)例:顯示number=10; number=20;一直到number=100。#!/bin/bashi=1while $i le 10doecho number=expr $i *10 ; expr表示對表達式求值i= expr $i+1donebreak和continue:可于用終止循環(huán)和開始下一重循環(huán)(9) shell程序調(diào)試shell程序的調(diào)試主要通過利用shell解釋程序的-v和-x選項跟蹤程序的執(zhí)行過程來實現(xiàn)。調(diào)用格式:bash 選項 shell程序文件名選項含義:-v 當讀入shell輸入行時把它們顯示出來-x 執(zhí)行命令時把

14、命令和它們的參數(shù)顯示出來4. gnu c編譯器linux上可用的c編譯器是gnu c編譯器,它建立在自由軟件基金會編程許可證的基礎(chǔ)上,因此可以自由發(fā)布。linux 上的gnu c編譯器(gcc)是一個全功能的anci c兼容編譯器,而一般unix(如sco unix)用的編譯器是cc。下面介紹gcc和一些gcc編譯器最常用的選項。(1) 使用gcc通常后跟一些選項和文件名來使用gcc編譯器。gcc命令的基本用法如下: gcc options filenames命令行選項指定的編譯過程中的具體操作(2) gcc常用選項gcc有超過100個的編譯選項可用,這些選項中的許多可能永遠都不會用到,但一些

15、主要的選項將會頻繁使用。很多的gcc選項包括一個以上的字符,因此必須為每個選項指定各自的連字符,并且就像大多數(shù)linux 命令一樣不能在一個單獨的連字符后跟一組選項。例如,下面的命令是不同的:gcc -p-g test.cgcc -pg test.c第一條命令告訴gcc編譯test.c時為prof命令建立剖析(profile)信息并且把調(diào)試信息加入到可執(zhí)行文件里。第二條命令告訴gcc只為gprof命令建立剖析信息。當不用任何選項編譯一個程序時,gcc將建立(假定編譯成功)一個名為a.out的可執(zhí)行文件。例如, gcc test.c編譯成功后,當前目錄下就產(chǎn)生了一個a.out文件。也可用-o選項

16、來為即將產(chǎn)生的可執(zhí)行文件指定一個文件名來代替a.out。例如:gcc o count count.c此時得到的可執(zhí)行文件就不再是a.out,而是count。gcc也可以指定編譯器處理步驟多少。-c選項告訴gcc僅把源代碼編譯為目標代碼而跳過匯編和連接步驟。這個選項使用得非常頻繁因為它編譯多個c程序時速度更快且更易于管理。默認時gcc建立的目標代碼文件有一個.o的擴展名。(3) 執(zhí)行文件 格式: ./可執(zhí)行文件名例:./a.out ./count5. gdb調(diào)試工具linux包含了一個叫g(shù)db的gnu調(diào)試程序。gdb是一個用來調(diào)試c和c+程序的強有力調(diào)試器。它使你能在程序運行時觀察程序的內(nèi)部結(jié)構(gòu)

17、和內(nèi)存的使用情況。它具有以下一些功能:監(jiān)視程序中變量的值;設(shè)置斷點以使程序在指定的代碼行上停止執(zhí)行;一行行的執(zhí)行代碼。以下是利用gdb進行調(diào)試的步驟:(1) 調(diào)試編譯代碼為了使gdb正常工作,必須使你的程序在編譯時包含調(diào)試信息。調(diào)試信息里包含你程序里的每個變量的類型和在可執(zhí)行文件里的地址映射以及源代碼的行號。gdb利用這些信息使源代碼和機器碼相關(guān)聯(lián)。在編譯時用 g 選項打開調(diào)試選項。(2) gdb基本命令命 令描 述file裝入欲調(diào)試的可執(zhí)行文件kill終止正在調(diào)試的程序list列出產(chǎn)生執(zhí)行文件的源代碼部分next執(zhí)行一行源代碼但不進入函數(shù)內(nèi)部step執(zhí)行一行源代碼并進入函數(shù)內(nèi)部run執(zhí)行當前

18、被調(diào)試的程序quit終止gdbwatch監(jiān)視一個變量的值而不管它何時被改變break在代碼里設(shè)置斷點,使程序執(zhí)行到這里時被掛起make不退出gdb就可以重新產(chǎn)生可執(zhí)行文件shell不離開gdb就執(zhí)行unix shell 命令(3) 應(yīng)用舉例1)設(shè)有一源程序greet.c2)編譯,gcc -ggdb o greet greet.c,出錯3)gdb greet ,出現(xiàn)提示符(gdb),此時可在提示符下輸入gdb的命令了,如:(gdb)run(gdb)list4)退出調(diào)試狀態(tài),返回系統(tǒng)提示符下, (gdb)quit6. linux環(huán)境下c/c+程序設(shè)計基礎(chǔ)在unix/linux環(huán)境下,開發(fā)應(yīng)用程序的

19、流程如圖2.1所示。源代碼編輯器編譯器:編譯、匯編庫文件連接程序:連接源程序:.c .cpp目標程序:.o二進制可執(zhí)行程序頭文件.h裝載程序:加載運行內(nèi)存映象調(diào)試工具:調(diào)試程序打包工具:發(fā)行程序圖2.1 linux應(yīng)用程序開發(fā)流程一個應(yīng)用程序的開發(fā)大概包括5個過程:(1) 編輯程序。使用源代碼編輯器產(chǎn)生源代碼,c/c+語言的源程序后綴為.c和.cpp。(2) 編譯程序。使用編譯程序?qū)⒃闯绦蚓幾g成目標代碼文件,目標代碼文件的后綴通常為.o。unix/linux環(huán)境常用的編譯工具是gcc。(3) 鏈接程序。使用連接程序?qū)⒛繕舜a文件與系統(tǒng)庫文件鏈接形成可執(zhí)行程序。連接程序通常與gcc集成在一起。(

20、4) 加載和運行程序。將生成的可執(zhí)行程序加載到內(nèi)存運行。(5) 調(diào)試程序。使用ddd/gdb等調(diào)試工具對程序進行調(diào)試。ddd是gdb的圖形界面。(6) 打包發(fā)行程序。將完成了調(diào)試和測試的程序打包發(fā)行。下面使用一個示例說明在linux環(huán)境下開發(fā)一個應(yīng)用程序的過程。假定現(xiàn)在有一個c語言文件hw.c,其內(nèi)容如下:#include main()printf(hello worldn);exit(0);第一步:使用vi或kate等編輯工具編寫以上源程序,并取名為hw.c;第二步:使用gcc編譯鏈接源程序hw.c生成可執(zhí)行程序。命令格式:$ gcc -g -o 選項說明:-o 后面的參數(shù)指明生成的可執(zhí)行程

21、序名,如果沒有該選項,則可執(zhí)行程序名為a.out -g在生成的可執(zhí)行二進制程序中加入調(diào)試信息,以便進行源代碼級調(diào)試本例命令:$ gcc g o hw hw.c第三步:運行程序。命令格式為: $ ./hw第四步:如果程序需要調(diào)試,可以借助ddd/gdb進行源代碼級的調(diào)試。啟動調(diào)試命令是:$ ddd hw說明:ddd調(diào)試工具的用戶界面與vc+等開發(fā)環(huán)境很相似,可以在gui環(huán)境中設(shè)置斷點、單步執(zhí)行、檢查變量和寄存器的值等。三. 實驗內(nèi)容1. 編輯、分析、理解和調(diào)試一個shell程序;2. 編輯、分析、理解和調(diào)試一個c/c+語言程序。四. 實驗步驟(一)shell程序的分析、運行與調(diào)試1. 使用kate、kedit和vi等編輯工具編輯shell程序renam

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論