江蘇大學(xué)操作系統(tǒng)課程設(shè)計(jì)Linux系統(tǒng)管理實(shí)踐與進(jìn)程通信實(shí)現(xiàn)_第1頁(yè)
江蘇大學(xué)操作系統(tǒng)課程設(shè)計(jì)Linux系統(tǒng)管理實(shí)踐與進(jìn)程通信實(shí)現(xiàn)_第2頁(yè)
江蘇大學(xué)操作系統(tǒng)課程設(shè)計(jì)Linux系統(tǒng)管理實(shí)踐與進(jìn)程通信實(shí)現(xiàn)_第3頁(yè)
江蘇大學(xué)操作系統(tǒng)課程設(shè)計(jì)Linux系統(tǒng)管理實(shí)踐與進(jìn)程通信實(shí)現(xiàn)_第4頁(yè)
江蘇大學(xué)操作系統(tǒng)課程設(shè)計(jì)Linux系統(tǒng)管理實(shí)踐與進(jìn)程通信實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 .PAGE19 / NUMPAGES19操作系統(tǒng)課程設(shè)計(jì)Linux系統(tǒng)管理實(shí)踐與進(jìn)程通信實(shí)現(xiàn)班級(jí)網(wǎng)絡(luò)10 學(xué)號(hào) 31006100姓名YHD 指導(dǎo)老師詹 永 照 二零一三年一月八號(hào)一、設(shè)計(jì)容 1、Linux系統(tǒng)的熟悉與常用操作命令的掌握。2、Linux環(huán)境下進(jìn)程通信的實(shí)現(xiàn)。(實(shí)現(xiàn)父母子女放水果吃水果的同步互斥問(wèn)題,爸爸放蘋果,女兒專等吃蘋果,媽媽放橘子,兒子專等吃橘子,盤子即為緩沖區(qū),大小為5。)二、Linux環(huán)境介紹1、Linux的由來(lái)與發(fā)展Linux是一種可以在PC機(jī)上執(zhí)行的類似UNIX的操作系統(tǒng),是一個(gè)完全免費(fèi)的操作系統(tǒng)。1991年,芬蘭學(xué)生Linux Torvalds開發(fā)了這個(gè)操作系統(tǒng)

2、的核心部分,因?yàn)槭荓inux改良的minix系統(tǒng),故稱之為L(zhǎng)inux。2、Linux的優(yōu)點(diǎn)(1)Linux具備UNIX系統(tǒng)的全部?jī)?yōu)點(diǎn)Linux是一套PC版的UNIX系統(tǒng),相對(duì)于Windows是一個(gè)十分穩(wěn)定的系統(tǒng),安全性好。(2)良好的網(wǎng)絡(luò)環(huán)境Linux與UNIX一樣,是以網(wǎng)絡(luò)環(huán)境為基礎(chǔ)的操作系統(tǒng),具備完整的網(wǎng)絡(luò)功能,提供在Internet或Intranet的,F(xiàn)TP,www等各種服務(wù)。(3)免費(fèi)的資源Linux免費(fèi)的資源和公開的源代碼方便了對(duì)操作系統(tǒng)的深入了解,給編程愛好者提供更大的發(fā)揮空間。3、Linux的特點(diǎn)1)全面的多任務(wù),多用戶和真正的32位操作系統(tǒng)2)支持多種硬件,多種硬件平臺(tái)3)對(duì)

3、應(yīng)用程序使用的存進(jìn)行保護(hù)4)按需取盤5)共享存頁(yè)面6)使用分頁(yè)技術(shù)的虛擬存7)優(yōu)秀的磁盤緩沖調(diào)度功能8)動(dòng)態(tài)共享庫(kù)9)支持偽終端設(shè)備10)支持多個(gè)虛擬控制臺(tái)11)支持多種CPU12)支持?jǐn)?shù)字協(xié)處理器387的軟件模擬13)支持多種文件系統(tǒng)14)支持POSIX的任務(wù)控制15)軟件移植性好16)與其它UNIX系統(tǒng)的兼容性17)強(qiáng)大的網(wǎng)絡(luò)功能三、常用命令介紹1、目錄操作和DOS相似,Linux采用樹型目錄管理結(jié)構(gòu),由根目錄(/)開始一層層將子目錄建下去,各子目錄以 / 隔開。用戶login后,工作目錄的位置稱為 home directory,由系統(tǒng)管理員設(shè)定。符號(hào)代表自己的home directory

4、,例如 /myfile 是指自己home目錄下myfile這個(gè)文件。Linux的通配符有三種:*和?用法與DOS一樣,-代表區(qū)間的任一字符,如test0-5即代表test0,test1,test5的集合。(1)顯示目錄文件 ls執(zhí)行格式: ls -atFlgR name (name可為文件或目錄名稱)例: ls 顯示出當(dāng)前目錄下的文件ls -a 顯示出包含隱藏文件的所有文件ls -t 按照文件最后修改時(shí)間顯示文件ls -F 顯示出當(dāng)前目錄下的文件與其類型ls -l 顯示目錄下所有文件的許可權(quán)、擁有者、文件大小、修改時(shí)間與名稱ls -lg 同上ls -R 顯示出該目錄與其子目錄下的文件注:ls與

5、其它命令搭配使用可以生出很多技巧(最簡(jiǎn)單的如ls -l | more),更多用法請(qǐng)輸入ls -help查看,其它命令的更多用法請(qǐng)輸入命令名 -help 查看。(2)建新目錄 mkdir執(zhí)行格式: mkdir directory-name例: mkdir dir1 (新建一名為dir1的目錄)(3)刪除目錄 rmdir執(zhí)行格式: rmdir directory-name 或 rm directory-name例:rmdir dir1 刪除目錄dir1,但它必須是空目錄,否則無(wú)法刪除 rm -r dir1 刪除目錄dir1與其下所有文件與子目錄rm -rf dir1 不管是否空目錄,統(tǒng)統(tǒng)刪除,而且

6、不給出提示,使用時(shí)要小心(4)改變工作目錄位置 cd執(zhí)行格式: cd name 例: cd 改變目錄位置至用戶login時(shí)的working directorycd dir1 改變目錄位置,至dir1目錄 cd user 改變目錄位置,至用戶的working directory cd 改變目錄位置,至當(dāng)前目錄的上層目錄 cd /user 改變目錄位置,至上一級(jí)目錄下的user目錄 cd /dir-name1/dir-name2 改變目錄位置,至絕對(duì)路徑(Full path) cd 回到進(jìn)入當(dāng)前目錄前的上一個(gè)目錄(5)顯示當(dāng)前所在目錄 pwd執(zhí)行格式: pwd(6)查看目錄大小du執(zhí)行格式: du

7、 -s directory例:du dir1 顯示目錄dir1與其子目錄容量(以kb為單位) du -s dir1 顯示目錄dir1的總?cè)萘浚?)顯示環(huán)境變量 echo $HOME 顯示家目錄 echo $PATH 顯示可執(zhí)行文件搜索路徑 env 顯示所有環(huán)境變量(可能很多,最好用env|more,env|grep PATH等)(8)修改環(huán)境變量,在bash下用export,如: export PATH=$PATH:/usr/local/bin想知道export的具體用法,可以用shell的help命令:help export2、文件操作(1)查看文件(可以是二進(jìn)制的)容 cat執(zhí)行格式:ca

8、t filename或more filename 或cat filename|more例: cat file1 以連續(xù)顯示方式,查看文件file1的容more file1 或 cat file1|more 以分頁(yè)方式查看文件的容(2)刪除文件 rm執(zhí)行格式: rm filename例: rm file?rm f*(3)復(fù)制文件 cp執(zhí)行格式: cp -r source destination例: cp file1 file2 將file1復(fù)制成file2 cp file1 dir1 將file1復(fù)制到目錄dir1 cp /tmp/file1 將file1復(fù)制到當(dāng)前目錄 cp /tmp/file

9、1 file2 將file1 復(fù)制到當(dāng)前目錄名為file2cp r dir1 dir2 (recursive copy)復(fù)制整個(gè)目錄。(4)移動(dòng)或更改文件、目錄名稱 mv執(zhí)行格式: mv source destination例: mv file1 file2 將文件file1,更名為file2 mv file1 dir1 將文件file1,移到目錄dir1下mv dir1 dir2 (5)比較文件(可以是二進(jìn)制的)或目錄的容 diff執(zhí)行格式: diff -r name1 name2 (name1、name2同為文件或目錄)例: diff file1 file2 比較file1與file2的不

10、同處diff -r dir1 dir2 比較dir1與dir2的不同處(6)文件中字符串的查找 grep執(zhí)行格式: grep string file例: grep abc file1 查找并列出串a(chǎn)bc所在的整行文字(7)文件或命令的路徑尋找執(zhí)行格式一:whereis command 顯示命令的路徑執(zhí)行格式二:which command 顯示路徑與使用者所定義的別名執(zhí)行格式三:whatis command 顯示命令的功能摘要執(zhí)行格式四:find search -path -name filename -print搜尋指定路徑下某文件的路徑執(zhí)行格式五:locate filename根據(jù)系統(tǒng)預(yù)先生

11、成的文件/目錄數(shù)據(jù)庫(kù)(/var/lib/slocate/slocate.db)查找匹配的文件/目錄,查找速度很快,如果有剛進(jìn)行的文件改變而系統(tǒng)未到執(zhí)行定時(shí)更新數(shù)據(jù)庫(kù)的時(shí)間,可以打入updatedb命令手動(dòng)更新。(8)建立文件或目錄的 ln例: ln source target1 建立source文件(已存在)的硬,命名為target1ln -s source target2 建立source文件的符號(hào),命名為target2以下是幾個(gè)常用命令操作的截圖:四、設(shè)計(jì)思想當(dāng)計(jì)算機(jī)中兩個(gè)或多個(gè)進(jìn)程在執(zhí)行時(shí)需要使用公用緩沖區(qū),并且對(duì)該緩沖區(qū)采取了互斥措施。這時(shí)如果并發(fā)執(zhí)行這些進(jìn)程就會(huì)造成CPU的極大浪費(fèi),

12、這是操作系統(tǒng)設(shè)計(jì)要求不允許的。而這種現(xiàn)象在操作系統(tǒng)和用戶進(jìn)程量存在。因此為了解決這一問(wèn)題,提出了同步的概念,即把異步環(huán)境下的一組并發(fā)進(jìn)程,因直接制約而互相發(fā)送消息、互相合作、互相等待,使得各進(jìn)程按一定的速度執(zhí)行的過(guò)程稱為進(jìn)程間的同步。在本次設(shè)計(jì)中,爸爸與媽媽、兒子與女兒的進(jìn)程操作是互斥的,但是爸爸與女兒、媽媽與兒子進(jìn)程之間的操作是同步的。因此要利用進(jìn)程同步的方法來(lái)實(shí)現(xiàn)這幾者之間的操作,當(dāng)然其中也包含著互斥進(jìn)程,因?yàn)楸P子每次只能放入或取出一個(gè)水果。程序設(shè)計(jì)中有如下四個(gè)進(jìn)程:father(),mother(),daughter(),son()。五、數(shù)據(jù)結(jié)構(gòu)1、信號(hào)量semid_mutex作為進(jìn)程的

13、公有信號(hào)量,其初始值為1,可以實(shí)現(xiàn)進(jìn)程間的互斥,同時(shí)可以表示當(dāng)前狀態(tài)下盤子里可以放幾個(gè)水果,實(shí)現(xiàn)進(jìn)程間的同步。2、信號(hào)量semid_full1為進(jìn)程father()與daughter()的私有信號(hào)量,初值為0,表示當(dāng)前盤子里蘋果的數(shù)目。3、信號(hào)量semid_full2為進(jìn)程mother()與son()的私有信號(hào)量,初值為0,表示當(dāng)前盤子里橘子的數(shù)目。六、設(shè)計(jì)流程爸爸放蘋果流程圖:father操作semid_mutex=0(P(semid_mutex)阻塞father進(jìn)程是放蘋果否喚醒daughter進(jìn)程V(semid_full1)媽媽放橘子流程圖:mother操作semid_mutex=0(P

14、(semid_mutex)阻塞mother進(jìn)程是放橘子否喚醒son進(jìn)程V(semid_full2)女兒吃蘋果流程圖:daughter操作semid_full1=0(P(semid_full1)阻塞daughter進(jìn)程是吃蘋果否離開臨界區(qū)喚醒father進(jìn)程V(semid_mutex)兒子吃橘子流程圖:son操作semid_full2=0(P(semid_full2)阻塞son進(jìn)程是吃橘子否離開臨界區(qū)喚醒mother進(jìn)程V(semid_mutex)源代碼#include #include#include#include#include#include #include #include #inc

15、lude #include #include#include #define SHMKEY 9090 /*共享存儲(chǔ)區(qū)的鍵*/#define SEMKEY_EMPTY 9091#define SEMKEY_MUTEX 9092#define SEMKEY_FULL1 9093#define SEMKEY_FULL2 9094 /*信號(hào)量數(shù)組的鍵*/*注意:上面的鍵在系統(tǒng)中必須唯一*/#define BUFF_LEN 5/*緩沖區(qū)可以存放10個(gè)產(chǎn)品*/#define PRODUCT_LEN 1 /*每個(gè)產(chǎn)品是一個(gè)字符串:sem_num=semnum; sem-sem_op=semop; sem-s

16、em_flg=semflg; int begin() char *addr, end; int shmid; int semid_empty, semid_full1,semid_full2, semid_mutex; struct sembuf sem_tmp; /*開辟共享存儲(chǔ)區(qū)*/ if (shmid = shmget(SHMKEY, BUFF_LEN * PRODUCT_LEN+3, 0777|IPC_CREAT|IPC_EXCL) = -1) if (errno = EEXIST) printf(The Buffer Has Existed!n); printf(Do You Wan

17、t To Delete The Buffer(Y = yes)?n=:); scanf(%c, &end); if(end = y | end = Y) /* 共享存儲(chǔ)區(qū)、信號(hào)量并不隨程序的結(jié)束而被刪除,如果我們沒刪除的話, 可以用ipcs命令查看,用ipcrm刪除 */ /*釋放緩沖區(qū)*/ shmid = shmget(SHMKEY, BUFF_LEN * PRODUCT_LEN+3, 0777); if (shmctl(shmid,IPC_RMID,0) 0) perror(shmctl: falsed); /*同時(shí)釋放信號(hào)量*/ semid_mutex = semget(SEMKEY_M

18、UTEX,1, 0777);/*獲取全局信號(hào)量id*/ semid_empty = semget(SEMKEY_EMPTY,1, 0777); semid_full1 = semget(SEMKEY_FULL1,1, 0777); semid_full2 = semget(SEMKEY_FULL2,1, 0777); semctl(semid_mutex,0,IPC_RMID); semctl(semid_empty,0,IPC_RMID); semctl(semid_full1,0,IPC_RMID); semctl(semid_full2,0,IPC_RMID); else printf(

19、Fail To Create Buffer!n); return -1; addr = (char*)shmat(shmid, 0, 0);/*連接緩沖區(qū)*/ memset(addr, 0, BUFF_LEN * PRODUCT_LEN+3); /初始化存儲(chǔ)區(qū) 為0 shmdt(addr); /*離開緩沖區(qū)*/ /*創(chuàng)建3個(gè)信號(hào)量:1個(gè)用于對(duì)緩沖區(qū)互斥,2個(gè)用于生產(chǎn)者、消費(fèi)者同步*/ if(semid_mutex = semget(SEMKEY_MUTEX,1, 0777|IPC_CREAT|IPC_EXCL)=-1) if (errno = EEXIST) printf(The SEMKEY

20、_MUTEX Has Existed!n); else printf(Fail To Create SEMKEY_MUTEX!n); return -1; if(semid_empty= semget(SEMKEY_EMPTY,1, 0777|IPC_CREAT|IPC_EXCL)=-1) if (errno = EEXIST) printf(The SEMKEY_EMPTY Has Existed!n); else printf(Fail To Create SEMKEY_EMPTY!n); return -1; if(semid_full1 = semget(SEMKEY_FULL1,1,

21、 0777|IPC_CREAT|IPC_EXCL)=-1) if (errno = EEXIST) printf(The SEM_FULL1 Has Existed!n); else printf(Fail To Create SEM_FULL1!n); return -1; if(semid_full2= semget(SEMKEY_FULL2,1, 0777|IPC_CREAT|IPC_EXCL)=-1) if (errno = EEXIST) printf(The SEM_FULL2 Has Existed!n); else printf(Fail To Create SEM_FULL2

22、!n); return -1; /*給信號(hào)量賦初值*/ set_sembuf_struct(&sem_tmp, 0, BUFF_LEN, 0);/*BUFF_LEN*/ semop(semid_empty, &sem_tmp,1); set_sembuf_struct(&sem_tmp, 0, 0, 0);/*0*/ semop(semid_full1, &sem_tmp,1); set_sembuf_struct(&sem_tmp, 0, 0, 0);/*0*/ semop(semid_full2, &sem_tmp,1); set_sembuf_struct(&sem_tmp, 0, 1,

23、 0);/*1*/ semop(semid_mutex, &sem_tmp,1); return 0;/*下面的P,V是對(duì)系統(tǒng)調(diào)用的簡(jiǎn)單封裝*/int P(int semid) struct sembuf p_buf; p_buf.sem_num = 0; p_buf.sem_op = -1; p_buf.sem_flg = 0; if(semop(semid, &p_buf, 1)=-1)/*semop參見課件ppt*/ perror (p (semid) falsed); exit (1); else return 0;int V(int semid) struct sembuf v_bu

24、f;/*struct 參見課件ppt*/ v_buf.sem_num = 0; v_buf.sem_op = 1; v_buf.sem_flg = 0; if(semop(semid, &v_buf, 1)=-1) perror ( v (semid) failed); exit (1); else return 0;int father() int semid_empty, semid_full1,semid_full2, semid_mutex;/*信號(hào)量集合id*/ int rc1,rc2,rc3; semid_mutex = semget(SEMKEY_MUTEX,1, 0777);/

25、*獲取全局信號(hào)量id*/ semid_empty = semget(SEMKEY_EMPTY,1, 0777); semid_full1 = semget(SEMKEY_FULL1,1, 0777); semid_full2 = semget(SEMKEY_FULL2,1, 0777); rc1=semctl(semid_empty,0,GETVAL); rc2=semctl(semid_mutex,0,GETVAL); if(rc1=0) return 1; /不能放 則等待 if(rc2=0 ) return 1; P(semid_empty);/*對(duì)私有信號(hào)量作P操作*/ P(semid

26、_mutex); printf(there is %d places to put applesn,rc1); printf(PUT AN APLLEn); V(semid_mutex); V(semid_full1); rc3=semctl(semid_full1,0,GETVAL); printf(daughter can get %d applesn,rc3); return 0;int mother() int semid_empty, semid_full1,semid_full2, semid_mutex;/*信號(hào)量集合id*/ int rc1,rc2,rc3; semid_mut

27、ex = semget(SEMKEY_MUTEX,1, 0777);/*獲取全局信號(hào)量id*/ semid_empty = semget(SEMKEY_EMPTY,1, 0777); semid_full1 = semget(SEMKEY_FULL1,1, 0777); semid_full2 = semget(SEMKEY_FULL2,1, 0777); rc1=semctl(semid_empty,0,GETVAL); rc2=semctl(semid_mutex,0,GETVAL);if(rc1=0) return 1; /不能放 則等待 else if(rc2=0) return 1;

28、 P(semid_empty);/*對(duì)私有信號(hào)量作P操作*/ P(semid_mutex); printf(there is %d places to put orangesn,rc1); printf(PUT AN ORANGE!n); V(semid_mutex); V(semid_full2); rc3=semctl(semid_full2,0,GETVAL); printf(son can get %d orangesn,rc3); return 0;int son() int semid_empty, semid_full1,semid_full2, semid_mutex;/*信號(hào)

29、量集合id*/ int rc1,rc2; semid_mutex = semget(SEMKEY_MUTEX,1, 0777);/*獲取全局信號(hào)量id*/ semid_empty = semget(SEMKEY_EMPTY,1, 0777); semid_full1 = semget(SEMKEY_FULL1,1, 0777); semid_full2 = semget(SEMKEY_FULL2,1, 0777); rc2=semctl(semid_full1,0,GETVAL); rc1=semctl(semid_full2,0,GETVAL);if(rc1=0) return 1; /不能

30、放 則等待 P(semid_full2);/*對(duì)私有信號(hào)量作P操作*/ P(semid_mutex); printf(SUM:%d apples and %d orangesn,rc2,rc1); printf(there is %d oranges to get n,rc1); printf(GET AN ORANGE !n); V(semid_empty); V(semid_mutex); return 0;int daughter() int semid_empty, semid_full1,semid_full2, semid_mutex;/*信號(hào)量集合id*/ int rc1,rc2,rc3; semid_mutex = semget(SEMKEY_MUTEX,1, 0777);/*獲取全局信號(hào)量id*/

溫馨提示

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

評(píng)論

0/150

提交評(píng)論