Linux下c語言編程實驗講義



《Linux下c語言編程實驗講義》由會員分享,可在線閱讀,更多相關《Linux下c語言編程實驗講義(23頁珍藏版)》請在裝配圖網上搜索。
1、課程名:Linux下c語言編程專業:08嵌入式系統工程 專試驗1:Linux系統基本shell指令試驗2:gcc編譯器與多文件交叉包含試驗3:庫文件的創建與使用試驗4:linux系統程序調試行列式求值程序試驗5:進程與線程程序調試試驗6:TCP程序與試驗7:UDP程序試驗1 Linux系統基本shell指令實驗一 Linux系統基本文件操作試驗目的:掌握Linux系統常見的文件操作指令;掌握Linux系統常見的文件形式;試驗設備PC機、虛擬機、redhat9,桌面環境KDE試驗原理一、Linux系統常見的文件形式(一)為便于用戶識別文件形式,操作系統一般使用擴展名來標示文件類型。文件擴展名是文
2、件名的最后一個點之后的部分(在文件 sneakers.txt 中,“txt”是文件的擴展名)。下面簡單列出了一些文件擴展名和它們的含義:1. 壓縮的和歸檔的文件.bz2 使用 bzip2 壓縮的文件.gz 使用 gzip 壓縮的文件.tar 使用 tar(tape archive,磁帶歸檔的簡寫)壓縮的文件,又稱 tar 文件.tbz 用 tar 和 bzip 壓縮的文件.tgz 用 tar 和 gzip 壓縮的文件.zip 使用 ZIP 壓縮的文件,在 MS-DOS 應用程序中常見。多數為 Linux 壓縮的文件使用 gzip 壓縮,因此 Linux 文件中的 .zip 歸檔較少見。 2.
3、文件格式.au 音頻文件.gif GIF 圖像文件.html/.htm HTML 文件.jpg JPEG 圖像文件.pdf 文檔的電子映像;PDF 代表 Portable Document Format(可移植文檔格式) .png PNG 圖像文件(Portable Network Graphic 的簡寫,可移植網絡圖形) .ps PostScript 文件,為打印而格式化過的文件.txt 純 ASCII 文本文件.wav 音頻文件.xpm 圖像文件3. 系統文件.conf 一種配置文件。配置文件有時也使用 .cfg。 .lock 鎖(lock) 文件;用來判定程序或設備是否正在被使用.rpm
4、 Red Hat 用來安裝軟件的軟件包管理器文件4. 編程和腳本文件.c C 程序語言的源碼文件.cpp C+ 程序語言的源碼文件.h C 或 C+ 程序語言的頭文件.o 程序的對象文件.pl Perl 腳本.py Python 腳本 .so 庫文件.sh shell 腳本 .tcl TCL 腳本文件擴展名不總是被使用或被一致地使用。那么,如果一個文件沒有擴展名,或者它與它的擴展名不符時怎么辦呢?這個時候,file 命令就會對你有所幫助。譬如,你找到了一個叫做 saturday 的文件,它沒有擴展名。使用 file 命令,你就可以判定這個文件的類型: file saturday(二)為便于系統
5、磁盤和文件系統的管理,Linux系統將所有Linux 對目錄和設備都當作文件來進行處理,這樣就簡化了對各種不同類型設備的處理,提高了效率。Linux中主要的文件類型分為4種:普通文件、目錄文件、鏈接文件和設備文件。 (1)普通文件 普通文件如同Windows中的文件一樣,是用戶日常使用最多的文件。它包括文本文件、shell腳本(shell的概念在第2章會進行講解)、二進制的可執行程序和各種類型的數據。 (2)目錄文件 在 Linux 中,目錄也是文件,它們包含文件名和子目錄名以及指向那些文件和子目錄的指針。目錄文件是 Linux 中存儲文件名的惟一地方,當把文件和目錄相對應起來時,也就是用指針
6、將其鏈接起來之后,就構成了目錄文件。因此,在對目錄文件進行操作時,一般不涉及對文件內容的操作,而只是對目錄名和文件名的對應關系進行了操作。(3)鏈接文件 鏈接文件有些類似于 Windows 中的“快捷方式”,但是它的功能更為強大。它可以實現對不同的目錄、文件系統甚至是不同的機器上的文件直接訪問,并且不必重新占用磁盤空間。 (4)設備文件 Linux 把設備都當作文件一樣來進行操作,這樣就大大方便了用戶的使用(在后面的Linux編程中可以更為明顯地看出)。在 Linux 下與設備相關的文件一般都在/dev目錄下,它包括兩種,一種是塊設備文件,另一種是字符設備文件。 塊設備文件是指數據的讀寫,它們
7、是以塊(如由柱面和扇區編址的塊)為單位的設備,最簡單的如硬盤(/dev/hda1)等。字符設備主要是指串行端口的接口設備。Linux中的文件屬性Linux中的文件屬性如圖如示。首先,Linux中文件的擁有者可以把文件的訪問屬性設成 3 種不同的訪問權限:可讀(r)、可寫(w)和可執行(x)。文件又有 3 個不同的用戶級別:文件擁有者(u)、所屬的用戶組(g)和系統里的其他用戶(o)。 第一個字符顯示文件的類型: “-”表示普通文件; “d”表示目錄文件; “l”表示鏈接文件; “c”表示字符設備; “b”表示塊設備; “p”表示命名管道比如FIFO 文件(First In First Out,
8、先進先出); “f”表示堆棧文件比如LIFO 文件(Last In First Out,后進先出)。 第一個字符之后有3個三位字符組: 第一個三位字符組表示對于文件擁有者(u)對該文件的權限; 第二個三位字符組表示文件用戶組(g)對該文件的權限; 第三個三位字符組表示系統其他用戶(o)對該文件的權限; 若該用戶組對此沒有權限,一般顯示“-”字符。目錄權限和文件權限有一定的區別。對于目錄而言,r代表允許列出該目錄下的文件和子目錄,w代表允許生成和刪除該目錄下的文件,x代表允許訪問該目錄二、Linux系統常見文件操作指令(一)DOS 和 Linux 常用命令的對比命令的目的MS-DOSLinuxL
9、inux 的簡單實例復制文件Copycpcp thisfile.txt /home/thisdirectory轉移文件Movemvmv thisfile.txt /home/thisdirectory列舉文件DirlsLs清除屏幕ClsclearClear關閉 shell 提示ExitexitExit顯示或設置日期DatedateDate刪除文件Delrmrm thisfile.txt把輸出“回響”到屏幕上Echoechoecho this message用簡單文本編輯器來編輯文件Editgedit(a)gedit thisfile.txt比較文件內容Fcdiffdiff file1 file
10、2在文件中尋找字串Findgrepgrep 詞或詞組 thisfile.txt格式化軟盤format a:(如果軟盤是在 A: 中的話)mke2fs 或 mformat(b)/sbin/mke2fs /dev/fd0(/dev/fd0 是 Linux 中與 A: 等同的驅動器)顯示命令幫助命令 /?man(c)man 命令創建目錄Mkdirmkdirmkdir 目錄查看文件Moreless(d)less thisfile.txt重新命名文件Renmv(e)mv thisfile.txt thatfile.txt顯示你在文件系統中的位置ChdirpwdPwd用指定的路徑(絕對路徑,absolut
11、e path)來改換目錄cd 路徑名cd 路徑名cd /directory/directory用一個相對路徑(relative path)來改換目錄cd .cd .cd .顯示時間TimedateDate顯示已被使用的內存數量MemfreeFree注:a. Gedit 是圖形化文本編輯器;你可以使用其它文本編輯器來代替 Gedit,包括 Emacs 和 vi。b. 這個命令為 DOS 文件系統格式化軟盤。c. 某些命令你還 可以使用 info。d. more 分頁器也可以用來一個屏幕一個屏幕地在文件中逐頁查看。e. mv 命令可以轉移文件或重新命名在同一目錄下的文件。如果你想重新命名文件,如例
12、中所示,把這個文件“轉移”到同一目錄中的新名稱。(二)幾點說明1、關于幫助help命令用于查看所有Shell內置命令的幫助信息。用戶可以通過該命令尋求Shell命令的用法,只需在所查找的命令后輸入help命令,就可以看到所查命令的內容了。 例如:查看cd命令的使用方法。 $ cd -helpman命令用于用于格式化并顯示某一命令的聯機幫助手冊頁。格式:man 選項 命令名如果在用戶是在純文本下登錄,可能幫助信息顯示太快使用戶來不及看清,可使用管道連接指令 如 man gcc |less(使用q退出,可按上下箭頭查看)2、關于ls指令和創建鏈接文件的指令默認情況下,系統不顯示隱藏文件及文件屬性,
13、如果想顯示文件的詳細信息,可以使用如下命令 ls al鏈接文件的指令為:ln -S3、系統管理指令顯示系統進程的指令:ps關閉進程的指令 kill關閉系統的指令 poweroff用戶管理程序 redhat-config-users /KDE/system settings/users and groups系統日志 redhat-logviewer /KDE/system tools/system logs刪除自安裝文件:(1) 查看當時安裝的時候的文件的詳細名字 rmp -qa 查看所有安裝的文件,也可以在系統日志中查看(2) 刪除 rmp -e系統文本登錄方式及圖形用戶方式配置文件/etc/
14、inittab 方式3 命令行登錄;方式5 x-window登錄從X-Windows退出 ctrl +art+backspace從文本方式進入x-window startx4、文件壓縮和歸檔壓縮文件使用較少磁盤空間,并且比未壓縮的大文件下載速度要快。在 Red Hat Linux 中,你可以使用的文件壓縮工具有:gzip、bzip2、和 zip。推薦你使用 bzip2 壓縮工具,因為它提供了最大限度的壓縮,并且可在多數類似 UNIX 的操作系統上找到。gzip 壓縮工具也可以在類似 UNIX 的操作系統上找到。如果你需要在 Linux 和其它操作系統如 MS Windows 間傳輸文件,你應該
15、使用 zip,因為該命令與 Windows 上的壓縮工具最兼容。壓縮工具文件擴展名解壓工具Gzip.gzgunzipbzip2.bz2bunzip2Zip.zipunzip試驗2:makefile創建與使用試驗目的:1、掌握桌面環境KDE的基本使用方法2、掌握KDE代碼編輯器kwrite的基本使用方法3、掌握多源文件編譯鏈接的方式4、掌握makefile的寫法試驗原理(1)多源文件編譯鏈接的方式編譯:狹義的編譯是指將高級語言代碼翻譯成匯編代碼;匯編:狹義的匯編是將匯編代碼翻譯成二進制(機器語言代碼)代碼,對于出現子程序調用的語句,如果該函數是主文件外部實現的,則在主文件匯編的時候,該調用并不真
16、正去實現該調用。鏈接:將各個函數的實現文件所匯編成的機器碼和主程序鏈接到一起。形成最終的可執行文件。頭文件功能:函數類型聲明,全局結構體聲明,宏聲明。(2)makefile的寫法依賴關系:依賴關系主要靠表達符號“:”表示,含義指冒號左側的符號依賴右側的符號,或由右側的符號生成。命令規則:命令規則的第一個符號為TAB符號,一般為編譯匯編指令(gcc)或其他shell指令。當命令規則上面的一條依賴文件出現更新時,系統將執行本行代碼(3)試驗過程使用編輯器kwrite創建相關源文件,各個源文件代碼如下:/main.c#include mytool1.h#include mytool2.h#inclu
17、de int main(void)putchar(n);mytool1_print(hello);mytool2_print(hello);return 0;/mytool1.c#include void mytool1_print(char *psz)printf(this is mytool1 print:%sn,psz);/mytool1.hvoid mytool1_print(char *);/mytool2.c#include void mytool2_print(char *psz)printf(this is mytool2 print:%sn,psz);/mytool2.hvo
18、id mytool2_print(char *);/makefilemain:main.o mytool1.o mytool2.ogcc -o main main.o mytool1.o mytool2.omain.o:main.c mytool1.h mytool2.hgcc -c -g main.cmytool1.o:mytool1.c mytool1.hgcc -c -g mytool1.cmytool2.o:mytool2.c mytool2.hgcc -c -g mytool2.c試驗報告要求寫出各個源文件試驗3:linux系統程序調試行列式求值程序試驗目的:掌握使用gdb調試程序的
19、方法試驗器材:PC機器、redhat9,kde試驗原理(1)程序可以被調試的原因程序編譯的時候,使用特殊的指令在目標文件之間加入特殊的信息,建立程序目標碼和程序源代碼之間的聯系,調試程序利用這些信息控制程序的流程,幫助程序員分析程序實際執行過程與程序員設計執行過程之間的聯系,進而找出程序的錯誤。(2)調試程序的流程1、編程程序的時候使用-g指令,生成調試版程序;2、在gdb中調入調試版程序;3、在程序的起始位置加入斷點 break main4、運行程序5、使用step指令,next指令單步運行程序,使用continue指令運行到程序的下一個斷點,使用display,print指令查看和更改變量
20、的數值,分析程序的實際運行過程和設計過程之間的差別。(3)要調試程序如下:#include stdio.h#include time.h#define MUCH_ZEROtypedef int Type;Type* JZyzs(Type *b,Type *a,int nn,int i,int j ) int m,n,N=nn-1; for(m=0; mi; m+) for(n=0; nj; n+) bm*N+n=am*nn+n; for(; nN; n+) bm*N+n=am*nn+n+1; for(; mN; m+) for(n=0; nj; n+) bm*N+n=am*nn+nn+n; f
21、or(; nN; n+) bm*N+n=am*nn+nn+n+1; return b;Type HLSabsDigui(Type *a, unsigned int n) unsigned int i,j,k; Type T=0,t; Type *p=NULL; if(n=1) return (*a)*n; p=(Type*) malloc(sizeof(Type)*(n-1)*(n-1); if(!p) puts(Err); return 0; for(i=0,t=1; in; i+,t*=-1) JZyzs(p,a,n,0,i); #ifdef MUCH_ZERO if(ai) #endif
22、 T+=(HLSabsDigui(p,n-1)*t*ai); free(p); return T;int main() Type a400=8,1,-5,1,9,-3,0,-6,-5,2,-1,2,0,4,-7,6; int n=4; clock_t start ,end; clrscr(); start=clock(); printf(n# %dn,HLSabsDigui(a,n); end=clock(); printf(%lfn%fn,(end-start)/CLK_TCK,(end-start)/CLK_TCK); getch();試驗報告要求:單步運行程序,分析程序執行過程,寫出程序
23、流程圖試驗4 進程與線程程序調試試驗目的:通過程序清晰進程與線程的概念;試驗器材:PC機、redhat9 ,kde試驗過程(1)進程程序如下:#include #include #include int main(void)pid_t pid;unsigned long i;int j=printf(ju bu bian liangn);for(i=0;i100000000;i+) ;if (pid=fork()0)printf(fork error!n);exit(1);else if(pid=0)printf(Child process is printing.n);elseprintf(
24、Parent process is printing.n);exit(0);提示:調節循環次數,使循環次數接近系統默認時間片輪轉時間,查看父進程和子進程不同次序的輸出情況。(2)線程線程(thread)技術早在60年代就被提出,但真正應用多線程到操作系統中去,是在80年代中期,solaris是這方面的佼佼者。傳統的Unix也支持線程的概念,但是在一個進程(process)中只允許有一個線程,這樣多線程就意味著多進程?,F在,多線程技術已經被許多操作系統所支持,包括Windows/NT,當然,也包括Linux。為什么有了進程的概念后,還要再引入線程呢?使用多線程到底有哪些好處?什么的系統應該選用多
25、線程?我們首先必須回答這些問題。使用多線程的理由之一是和進程相比,它是一種非常節儉的多任務操作方式。我們知道,在Linux系統下,啟動一個新的進程必須分配給它獨立的地址空間,建立眾多的數據表來維護它的代碼段、堆棧段和數據段,這是一種昂貴的多任務工作方式。而運行于一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數據,啟動一個線程所花費的空間遠遠小于啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。據統計,總的說來,一個進程的開銷大約是一個線程開銷的30倍左右,當然,在具體的系統上,這個數據可能會有較大的區別。使用多線程的理由之二是線程間方便
26、的通信機制。對不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便。線程則不然,由于同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接為其它線程所用,這不僅快捷,而且方便。當然,數據的共享也帶來其他一些問題,有的變量不能同時被兩個線程所修改,有的子程序中聲明為static的數據更有可能給多線程程序帶來災難性的打擊,這些正是編寫多線程程序時最需要注意的地方。除了以上所說的優點外,不和進程比較,多線程程序作為一種多任務、并發的工作方式,當然有以下的優點:1) 提高應用程序響應。這對圖形界面的程序尤其有意義,當一個操作耗時很長時,整個
27、系統都會等待這個操作,此時程序不會響應鍵盤、鼠標、菜單的操作,而使用多線程技術,將耗時長的操作(time consuming)置于一個新的線程,可以避免這種尷尬的情況。2) 使多CPU系統更加有效。操作系統會保證當線程數不大于CPU數目時,不同的線程運行于不同的CPU上。3) 改善程序結構。一個既長又復雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程序會利于理解和修改。下面我們先來嘗試編寫一個簡單的多線程程序。2 簡單的多線程編程Linux系統下的多線程遵循POSIX線程接口,稱為pthread。編寫Linux下的多線程程序,需要使用頭文件pthread.h,連接時需要使
28、用庫libpthread.a。順便說一下,Linux下pthread的實現是通過系統調用clone()來實現的。clone()是Linux所特有的系統調用,它的使用方式類似fork,關于clone()的詳細情況,有興趣的讀者可以去查看有關文檔說明。下面我們展示一個最簡單的多線程程序example1.c。 /* example.c*/#include #include void thread(void)int i;for(i=0;i3;i+)printf(This is a pthread.n); int main(void)pthread_t id;int i,ret;ret=pthread_
29、create(&id,NULL,(void *) thread,NULL);if(ret!=0)printf (Create pthread error!n);exit (1);for(i=0;i3;i+)printf(This is the main process.n);pthread_join(id,NULL);return (0); 我們編譯此程序:gcc example1.c -lpthread -o example1試驗報告要求;寫出進程和線程的調試程序試驗5:庫文件的創建與使用試驗目的:掌握庫文件工作的原理,庫文件的創建和使用方法試驗器材:試驗原理:一、為什么要使用庫文件我們在實
30、際編程工作中肯定會遇到這種情況:有幾個項目里有一些函數模塊的功能相同,實現代碼也相同,也是我們所說的重復代碼。比如,很多項目里都有一個用戶驗證的功能。代碼段如下: /UserLogin.h文件,提供函數聲明 int IsValidUser(char* username, int namelen); /UserLogin.c文件,實現對用戶信息的驗證 int IsValidUser(char* username, int namelen) int IsValid = 0; /*下面是具體的處理代碼,略去*/ return IsValid 如果每個項目都保存著這兩個UserLogin.h和User
31、Login.c文件,會有以下幾個弊端: 1、每個項目里都有重復的模塊,造成代碼重復。 2、代碼的重用性不好,一旦IsValidUser的代碼發生了變化,為了保持設計的一致性,我們還要手工修改其他項目里的UserLogin.c文件,既費時又費力,還容易出錯。 庫文件就是對公共代碼的一種組織形式。 為了解決上面兩個弊端,就提出了用庫文件存放公共代碼的解決方案,其要點就是把公共的(也就是可以被多次復用的)目標代碼從項目中分離出來,統一存放到庫文件中,項目要用到這些代碼的時候,在編譯或者運行的時候從庫文件中取得目標代碼即可。庫文件又分兩種:靜態庫和動態庫。二、靜態庫與動態庫 如果程序是在編譯時加載庫文
32、件的,就是使用了靜態庫。如果是在運行時加載目標代碼,就成為動態庫。換句話說,如果是使用靜態庫,則靜態庫代碼在編譯時就拷貝到了程序的代碼段,程序的體積會膨脹。如果使用動態庫,則程序中只保留庫文件的名字和函數名,在運行時去查找庫文件和函數體,程序的體積基本變化不大。 靜態庫的原則是“以空間換時間”,增加程序體積,減少運行時間; 動態庫則是“以時間換空間”,增加了運行時間,但減少了程序本身的體積。 下面我們就以實際例子來看看如何使用這兩種庫.三、靜態庫的編寫和使用1、概述 靜態庫文件的擴展名一般為.a,其編寫步驟很簡單。編寫函數代碼編譯生成各目標文件用ar文件對目標文件歸檔,生成靜態庫文件。 注意歸
33、檔文件名必須以lib打頭。 使用要點: 在gcc 的-I參數后加上靜態庫頭文件的路徑。 在gcc 的-L參數后加上庫文件所在目錄 在gcc 的-l參數后加上庫文件名,但是要去掉lib和.a擴展名。 比如庫文件名是libtest.a 那么參數就是 -l test2、編寫最簡單的靜態庫文件 編寫如下兩個文件,注意放在同一目錄中 myalib.h /靜態庫頭文件 myalib.c /靜態庫實現文件 /myalib.h 文件的內容void test();/myalib.c 文件的內容#inlcude void test() printf(testn);3、制作庫文件生成目標文件gcc -c myali
34、b.c執行完后會生成一個myalib.o文件用ar命令歸檔,格式為ar -rc 再次提醒,歸檔文件名一定要以lib打頭, .a結尾。ar -rc libtest.a myalib.o執行完后會生成一個libtest.a文件4、使用庫文件 編寫一個測試程序main.c,內容為/main.c 測試靜態庫調用的程序#include myalib.h /要把函數的頭文件包含進來,否則編譯時會報錯 int main(int argc,char* argv) test(); return 0; 編譯目標文件,注意要把靜態庫頭文件的路徑加到-I參數里面 gcc -I /root/exercise -o ma
35、in.o -c main.c現在生成了一個main.o文件生成可執行文件,注意要把靜態庫文件的路徑加到-L參數里面,把庫文件名(去掉打頭的lib和結尾的.a)加到-l參數后面。如下面所示gcc -o main -L/root/exercise main.o -ltest此時就會生成一個名為main的可執行文件另外,注意- l參數好象應該加到輸入文件名的后面,否則會報錯。比如gcc -o main -L/root/exercise -ltest main.o就會提示main.o(.text+0x11): In function main: : undefined reference to tes
36、t collect2: ld returned 1 exit status執行可執行文件查看效果 執行./main, 輸出 test 說明執行成功。四、動態庫的編寫1、概述 動態庫一般以.so結尾,就是shared object的意思. 其基本生成步驟為 編寫函數代碼 編譯生成動態庫文件,要加上 -shared 和 -fpic 選項 , 庫文件名以lib開頭, 以.so 結尾。 使用方式分為兩種: 隱式調用和顯示調用 隱式調用類似于靜態庫的使用,但需修改動態鏈接庫的配置文件/etc/ld.so.conf; 顯示調用則是在主程序里使用dlopen、dlsym、dlerror、dlclose等系統
37、函數。 具體的調用方式會在 五、動態庫的調用 中詳細說明.2、編寫最簡單的動態庫文件 為了便于對照, 我們仍然采用靜態庫中的文件做例子. 編寫如下兩個文件,注意放在同一目錄中 myalib.h /靜態庫頭文件 myalib.c /靜態庫實現文件 /myalib.h 文件的內容void test();/myalib.c 文件的內容#inlcude void test() printf(testn);3、編譯生成動態庫 ,庫文件名以lib開頭, 以.so 結尾。gcc -fpic -shared -o libtest.so myalib.c此時就生成一個libtest.so文件五、動態庫的隱式調用
38、隱式調用的含義是代碼里不出現庫文件名,就是說這個代碼和調用靜態庫的代碼是類似的。1、編寫測試文件/main.c 測試動態庫隱式調用的程序#include myalib.h /要把函數的頭文件包含進來,否則編譯時會報錯 int main(int argc,char* argv) test(); return 0; 2、 編譯測試程序,與靜態庫類似,要把頭文件的路徑加到-I參數里面gcc -I /root/exercise -o main.o -c main.c現在生成了一個main.o文件3、連接生成測試程序 gcc -o main -L/root/exercise main.o -ltest現
39、在生成了一個main文件4、執行測試程序./main此時出現提示 ./main: error while loading shared libraries: libtest.so: cannot open shared object file: No uch file or directory。 這個原因就是程序運行時并不知道動態庫所在的路徑,因此自然找不到。 解決這個問題的辦法有三種。見下節六、使動態庫被系統共享的三種辦法 (再次說明: 本節參考了計算機世界網雨亦奇的文章LINUX動態鏈接庫高級應用 地址 (1)拷貝動態鏈接庫到系統共享目錄下,或在系統共享目錄下為該動態鏈接庫 建立連接(硬連
40、接或符號連接均可,常用符號連接).這里說的系統共享目錄, 指的是LINUX動態鏈接庫存放的目錄,包括 /lib,/usr/lib以及/etc/ld.so.conf文件內所列的一系列目錄.(2)將動態鏈接庫所在目錄名追加到動態鏈接庫配置文件/etc/ld.so.conf中.# pwd /etc/ld.so.conf# ldconfig此時再執行main,即可成功.(3)利用動態鏈接庫管理命令ldconfig,強制其搜索指定目錄,并更新緩存文件,便于動態裝入.# ldconfig pwd試驗6:TCP程序與UDP程序試驗目的:掌握TCP程序和UDP程序的不同編寫方法試驗器材:PC機器、redhat
41、9,KDE試驗原理:TCP服務器端的編寫步驟: 1. 首先,你需要創建一個用于通訊的套接口,一般使用socket調用來實現。這等于你有了一個用于通訊的電話:) 2. 然后,你需要給你的套接口設定端口,相當于,你有了電話號碼。這一步 一般通過設置網絡套接口地址和調用bind函數來實現。 3. 調用listen函數使你的套接口成為一個監聽套接字。 以上三個步驟是TCP服務器的常用步驟。4. 調用accept函數來啟動你的套接字,這時你的程序就可以等待客戶端的連接了。 5. 處理客戶端的連接請求。 6. 終止連接。 現在讓我們來看看網絡程序客戶端的編程步驟:1. 和服務器的步驟一樣。 2. 通過設置
42、套接口地址結構,我們說明,客戶端要與之通訊的服務器的IP地址和端口。 3. 調用connect函數來連接服務器。 4. 發送或者接收數據,一般使用send和recv函數調用來實現。 5. 終止連接。Tcp程序如下:int main(int argc,char *argv) int listensock,connsock; /定義兩個socket套接字,一個用于監聽,一個用于通訊struct sockaddr_in serveraddr; /定義網絡套接字地址結構const char buff = Hello! Welcome here!rn; /定義要發送的數據緩沖區; listensock
43、= socket(AF_INET,SOCK_STREAM,0); /創建一個套接字,用于監聽 bzero(&serveraddr,sizeof(servaddr); /地址結構清零 serveraddr.sin_family = AF_INET; /指定使用的通訊協議族serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); /指定接受任何連接,因為服務器不知道誰會要求連接 serveraddr.sin_port = htons(5000); /指定監聽的端口bind(listensock,(sockaddr *)&serveraddr,sizeof(se
44、rveraddr); /給套接口邦定地址 listen(listensock,1024); /開始監聽 connsock = accept(listensock,(sockaddr *)NULL, NULL); /建立通訊的套接字,accept函數,等待客戶端程序使用connect函數的連接send(connsock,buff,sizeof(buff), 0); /向客戶端發送數據 close(connsock); /關閉通訊套接字 close(listensock); /關閉監聽套接字這是客戶端的程序: int main(int argc,char *argv) char recvbuff1
45、00; /定義要接收的數據緩沖區int sockfd; /定義一個socket套接字,用于通訊struct sockaddr_in serveraddr;/定義網絡套接字地址結構if(argc != 2) printf(Usage: echo ip地址); exit(0); sockfd = socket(AF_INET,SOCK_STREAM,0); /創建一個套接字bzero(&serveraddr,sizeof(serveraddr);serveraddr.sin_family = AF_INET; /指定使用的通訊協議族 serveraddr.sin_port = htons(5000
46、);/指定要連接的服務器的端口 inet_pton(AF_INET, argv1, &serveraddr.sin_addr);connect(sockfd,(sockaddr *)&serveraddr,sizeof(serveraddr); /連接服務器recv(sockfd,recvbuff,sizeof(recvbuff),0); /接收服務器的數據printf(%sn,recvbuff); /打印接收到的數據close(sockfd); /關閉套接字udp程序如下:int port = 5500;void main()int sockfd; int count = 0;int fla
47、g;char buf80;struct sockaddr_in address; sockfd = socket(AF_INET, SOCK_DGRAM, 0); /看到不同的地方了嗎?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; dosprintf(buf,Packet %dn, count);if(count 30) sprint
48、f(buf,overn); flag = 0; sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&address, sizeof(address); / 發現了嗎使用的函數不一樣,它也是發送數據 count+; while (flag); 這是接收數據的程序: char *hostname = 127.0.0.1; /這個特殊的ip表示本的計算機 void main() int sinlen; int port = 8080; char message256; int sockfd; struct sockaddr_in sin; stru
49、ct hostent *server_host_name; / hostent結構有著機器的名字等信息 server_host_name = gethostbyname(127.0.0.1); / 這個函數用來得到“127.0.0.1”的主機名字,也就是本機的名字bzero(&sin,sizeof(sin); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_port = htons(port); sockfd = socket(PF_INET,SOCK_DGRAM,0); /這里也不一樣 bi
50、nd(sockfd,(struct sockaddr *)&sin,sizeof(sin); while(1)sinlen = sizeof(sin); recvfrom(sockfd,message,256,0, (struct sockaddr *)&sin,&sinlen);/ 它是接受數據的函數 printf(nData come from server:n%sn,message);if(strncmp(message,over,4) =0)break; close(sockfd); 試驗報告要求:寫成TCP程序和UDP程序編程的主要不同點試驗7:復雜C程序調試keil試驗目的:通過其
51、他編譯調試工具keil進一步熟悉程序調試的思想。試驗儀器:keil,PC機試驗過程:利用keil調試如下代碼:#include /int neg=0;void delayns(void) int i; for(i=0;i100;i+) ;int getkey() int i,m1=0,key=0; P3=0Xfe; P1=0XFF; for(i=0;i4;i+) m1=P1; while(P1!=0XFF) ; switch(m1) case 0xfe: key=16;break; case 0xfd: key=9;break; case 0xfb: key=8;break; case 0xf
52、7: key=7;break; P1=0XFF; P3=0XfD; P1=0XFF; for(i=0;i4;i+) m1=P1; while(P1!=0XFF) ; switch(m1) case 0xfe: key=15;break; case 0xfd: key=6;break; case 0xfb: key=5;break; case 0xf7: key=4;break; P1=0XFF; P3=0XfB; P1=0XFF; for(i=0;i4;i+) m1=P1; while(P1!=0XFF) ; switch(m1) case 0xfe: key=14;break; case 0
53、xfd: key=3;break; case 0xfb: key=2;break; case 0xf7: key=1;break; P1=0XFF; P3=0Xf7; P1=0XFF; for(i=0;i4;i+) m1=P1; while(P1!=0XFF) ; switch(m1) case 0xfe: key=13;break; case 0xfd: key=12;break; case 0xfb: key=10;break; case 0xf7: key=11;break; P1=0XFF; delayns(); return key;void main(void)getkey();試驗報告要求:寫出使用keil調試程序和使用kdb調試程序的相同和不同。
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新DOC
- 濟源市綠色物流項目申請報告參考范文
- 2023年早教中心教師辭職報告.doc
- 濟源市物流業制造業融合創新工程項目可行性報告范文
- 濟源市新產業新產品項目投資分析報告【模板范文】
- 三年數學期末綜合檢測試2(教育精品)
- 瀘水市3D打印用合金粉末項目可行性報告_范文參考
- 瀏陽市關于成立國際國內物流大通道公司策劃方案【模板】
- 瀘水市酒項目可行性分析報告
- 濟源市物流業制造業融合創新工程項目可行性分析報告_模板
- 濟源市新產業新產品項目商業計劃書_模板
- 濟源市社區公共服務項目商業計劃書(模板范本)
- 濟源市物流業制造業融合創新工程項目可行性研究報告_模板范文
- 學生會文藝部干部辭職報告模板.doc
- 濟源市關于成立鐵路物流升級改造工程公司策劃方案_參考范文
- 濟源市新型城鎮化項目可行性報告