Linux下c語言編程實驗講義_第1頁
Linux下c語言編程實驗講義_第2頁
Linux下c語言編程實驗講義_第3頁
Linux下c語言編程實驗講義_第4頁
Linux下c語言編程實驗講義_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

課程名:Linux下c語言編程專業(yè):08嵌入式系統(tǒng)工程專

試驗1:Linux系統(tǒng)基本shell指令試驗2:gee編譯器與多文件交叉包含

試驗3:庫文件的創(chuàng)立與使用試驗4:linux系統(tǒng)程序調(diào)試一行列式求值程序

試驗5:進程與線程程序調(diào)試試驗6:TCP程序與

試驗7:UDP程序試驗1Linux系統(tǒng)基本shell指令

實驗一Linux系統(tǒng)基本文件操作試驗目的:

掌握Linux系統(tǒng)常見的文件操作指令;掌握Linux系統(tǒng)常見的文件形式;

試驗設(shè)備PC機、虛擬機、redhat9,桌面環(huán)境KDE

試驗原理一、Linux系統(tǒng)常見的文件形式

(-)為便于用戶識別文件形式,操作系統(tǒng)一般使用擴展名來標示文件類型。文件擴展名

是文件名的最后一個點之后的局部(在文件sneakers.txt中,“txt”是文件的擴展名)。下面簡單列

出了一些文件擴展名和它們的含義:

1.壓縮的和歸檔的文件.bz2—使用bzip2壓縮的文件

gz—使用gzip壓縮的文件.lar—使用lar(tapearchive,磁帶歸檔的簡寫)壓縮的文件,乂稱

tar文件

.tbz一用tar和bzip壓縮的文件Igz一用tar和gzip壓縮的文件

.zip-使用ZIP壓縮的文件,在MS-DOS應用程序中常見。多數(shù)為Linux壓縮的文件使用gzip壓

縮,因此Linux文件中的.zip歸當較少見。

2.文件格式,au一音頻文件

,gif—GIF圖像文件.html/.htm—HTML文件

Jpg—JPEG圖像文件.pdf一文檔的電子映像;PDF代表PortableDocumentFormat「可移植文檔

格式)

.png-PNG圖像文件(PortableNetworkGraphic的簡寫,可移植網(wǎng)絡(luò)圖形).ps-PostScript文件,

為打印而格式化過的文件

,txt—純ASCII文本文件.wav一音頻文件

.xpm—圖像文件unsignedinti,j,k;

TypeT=O,t:Type*p=NULL;

if(n<=1)return(*a)*n;p=(Type*)malloc(sizeof(Type)*(n-1)*(n-1));

if(!p){puts("Err");return0:}for(i=0,t=l;i<n;i++,t*=-l){JZyzs(p,a,n,0,i);

#iRiefMUCH_ZEROif(a[i])

#endif(

T+=(HLSabsDigui(p,n-1)*t*a[i]);}

)free(p);returnT;

intmain()(

Typea[400]={8,1,-51,9,-3。-6,-5,2,-1,204-7,6};

intn=4;

clock_tstart,end;

clrscr();

start=clock();

printf("\n#%d\n",HLSabsDigui(a,n));

end二clock。;

printf(,%lf\n%f\nH,(end-start)/CLK_TCK,(end-start)/CLK_TCK);

getch();}

試驗報告要求:

單步運行程序,分析程序執(zhí)行過程,寫出程序流程圖試驗4進程與線程程序調(diào)試

試驗FI的:通過程序清晰進程與線程的概念;試驗器材:PC機、redhat9,kde

試驗過程

(1)進程程序如下:

#include<sys/lypes.h>#includc<stdio.h>

#include<unistd.h>intinain(voidj(

pid_lpid;

unsignedlongi;

intj=prinlf(',jububianliang\n");

for(i=0;i<100000000;i++)

if((pid=fork())<0)

{printfC,forkerror!\n〃);

exit(l);

)

elseif(pid==O)

{printfC,ChiklprocessisprintingAnz,);

1

else

{printf(z,Paren(processisprintingAn,z);

Icxit(0);

提示:調(diào)節(jié)循環(huán)次數(shù),使循環(huán)次數(shù)接近系統(tǒng)默認時間片輪轉(zhuǎn)時間,查看父進程和子進程不同次序

的輸出情況。

(2)線程

線程(thread)技術(shù)早在60年代就被提出,但真正應用多線程到操作系統(tǒng)中去,是在80年

代中期,Solaris是這方面的佼佼者。傳統(tǒng)的Unix也支持線程的概念,但是在一個進程

(process)中只允許有一個線程,這樣多線程就意味著多進程?,F(xiàn)在,多線程技術(shù)已經(jīng)被許多

操作系統(tǒng)所支持,包括Windows/NT,當然,也包括Linux。

為什么有了進程的概念后,還要再引入線程呢?使用多線程到底有哪些好處?什么的系統(tǒng)

應該選用多線程?我們首先必須回答這些問題。

使用多線程的理由之一是和進程相比,它是i種非?!肮?jié)儉”的多任務(wù)操作方式。我們知

道,在Linux系統(tǒng)下,啟動一個新的進程必須分配給它獨立的地址空間,建立眾多的數(shù)據(jù)表來維

護它的代碼段、塘棧段和數(shù)據(jù)段,這是一種“昂貴”的多任務(wù)工作方式。而運行于一個進程中的

多個線程,它們彼此之間使用相同的地址空間,共享大部分數(shù)據(jù),啟動一個線程所花費的空間遠

遠小于啟動一個進程所花費的竺間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所

需要的時間。據(jù)統(tǒng)計,總的說來,一個進程的開銷大約是一個線程開銷的30倍左右,當然,在具

體的系統(tǒng)上,這個數(shù)據(jù)可能會有較大的區(qū)別。

使用多線程的理由之二是線程間方便的通信機制。時不同進程來說,它們具有獨立的數(shù)據(jù)空

間,要進行數(shù)據(jù)的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便。線程那么

不然,由于同一進程下的線程之間共享數(shù)據(jù)空間,所以一個線程的數(shù)據(jù)可以直接為其它線程所用,

這不僅快捷,而且方便。當然,數(shù)據(jù)的共享也帶來其他一些問題,有的變量不能同時被兩個線程

所修改,有的子程序中聲明為static的數(shù)據(jù)更有可能給多線程程序帶來災難性的打擊,這些正是

編寫多線程程序時最需要注意的地方。

除了以上所說的優(yōu)點外,不和進程比擬,多線程程序作為一種多任務(wù)、并發(fā)的工作方式,當

然有以下的優(yōu)點:

1)提高應用程序響應。這對圖形界面的程序尤其有意義,當一個操作耗時很長時,整個系統(tǒng)

都會等待這個操作,此時程序不會響應鍵盤、鼠標、菜單的操作,而使用多線程技術(shù),將耗時長

的操作(timeconsuming)置于一個新的線程,可以防止這種尷尬的情況。

2)使多CPU系統(tǒng)更加有效。操作系統(tǒng)會保證當線程數(shù)不大于CPU數(shù)目時,不同的線程運行

于不同的CPU上。

3)改善程序結(jié)構(gòu)。一個既長乂復雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的

運行局部,這樣的程序會利于理解和修改。

下面我們先來嘗試編寫一個簡單的多線程程序。

2簡單的多線程編程

Linux系統(tǒng)卜的多線程遵循POSIX線程接11,稱為pthreack編寫Unux卜的多線程程序,需要

使用頭文件pthread.h,連接時需要使用庫libpthread.a。順便說一下,Linux卜pthread的實現(xiàn)是通過

系統(tǒng)調(diào)用clone。來實現(xiàn)的。clone()是Linux所特有的系統(tǒng)調(diào)用,它的使用方式類似fork,關(guān)于clone

()的詳細情況,有興趣的讀者可以去查看有關(guān)文檔說明。下面我們展示一個最簡單的多線程程序

examplel.Co

/*example.c*/

include<stdio.h>

#include<pthread.h>

voidthread(void)

inti;

for(i=0;i<3;i++)

printf(HThisisapthreadAn0);

)

intmain(void)

(

pthread_tid;

inti,ret;

ret=pthread_create(&id,NULL,(void*)thread,NULL);

if(ret!=O){

printf("Createpthreaderror!\n");

exit(1);

)

for(i=0;i<3;i++)

printf("ThisisthemainprocessAn");

pthreadJoin(id,NULL);

return(0);

)

我們編譯此程序:

gccexamplel.c-Ipthread-oexamplel

試驗報告要求;寫出進程和線程的調(diào)試程序

試驗5:庫文件的創(chuàng)立與使用

試驗目的:掌握庫文件工作的原理,庫文件的創(chuàng)立和使用方法

試驗器材:

試驗原理:

一、為什么要使用庫文件我們在實際編程工作中肯定會遇到這種情況:有幾個工程里有一些函數(shù)

模塊的功能相同,實現(xiàn)代碼也相同,也是我們所說的重復代碼。比方,很多工程里都有一個用戶

驗證的功能。代碼段如下:

〃UserLogin.h文件,提供函數(shù)聲明

intlsValidllser(char*username,intnamelen);

〃UserLogin.c文件,實現(xiàn)疝用戶信息的驗證

intlsValidllscr(char*username,intnamclcn)

(

intIsValid=0;

/*下面是具體的處理代碼,略去*/

returnIsValid

)

如果每個工程都保存著這兩個UserLogin.h和UserLogin.c文件,會有以下幾個弊端:

1、每個工程里都有重復的模塊,造成代碼.重復。

2、代碼的重用性不好,一旦IsValidUser的代碼發(fā)生了變化,為了保持設(shè)計的一致性,我們

還要手工修改其他工程里的UserLogin.c文件,既費時又費力,還容易出錯。庫文件就是對公共

代碼的一種組織形式。

為了解決上面兩個弊端,就提出了用庫文件存放公共代碼的解決方案,其要點就是把公共的

(也就是可以被屢次狂用的)目標代碼從工程中別離出來,統(tǒng)一存放到庫文件中,工程要用到這些

代碼的時候,在編譯或者運行的時候從庫文件中取得目標代碼即可。庫文件又分兩種:靜態(tài)庫和

動態(tài)庫。

二、靜態(tài)庫與動態(tài)庫

如果程序是在編譯時加載庫文件的,就是使用了靜態(tài)庫。如果是在運行時加載目標代碼,就

成為動態(tài)庫.換句話說,如果是使用靜態(tài)庫,那么靜態(tài)庫代碼在編譯時就拷貝到了程序的代碼段,

程序的體積會膨脹。如果使用動態(tài)庫,那么程序中只保存庫文件的名字和函數(shù)名,在運行時去查

找?guī)煳募秃瘮?shù)體,程序的體枳基本變化不大。

靜態(tài)庫的原那么是“以空間換時間”,增加程序體積,減少運行時間;

動態(tài)庫那么是“以時間換空間”,增加了運行時間,但減少了程序本身的體積。

下面我們就以實際例子來看看如何使用這兩種庫.

三、靜態(tài)庫的編寫和使用I、概述

靜態(tài)庫文件的擴展名一般為a其編寫步驟很簡單。

⑴編寫函數(shù)代碼⑵編譯生成各目標文件

⑶用ar文件對目標文件歸檔,生成靜態(tài)庫文件。

注意歸檔文件名必須以lib打頭。

使用要點:

⑴在gcc的-I參數(shù)后加上靜態(tài)庫頭文件的路徑。

⑵在gcc的?L參數(shù)后加上庫文件所在目錄

⑶在gcc的參數(shù)后加上庫文件名,但是要去掠lib和.a擴展名。

比方庫文件名是libtest.a那么參數(shù)就是-1test2、編寫最簡單的靜態(tài)庫文件

編寫如下兩個文件,注意放在同一目錄中

myalib.h〃靜態(tài)庫頭文件

myalib.c〃靜態(tài)庫實現(xiàn)文件

//myalib.h文件的內(nèi)容voidtest();〃myalib.c文件的內(nèi)容

#inlcude<stdio.h>voidtest()(

printf("lest\nM);l

3、制作庫文件⑴生成目標文件

gcc-cmyalib.c執(zhí)行完后會生成一個myalib.o文件

⑵用ar命令歸檔,格式為ar-rc(生成的檔案文件名,v.o文件名列表,再次提醒,歸檔文件名一定

要以lib打頭,.a結(jié)尾。

ar-rclibtest.amyalib.o執(zhí)行完后會生成一個libtest.a文件

4、使用庫文件⑴編寫一個測試程序main?內(nèi)容為

//main.c測試靜態(tài)庫調(diào)用的程序我區(qū)也加,myalib.h"〃要把函數(shù)的頭文件包含進來,否則編譯時會

報錯

in(main(intargc,char*argv[])(test();

return0;)

⑵編譯目標文件,注意要把靜態(tài)庫頭文件的路徑加到-I參數(shù)里面

gcc-I/root/exercise-omain.o-cmain.c現(xiàn)在生成了一個main.o文件

⑶生成可執(zhí)行文件,注意要把靜態(tài)庫文件的路徑加到-L參數(shù)里面,把庫

文件名(去掉打頭的lib和結(jié)尾的.a)加到-1參數(shù)后面。如卜面所示gcc-o

main-L/root/exercisemain.o-Itest此時就會生成一個名為main的可執(zhí)行文

件另外,注意參數(shù)好象應該加到輸入文件名的后面,否則會報錯。

比方gcc-omain-L/root/exercise-Itestmain.o就會提示main.o(.text+Oxl1):

Infunction'main':

:undefinedreferenceto'test'

collect2:IdreturnedIexitstatus⑷執(zhí)行可執(zhí)行文件查看效果

執(zhí)行./main,輸出

:est

說明執(zhí)行成功。

四、動態(tài)庫的編寫1、概述

動態(tài)庫一般以.so結(jié)尾,就是sharedobject的意思.

其基本生成步驟為

⑴編寫函數(shù)代碼

⑵編譯生成動態(tài)庫文件,要加上-shared和-fpic選項,

庫文件名以lib開頭,以.so結(jié)尾。

使用方式分為兩種:隱式調(diào)用和顯示調(diào)用

隱式調(diào)用類似于靜態(tài)庫的使用,但需修改動態(tài)鏈接庫的配置文件/eWId.so.conf;

顯示調(diào)用那么是在主程序里使用dlopen、dlsyrrisdlerrordlclose等系統(tǒng)函數(shù)。

具體的調(diào)用方式會在〃五、動態(tài)庫的調(diào)用”中詳細說明.

2、編寫最簡單的動態(tài)庫文件

為了便于對照,我們?nèi)匀徊捎渺o態(tài)庫中的文件做例子.

編寫如下兩個文件,注意放在同一目錄中

myalib.h〃靜態(tài)庫頭文件

myalib.c"靜態(tài)庫實現(xiàn)文件

//myalib.h文件的內(nèi)容voidtest();

//myalib.c文件的內(nèi)容#inlcude<stdio.h>

voidtcst()(

printf("test\n");)

3、編譯生成動態(tài)庫,庫文件名以lib開頭,以.s。結(jié)尾。

gcc-fpic-shared-olibtcst.somyalib.c此時就生成一個libtest.so文件

五、動態(tài)庫的隱式調(diào)用隱式調(diào)用的含義是代碼里不出現(xiàn)庫文件名,就是說這個代碼和

調(diào)用靜態(tài)庫的代碼是類似的。

I、編寫測試文件//main.c測試動態(tài)庫隱式調(diào)用的程序

include"myalib.h"〃要把函數(shù)的頭文件包含進來,否則編譯時會報錯

intmain(in(argc,char*argv(J;(

:est();

return0;2.編譯測試程序,與靜態(tài)庫類似,要把頭文件的路徑加到-I參數(shù)里面gcc-I

/rooVexercise-omain.o-cmain.c

現(xiàn)在生成了一個main.。文件3、連接生成測試程序

gcc-omain-L/root/exercisemain.o-Itest現(xiàn)在生成了一個main文件

4、執(zhí)行測試程序./main此時出現(xiàn)提示

./main:errorwhileloadingsharedlibraries:libtest.so:cannotopensharedobjectfile:Nouchfileor

directoryo

這個原因就是程序運行時并不知道動態(tài)庫所在的路徑,因此自然找不到。

解決這個問題的方法有三種。見下節(jié)六、使動態(tài)庫被系統(tǒng)共享的三種方法

(再次說明:本節(jié)參考了計算機世界網(wǎng)雨亦奇的文章”LINUX動態(tài)鏈接庫高級應用”地址)(1)

拷貝動態(tài)鏈接庫到系統(tǒng)共享目錄下,或在系統(tǒng)共享目錄下為該動態(tài)鏈接庫建立連接(硬連接

或符號連接均可.,常用符號連接).這里說的系統(tǒng)共享目錄,指的是LINUX動態(tài)鏈接庫存放

的目錄,包括

/lib,/usr/lib以及文件內(nèi)所列的?系列目錄.

(2)將動態(tài)鏈接庫所在目錄名追加到動態(tài)鏈接庫配置文件中.

#pwd?Idconfig

此時再執(zhí)行main,即可成功.

⑶利用動態(tài)鏈接庫管理命令I(lǐng)dconfig,強制其搜索指定目錄,并更新緩存文件,便于動態(tài)裝入.

#Idconfig'pwd'

試驗6:TCP程序與UDP程序

試驗目的:掌握TCP程序和UDP程序的不同編寫方法試驗器材:PC機器、rcdhatyKDE

試驗原理:

TCP服務(wù)器端的編寫步驟:

1.首先,你需要創(chuàng)立一個用于通訊的套接口,一般使用socket調(diào)用來實現(xiàn)。這等于你有了

一個用于通訊的:)

2.然后,你需要給你的套接口設(shè)定端口,相當于,你有了號碼。這一步一般通過設(shè)置網(wǎng)

絡(luò)套接口地址和調(diào)用bind函數(shù)來實現(xiàn)。

3.調(diào)用listen函數(shù)使你的套接口成為一個監(jiān)聽套接字。以上三個步驟是TCP服務(wù)器的常用

步驟。

4.調(diào)用accept函數(shù)來啟動你的套接字,這時你的程序就可以等待客戶端的連接了。

5.處理客戶端的連接請求。

6.終止連接。

現(xiàn)在讓我們來看看網(wǎng)絡(luò)程序客戶端的編程步驟:

1.和服務(wù)器的步驟一樣。

2.通過設(shè)置套接口地址結(jié)溝,我們說明,客戶端要與之通訊的服務(wù)器的IP地址和端II。

3.調(diào)用connect函數(shù)來連接服務(wù)器。

4.發(fā)送或者接收數(shù)據(jù),一般使用send和recv函數(shù)調(diào)用來實現(xiàn)。

5.終止連接。

Tcp程序如下:

intmain(intargc,char*argv[])

(

intlistensock,connsock;/定義兩個socket套接字,一個用于監(jiān)聽,一個用于通訊struct

sockaddrjnserveraddr;/定義網(wǎng)絡(luò)套接字地址結(jié)構(gòu)

constcharbuff[]="Hello!Welcomehere!\r\n";/定義要發(fā)送的數(shù)據(jù)緩沖區(qū);

listensock=socket(AF」NET,SOCK_STREAMzO);/創(chuàng)立一個套接字,用于監(jiān)聽

bzero(&serveraddr,sizeof(servaddij);/地址結(jié)構(gòu)清零serveraddr.sinfamily=AF」NET;/指定使用

的通訊協(xié)議族

serveraddr.sinaddr.s_addr=htonl(INADDRANY);/指定接受任何連接,因為服務(wù)器不知道誰

會要求連接

serveraddr.sin_port=htons(5000);/指定監(jiān)聽的端口

bind(listensockz(sockaddr*)&serveraddr.sizeof(serveraddr));/給套接口邦定地址

listen(listensock,1024);/開始監(jiān)聽

connsock=accept(listensock,(sockaddr*)NULL,NULL);/建立通訊的套接字,accept函數(shù),等待客

戶端程序使用connect函數(shù)的連接

send(connsock2butf,sizeof(bLtf)z0);/向客戶端發(fā)送數(shù)據(jù)

close(connsock);/關(guān)閉通訊套接字

close(listensock);/關(guān)閉監(jiān)聽套接字

}

這是客戶端的程序:

intmain(intargczchar**argv)

charrecvbuff[100];/定義要接收的數(shù)據(jù)緩沖區(qū)intsockfd;/定義?個socket套接字,用于通訊

structsockaddrjnserveraddr;/定義網(wǎng)絡(luò)套接字地址結(jié)構(gòu)if(argc!=2){

printf("Usage:echoip地址”);exit(O);

}sockfd=socket(AF_INET,SOCK_STREAM,0);/創(chuàng)立一個套接字

bzero(&serveraddrzsizeof(serveraddr));

serveraddr.sinjamily=AF_INET;/指定使用的通訊協(xié)議族serveraddr.sin_port=htons(5000);Z

指定要連接的服務(wù)器的端口inet_pton(AF_INETzargv[l]z&serveraddr.sin_addr);

connect(sockfd2(sockaddr*)&serveraddrzSizeof(serveraddr));/連接服務(wù)器

recv(sockfd,recvbuff,sizeof(recvbuff),0);/接收服務(wù)器的數(shù)據(jù)p-intf("%s\n,「ecvbuff);/打印接

收到的數(shù)據(jù)

close(sockfd);/關(guān)閉套接字

}

udp程序如下:

intport=5500;

voidmain()

(

intsockfd;

intcount=0;

intflag;

charbuf[80];

structsockaddrjnaddress;

sockfd=socket(AF_INET,SOCK_DGRAMZ0);〃看到不同的地方了嗎?memset(&address,0,

sizeof(address));

address.sin_family=AF_INET;

address.sin_addr.s_addr=inet_addr("127.0.0.1");

address.sin_port=htons(port);

flag=1;

do{

sprintffbufzTacket%d\n)count);

if(count>30){

sprintf(bufzHover\n");

flag=0;

)

sendto(sockfd,but,sizeof(buf),Obstructsockaddr*)&address,sizeof(address));〃發(fā)現(xiàn)了嗎

使用的函數(shù)不一樣,它也是發(fā)送數(shù)據(jù)count++;

3.系統(tǒng)文件.conf種配置文件。配置文件有時也使用dg。

Jock-鎖(lock)文件;用來判定程序或設(shè)備是否正在被使用.rpm-RedHat用來安裝軟件的軟件

包管理器文件

4.編程和腳本文件C?C程序語言的源碼文件

,cpp-C++程序語言的源碼文件.h—C或C++程序語言的頭文件

.0—程序的對象文件.pl—Perl腳本

.py-Python腳本.so—庫文件

.sh-shell腳本.tel—TCL腳本

文件擴展名不總是被使用或被一致地使用。那么,如果一個文件沒有擴展名,或者它與它的

擴展名不符時怎么辦呢?

這個時候,file命令就會對你有所幫助。

譬如,你找到了一個叫做Saturday的文件、它沒有擴展名。使用file命令,你就可以判定這

個文件的類型:

fileSaturday

(二)為便于系統(tǒng)磁盤和文件系統(tǒng)的管理,Linux系統(tǒng)將所有Linux對目錄和設(shè)備都當作文

件來進行處理,這樣就簡化了對各種不同類型設(shè)備的處理.,提高了效率。Linux中主要的文件類型

分為4種:普通文件、目錄文件、鏈接文件和設(shè)備文件。

(1)普通文件普通文件如同Windows中的文件一樣,是用戶日常使用最多的文件。它包括文本

文件、shell腳本(shell的概念在第2章會進行講解)、二進制的可執(zhí)行程序和各種類型的數(shù)據(jù)。

(2)目錄文件

在Linux中,目錄也是文件,它們包含文件名和子目錄名以及指向那些文件和子目錄的指針。

目錄文件是Linux中存儲文件名的惟一地方,當把文件和目錄相對應起來時,也就是用指針將其

鏈接起來之后,就構(gòu)成了目錄文件。因此,在對目錄文件進行操作時,一般不涉及對文件內(nèi)容的

操作,而只是對目錄名和文件名的對應關(guān)系進行了操作。

(3)鏈接文件

鏈接文件有些類似于Windows中的“快捷方式”,但是它的功能更為強大。它可以實現(xiàn)對不

同的目錄、文件系統(tǒng)甚至是不同的機器上的文件直接訪問,并且不必重新占用磁盤空間。

(4)設(shè)備文件

Linux把設(shè)備都當作文件一樣來進行操作,這樣就大大方便了用戶的使用(在后面的Linux編

程中可以更為明顯地看出)。在Linux下與設(shè)備相關(guān)的文件一般都在/dev目錄下,它包括兩種,一

種是塊設(shè)備文件,另一種是字符設(shè)備文件。

塊設(shè)備文件是指數(shù)據(jù)的讀寫,它們是以塊(如由柱面和扇區(qū)編址的塊)為單位的設(shè)備,最簡

單的如硬盤(/dev/hdal)等。

字符設(shè)備主要是指串行端口的接口設(shè)備。

Linux中的文件屬性

}while(flag);

I

這是接收數(shù)據(jù)的程序:

char*hostname="127.0.0.1";這個特殊的ip表示本的計算機voidmain(){

intsinlen;intport=8080;

charmessage[256];intsockfd;

structsockaddrjnsin;structhostent*server_host_name;//hostent結(jié)構(gòu)有'著機器的名字等信

息server_host_name=gethostbynamef127.0.0.1");//這個函數(shù)用來得到

T27.0.0.「的主機名字,也就是本機的名字

bzero(&sin,sizeof(sin));

sin.sinjamily=AF_INET;

sin.sinaddr.s_addr=htonl(INADDRANY);

sin.sin_port=htons(port);sockfd=socket(PF_INET2SOCKDGRAM20);〃這里也不一樣

bind(sockfdz(structsockaddr*)&sin2sizeof(sin));

while(l){sinlen=sizeof(sin);

recvfrom(sockfd/message,256,0z(structsockaddr*)&sin,&sinlen);"它是接受數(shù)據(jù)的函數(shù)

printf("\nDataccmefromserver:\n%s\n";message);if(strncmp(message2"over"24)

==0)break;)close(sockfd);

)

試驗報告要求:

寫成TCP程序和UDP程序編程的主要不同點

試驗7:復雜C程序調(diào)試一keil試驗Fl的:通過其他編譯調(diào)試工具keil進一步熟悉程序調(diào)試的思

想。試驗儀器:keil,PC機

試驗過程:

利用keil調(diào)試如下代碼:

#include<reg51.h>//intneg=O;

voiddelayns(void)(

inti;

for(i=O;i<1O();i++)l

intgelkeyO(

inti,ml=0,key=0;

P3=0Xfe;

P1=OXFF;

for(i

溫馨提示

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

評論

0/150

提交評論