第一篇:實(shí)驗(yàn)一__Linux下C編程
實(shí)驗(yàn)一 Linux下C編程
一. 實(shí)驗(yàn)?zāi)康模?/p>
1. 熟練使用vi中的常見操作,并且熟悉vi的3種模式;
2. 熟練掌握gcc編譯命令及gdb的調(diào)試命令;通過(guò)對(duì)有問題程序的跟蹤調(diào)試,進(jìn)一步提高發(fā)現(xiàn)問題和解決問題的能力;
3. 通過(guò)對(duì)包含文件的makefile的編寫,熟悉各種形式的makefile; 4. 通過(guò)使用autotools生成包含多文件的makefile。二. 實(shí)驗(yàn)內(nèi)容
1. 熟練使用vi(1)在“/root”目錄下建一個(gè)名為“vi”的目錄;(2)進(jìn)入“vi”目錄;
(3)將文件“/etc/inittab”復(fù)制到“vi”目錄下;(4)使用vi打開“vi”目錄下inittab;
(5)設(shè)定行號(hào),指出設(shè)定initdefault的所在行號(hào);(6)將光標(biāo)移到該行;(7)復(fù)制該行內(nèi)容;
(8)將光標(biāo)移到最后一行行首;(9)粘貼復(fù)制行的內(nèi)容;(10)撤銷第9步操作;
(11)將光標(biāo)移到最后一行行尾;(12)粘貼復(fù)制行的內(nèi)容;
(13)光標(biāo)移到“si::sysinit:/etc/rc.d/rc.sysinit”;(14)刪除該行;(15)存盤但不退出;(16)將光標(biāo)移到行首;
(17)插入模式下輸入“Hello,this is vi world!”;(18)返回命令行模式;
(19)向下查找字符串“0:wait”;(20)向上查找字符串“halt”;(21)強(qiáng)制退出vi,不存盤。實(shí)驗(yàn)步驟見書本P87 2. 用gdb調(diào)試程序中的bug(1)使用vi編輯器將一下代碼輸入到名為greet.c的文件中。此代碼的原意為輸出倒序main函數(shù)中定義的字符串,但結(jié)果顯示沒有輸出。代碼如下所示:(2)使用gcc編譯這段代碼,注意加上“-g”選項(xiàng)以方便之后的調(diào)試;(3)運(yùn)行生成的可執(zhí)行文件,觀察運(yùn)行結(jié)果;
(4)使用gdb調(diào)試程序,通過(guò)設(shè)置斷點(diǎn),單步跟蹤,一步步找出錯(cuò)誤所在;(5)糾正錯(cuò)誤,更改源程序并得到正確結(jié)果; 實(shí)驗(yàn)步驟見書本P88
3. 編寫包含多文件的makefile(1)用vi在同一目錄下編輯兩個(gè)簡(jiǎn)單的hello程序,如下所示:
#hello.c
#include “hello.c”
int main()
{
printf(“Hello everyone!n”);
}
#hello.h
#include
(2)仍在同一目錄下用vi編輯makefile文件,且不使用變量替換,用一個(gè)目標(biāo)體實(shí)現(xiàn),然后用make驗(yàn)證所編寫的makefile是否正確;
(3)仍將上述makefile使用變量替換實(shí)現(xiàn),同樣用make驗(yàn)證所編寫的makefile是否正確;
(4)編輯另一個(gè)makefile,取名為makefile1,不使用變量替換,但用兩個(gè)目標(biāo)體實(shí)現(xiàn)(首先將hello.c和hello.h編譯為hello.o,再將hello.o編譯為hello),再用make的“-f”選項(xiàng)驗(yàn)證這個(gè)makefile的正確性;(5)將上述makefile1使用變量替換實(shí)現(xiàn) 實(shí)驗(yàn)步驟見書本P90 4. 使用autotools生成包含多文件的makefile(1)在原目錄下新建文件夾auto(2)將上例中的兩個(gè)代碼文件“hello.c”和“hello.h”復(fù)制到該目錄下(3)使用autoscan生成configure.scan(4)編輯configure.scan,修改相關(guān)內(nèi)容,并將其重命名為configure.in(5)使用aclocal生成aclocal.m4(6)使用autoconf生成configure(7)使用autoheader生成config.h.in(8)編輯makefile.am(9)使用automake生成makefile.in(10)使用configure生成makefile(11)使用make生成hello可執(zhí)行文件,并在當(dāng)前目錄下運(yùn)行hello查看結(jié)果(12)使用make install將hello安裝到系統(tǒng)目錄下,并運(yùn)行,查看結(jié)果(13)使用make dist生成hello壓縮包(14)解壓hello壓縮包(15)進(jìn)入解壓目錄
(16)在該目錄下安裝hello軟件 實(shí)驗(yàn)步驟見書本P91 三. 實(shí)驗(yàn)結(jié)果截圖
1.實(shí)驗(yàn)一截圖
Linux下的簡(jiǎn)單的運(yùn)用:
圖一 對(duì)inittab文件做完處理后的文件結(jié)果:
圖二
圖三
2.實(shí)驗(yàn)二截圖
第一遍運(yùn)行g(shù)reet.c的結(jié)果:
圖四 用gdb調(diào)試的過(guò)程:
圖五
圖六
圖七
圖八
圖九
3.實(shí)驗(yàn)三截圖 第一次運(yùn)行的結(jié)果
圖十 第一次運(yùn)行makefile的結(jié)果:
圖十一 第二次運(yùn)行makefile的結(jié)果:
圖十二 第一次運(yùn)行makefile1的運(yùn)行結(jié)果:
圖十三 第二次運(yùn)行makefile的運(yùn)行結(jié)果:
圖十四 四. 實(shí)驗(yàn)心得體會(huì)
1.對(duì)于實(shí)驗(yàn)一:
復(fù)習(xí)了linux 下面對(duì)于文件編輯的一些知識(shí)。
2.對(duì)于實(shí)驗(yàn)二:
學(xué)會(huì)了gdb調(diào)試的簡(jiǎn)單運(yùn)用:gdb l()-查看源代碼;gdb b()-設(shè)置斷點(diǎn);gdb info b-查看斷點(diǎn)情況;gdb r-運(yùn)行代碼; gdb n-單步運(yùn)行代碼; gdb p()-查看;gdb c-繼續(xù)運(yùn)行; gab q-退出;對(duì)于以后代碼的改錯(cuò)很有幫助。
3.對(duì)于實(shí)驗(yàn)三:
實(shí)驗(yàn)三是我做的最不開心的一個(gè)了,開始在運(yùn)行makefile,不管怎么樣都是錯(cuò)的,可是檢查卻沒有任何錯(cuò)誤,后來(lái)想起來(lái)以前做makefile的時(shí)候要用tab鍵縮進(jìn)的,這樣之后發(fā)現(xiàn)就可以了。這個(gè)實(shí)驗(yàn)雖然讓我很煩,但是想起了以前學(xué)liunx的好多東西,幫助很大,也覺得以前知識(shí)要常復(fù)習(xí),這樣才不容易忘。
第二篇:實(shí)驗(yàn)三_LINUX的C語(yǔ)言編程
實(shí)驗(yàn)三 LINUX的C語(yǔ)言編程
要求:
1、請(qǐng)查閱資料,掌握vi編輯器的基本使用,包括兩種不同模式的區(qū)別,如何在兩種模式之間切換,以及常用的編輯命令等;
2、使用vi編寫一個(gè)c程序,要求該程序通過(guò)命令行接收用戶的輸入,其輸入?yún)?shù)為FreeBSD系統(tǒng)中的任意文本文件,接收輸入后,c程序讀取該文件內(nèi)容,并打印在屏幕上。編輯好后,存為.c文件(如a.c),使用gcc編譯該文件,運(yùn)行結(jié)果文件。
3、詳細(xì)記錄學(xué)習(xí)的內(nèi)容和實(shí)驗(yàn)的整個(gè)過(guò)程,包括用到的vi命令,c程序源代碼,gcc命令,以及執(zhí)行結(jié)果文件的命令等;
4、對(duì)整個(gè)實(shí)驗(yàn)過(guò)程進(jìn)行分析總結(jié),給出詳細(xì)步驟;
一:vi編輯器的使用
vi 的兩種命令模式;
Command(命令)模式,用于輸入命令; Insert(插入)模式,用于插入文本;
Visual(可視)模式,用于視化的的高亮并選定正文;
Command 模式是vi或vim的默認(rèn)模式,如果我們處于其它命令模式時(shí),要通過(guò)ESC鍵切換過(guò)來(lái)。
當(dāng)我們按ESC鍵后,接著再輸入:號(hào)時(shí),vi會(huì)在屏幕的最下方等待我們輸入命令; 文件的保存和退出 :w 保存;
:w filename 另存為filename; :wq!保存退出;
:wq!filename 注:以filename為文件名保存后退出; :q!不保存退出;
:x 應(yīng)該是保存并退出,功能和:wq!相同 光標(biāo)移動(dòng)
j 向下移動(dòng)一行; k 向上移動(dòng)一行; h 向左移動(dòng)一個(gè)字符; l 向右移動(dòng)一個(gè)字符;
插入模式(文本的插入)i 在光標(biāo)之前插入; a 在光標(biāo)之后插入;
I 在光標(biāo)所在行的行首插入; A 在光標(biāo)所在行的行末插入;
o 在光標(biāo)所在的行的上面插入一行; O 在光標(biāo)所在的行的下面插入一行;
s 刪除光標(biāo)后的一個(gè)字符,然后進(jìn)入插入模式; S 刪除光標(biāo)所在的行,然后進(jìn)入插入模式; 文本內(nèi)容的刪除操作 x 一個(gè)字符;
#x 刪除幾個(gè)字符,#表示數(shù)字,比如3x; dw 刪除一個(gè)單詞;
#dw 刪除幾個(gè)單詞,#用數(shù)字表示,比如3dw表示刪除三個(gè)單詞; dd 刪除一行;
#dd 刪除多個(gè)行,#代表數(shù)字,比如3dd 表示刪除光標(biāo)行及光標(biāo)的下兩行; 恢復(fù)修改及恢復(fù)刪除操作; u 撤消修改或刪除操作;
查找
/SEARCH 注:正向查找,按n鍵把光標(biāo)移動(dòng)到下一個(gè)符合條件的地方; ?SEARCH 注:反向查找,按shift+n 鍵,把光標(biāo)移動(dòng)到下一個(gè)符合條件的 替換
:s /SEARCH/REPLACE/g 注:把當(dāng)前光標(biāo)所處的行中的SEARCH單詞,替換成REPLACE,并把所有SEARCH高亮顯示;
:%s /SEARCH/REPLACE 注:把文檔中所有SEARCH替換成REPLACE;
:#,# s /SEARCH/REPLACE/g 注:#號(hào)表示數(shù)字,表示從多少行到多少行,把SEARCH替換成REPLACE;
二:編寫程序和編譯程序
先在home文件夾下建立test文件夾,用于自己的程序開發(fā)。
根據(jù)題目要求編寫相應(yīng)程序:
編寫完程序后保存。
使用gcc命令編譯時(shí)發(fā)現(xiàn)如下問題:
后來(lái)上網(wǎng)查找后發(fā)現(xiàn)FreeBSD默認(rèn)不再使用GCC構(gòu)建,使用Clang/LIVM替代GCC作為默認(rèn)的C/C++編譯器。
于是使用clang命令進(jìn)行編譯如下:
得到輸出文件后,再新建一個(gè)test.txt文件用于測(cè)試。然后執(zhí)行可執(zhí)行文件:./a.out
由上可以看出,在執(zhí)行編譯命令后我并沒有指定輸出文件的類型和名稱,a.out為默認(rèn)輸出的名稱和類型,可以使用clang a.c –o test來(lái)生成不同類型和名稱的輸出文件。另外看到提示是輸入文件的路徑,如果是當(dāng)前文件下的文件,則可以只輸入文件的相對(duì)路徑,如果在別的文件夾下則需要輸入文件的絕對(duì)路徑。如使用#cp /home/test/test.txt /home/test2.txt復(fù)制一個(gè)文件到別的目錄后讀取。測(cè)試如下:
三:程序源代碼
#include
char path[20];//文件路徑字符串
char msg[100];//讀入數(shù)據(jù)緩存區(qū)
printf(“please enter the path of your filern”);//輸出提示
scanf(“%s”,path);//獲取文件路徑
file = fopen(path);//打開文件
while(fgets(msg,sizeof(masg)-1,file)!=NULL)//逐行讀取文件 直到文件末 { printf(“%s”,msg);//輸出讀取到的文件內(nèi)容 } fclose(file);//關(guān)閉文件 return 0;//返回 } 四:實(shí)驗(yàn)總結(jié)和分析
本次實(shí)驗(yàn)首次使用vi編輯器編寫了一段代碼,并成功的編譯并運(yùn)行。首先說(shuō)一下vi編輯器的使用感受,和window不太一樣,它有不同的模式,只有在特定的模式下才能執(zhí)行相應(yīng)的命令或者操作。而且我發(fā)現(xiàn)了另一個(gè)很好用的ee編輯器,使用這個(gè)編輯器可以很方便的進(jìn)行文件的操作,主要是它有很豐富的提示。但是為什么vi編輯器是大家常談的呢?主要是vi編輯器體積小巧,功能強(qiáng)大,雖然在大的系統(tǒng)工程方面不太好用,但是正常的使用來(lái)說(shuō)還是足夠的,幾乎所有的類似操作系統(tǒng)都會(huì)裝有這一編輯器,學(xué)會(huì)vi編輯器的使用可以使自己在沒有別的編輯器的情況下還能進(jìn)行文件的編輯和系統(tǒng)的配置。這樣對(duì)于日后的開發(fā)有很大的好處。另外在發(fā)現(xiàn)FreeBSD中沒有安裝gcc時(shí),我嘗試過(guò)給器安裝一個(gè)gcc編輯器,但是卻失敗了,截圖如下(圖1),希望通過(guò)后面的學(xué)習(xí)安裝上去。
圖1:安裝gcc編譯器失敗
另外我又進(jìn)行了多文件結(jié)構(gòu)的和多控制臺(tái)的測(cè)試。就是通過(guò)多個(gè)控制臺(tái)分別編寫多個(gè)文件,最后統(tǒng)編譯鏈接成一個(gè)可執(zhí)行文件,這樣可以大致模仿出ADE的編輯環(huán)境,進(jìn)行多個(gè)文件的編寫。
第三篇:實(shí)驗(yàn)二語(yǔ)言與C語(yǔ)言混合編程
實(shí)驗(yàn)二匯編語(yǔ)言與C語(yǔ)言混合編程
一、教學(xué)目的和要求
?
? 熟悉ADS1.2開發(fā)環(huán)境編譯、下載、調(diào)試程序的基本過(guò)程; 掌握C和匯編語(yǔ)言混合編程方法。
掌握ATPCS中的寄存器及參數(shù)傳遞規(guī)則。?
二、實(shí)驗(yàn)內(nèi)容
1、分別編寫C程序和匯編程序,要求在C程序中調(diào)用匯編程序?qū)崿F(xiàn)字符串拷貝功能。C程序中設(shè)定源字符串及目的字符串;匯編程序?qū)崿F(xiàn)拷貝功能。
2、分別編寫C程序和匯編程序,要求在匯編程序中調(diào)用C程序?qū)崿F(xiàn)4個(gè)整型數(shù)的求和運(yùn)算。匯編程序?qū)崿F(xiàn)變量的賦值及C函數(shù)的調(diào)用;C程序?qū)崿F(xiàn)求和運(yùn)算。
3、編寫C程序內(nèi)嵌匯編語(yǔ)句,對(duì)兩個(gè)整型數(shù)a、b進(jìn)行求和運(yùn)算,和值存放到變量c中。
(1)要求main()函數(shù)完成變量賦值及a、b、c數(shù)值信息輸出;內(nèi)嵌匯編語(yǔ)句實(shí)現(xiàn)求和計(jì)算。
(2)要求C程序中main()函數(shù)完成變量賦值及a、b、c信息打印,add()函數(shù)實(shí)現(xiàn)加法
運(yùn)算;main()函數(shù)中的內(nèi)嵌匯編調(diào)用C函數(shù)add()進(jìn)行求和運(yùn)算。
三、思考題
1、什么是ATPCS?它有哪些規(guī)則?
2、C程序調(diào)用匯編程序需要進(jìn)行哪些設(shè)置?參數(shù)如何傳遞?
3、匯編程序調(diào)用C程序需要進(jìn)行哪些設(shè)置?參數(shù)如何傳遞?
4、C程序中內(nèi)嵌的匯編語(yǔ)句有何限制?用什么關(guān)鍵字表示內(nèi)嵌匯編?
第四篇:C語(yǔ)言編程
#include(stdio.h)
main()
{ int question[4]={-1,-1,-1,-1},i=0,j=0,k=0,A=0,B=0,answer[4]={0};
char again='y';
while(again=='y'){ srand((int)time(0));
while(i4){ k=(int)rand()%10;
for(j=0;ji;j++)if(k==question[j]){ k=-1;break;}
if(k==-1)continue;question[i]=k;i++;}/*while i*/
for(i=8;i0;i--)/*還有8次機(jī)會(huì)*/
{ A=0;B=0;printf(“n你還剩下%d次機(jī)會(huì)。”,i);
printf(“n請(qǐng)輸入四個(gè)0-9之間的數(shù)字,中間用空格隔開n”);for(j=0;j4;j++)scanf(“%d”,&answer[j]);
for(j=0;j4;j++)
for(k=0;k4;k++)
{ if(answer[j]==question[k]){ if(j==k)A++;else B++;} }/*for*/
if(A==4){ again='0';
printf(“n你贏了,還繼續(xù)猜嗎?(y/n)”);
while(again!='y'&&again!='n')
scanf(“...%c”,&again);break;}/*if*/
printf(“n%dA%dB”,A,B);if(i==1){ again='0';
printf(“n你輸了,正確答案是”);
for(j=0;j4;j++)
printf(“%dt”,question[j]);
printf(“n還繼續(xù)嗎?(y/n)”);
while(again!='y'&&again!='n')scanf(“%c”,&again);
printf(“%c”,again);break;}/*if*/ }/*for changce*/ }/*while again*/ printf(“感謝您玩這個(gè)游戲。”);}
第五篇:實(shí)驗(yàn)四 Linux下的C語(yǔ)言編程以及GCC工具的使用
實(shí)驗(yàn)四 Linux下的C語(yǔ)言編程以及GCC工具的使用
【實(shí)驗(yàn)?zāi)康摹苛私釲inux下的用戶管理機(jī)制,熟練掌握Linux下的C語(yǔ)言編程以及GCC工具的使用。
【預(yù)備知識(shí)】復(fù)習(xí)C/C++語(yǔ)言的基本技能、用戶管理知識(shí)和GCC使用的內(nèi)容。
【實(shí)驗(yàn)要求】Linux系統(tǒng)管理的一項(xiàng)重要工作就是用戶管理。用戶的口令以加密的形式存儲(chǔ)在/etc/shadow文件中.弱口令就是很容易被猜出來(lái)的口令,比如與用戶名相同的口令、常用的單詞口令等。管理員應(yīng)該定期檢測(cè)系統(tǒng)中是否存在弱口令。試編寫一個(gè)C語(yǔ)言程序,主動(dòng)檢查自己的Linux系統(tǒng)中是否存在弱口令。
【實(shí)驗(yàn)步驟】
1)分析/etc/shadow文件的格式??梢圆榭醋约旱南到y(tǒng)中該文件的格式,根據(jù)8.1節(jié)的介紹,該文件的每一行對(duì)應(yīng)一個(gè)用戶,下面是一個(gè)系統(tǒng)中/etc/shadow文件的實(shí)例:root:$1$j33ff543SWQ/C7Swn6jR9xyfoEcLaS.:12912:0:99999:7:::bin:*:12834:0:99999:7:::
daemon:*:12834:0:99999:7:::
2)了解Linux下口令加密的原理。
口令的加密是使用Linux系統(tǒng)的crypt函數(shù)實(shí)現(xiàn)的。使用info或者man可以了解該命令的工作原理。它使用包含12個(gè)字符的字符串作為種子salt,將用戶輸入的口令key進(jìn)行加密pwd=crypt(key.salt),將所得的包含34個(gè)字符的字符串存入,etc,shadow文件的第2個(gè)字段,這34個(gè)字符的前12個(gè)就是salt。當(dāng)給用戶設(shè)置口令時(shí),種子是由系統(tǒng)隨機(jī)選取的。
當(dāng)用戶在登錄界面中輸入自己的口令時(shí),系統(tǒng)使用crypt進(jìn)行上述計(jì)算,如果所得的結(jié)果與/etc/shadow中存儲(chǔ)的一致,則允許用戶登錄。
3)檢查弱口令。弱口令就是很容易被猜出來(lái)的口令。比如admin、guest、fllower、123456、beauty等。在口令猜測(cè)或者破解時(shí),一般不會(huì)窮盡所有字符的所有排列組合,一般使用弱口令字典,字典中包含常被用來(lái)作為口令的字符串??梢缘骄W(wǎng)上查找弱口令字典。
下面介紹弱口令檢查的原理。對(duì)每個(gè)用戶而言,逐個(gè)將經(jīng)常被作為口令的詞,使用crypt做加密,如果加密結(jié)果與/etc/shadow所存儲(chǔ)的內(nèi)容相同,則口令被猜出來(lái)。
4)用C語(yǔ)言編寫實(shí)現(xiàn)口令檢查,關(guān)鍵部分的代碼如下。通過(guò)讀取,etc/shadow的每一行,獲得一個(gè)關(guān)于
用戶的數(shù)據(jù)結(jié)構(gòu),存放在pwd中。
char saltstr[13];//存放種子
saltstr[13]=’\0’;
strncpy(saltstr,pwd->pw_passwd,12);//將口令的前12個(gè)字符作為種子 cp=crypt(guess,saltstr);//加密
if(strncmp(cp,pwd->pw_passwd,34))//與存儲(chǔ)的不一致
return(0);
Printf(“Warninq!Password Problem:Guessed:\t%s\tpasswd:%s\n”,pwd->pw-name,guess);//找到口令,顯示信息
5)編譯運(yùn)行,命令為:
gcc-o passchk pass.c-Icrypt
6)執(zhí)行口令檢查程序。