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

下載本文檔

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

文檔簡介

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

2、進(jìn)的minix系統(tǒng),故稱之為Linux。2、Linux的優(yōu)點(diǎn)1Linux具備UNIX系統(tǒng)的全部優(yōu)點(diǎn)Linux是一套PC版的UNIX系統(tǒng),相對于Windows是一個(gè)十分穩(wěn)定的系統(tǒng),平安性好。2良好的網(wǎng)絡(luò)環(huán)境Linux與UNIX一樣,是以網(wǎng)絡(luò)環(huán)境為根底的操作系統(tǒng),具備完整的網(wǎng)絡(luò)功能,提供在Internet或Intranet的郵件,F(xiàn)TP,www等各種效勞。3免費(fèi)的資源Linux免費(fèi)的資源和公開的源代碼方便了對操作系統(tǒng)的深入了解,給編程愛好者提供更大的發(fā)揮空間。3、Linux的特點(diǎn)1全面的多任務(wù),多用戶和真正的32位操作系統(tǒng)2支持多種硬件,多種硬件平臺(tái)3對應(yīng)用程序使用的內(nèi)存進(jìn)行保護(hù)4按需取盤5共享內(nèi)

3、存頁面6使用分頁技術(shù)的虛擬內(nèi)存7優(yōu)秀的磁盤緩沖調(diào)度功能8動(dòng)態(tài)鏈接共享庫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,例如 /myfile 是指自己home目錄下myfile這個(gè)文件

4、。Linux的通配符有三種:*和?用法與DOS相同,-代表區(qū)間內(nèi)的任一字符,如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與其它命令搭配使用可以生出很多技巧(最簡單的如"ls -l

5、| more"),更多用法請輸入ls -help查看,其它命令的更多用法請輸入 命令名 -help 查看。2建新目錄 mkdir執(zhí)行格式: mkdir directory-name例: mkdir dir1 (新建一名為dir1的目錄)3刪除目錄 rmdir執(zhí)行格式: rmdir directory-name 或 rm directory-name例:rmdir dir1 刪除目錄dir1,但它必須是空目錄,否那么無法刪除 rm -r dir1 刪除目錄dir1及其下所有文件及子目錄 rm -rf dir1 不管是否空目錄,統(tǒng)統(tǒng)刪除,而且不給出提示,使用時(shí)要小心4改變工作目錄位置 c

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

7、1及其子目錄容量以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)制的)內(nèi)容 cat執(zhí)行格式:cat filename或m

8、ore filename 或cat filename|more例: cat file1 以連續(xù)顯示方式,查看文件file1的內(nèi)容more file1 或 cat file1|more 以分頁方式查看文件的內(nèi)容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/file1 file2 將file

9、1 復(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)制的)或目錄的內(nèi)容 diff執(zhí)行格式: diff -r name1 name2 (name1、name2同為文件或目錄) 例: diff file1 file2 比擬file1與file2的不同處 diff -r dir1

10、 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ù)先生成的文件/目錄數(shù)據(jù)庫(/var/l

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

12、。而這種現(xiàn)象在操作系統(tǒng)和用戶進(jìn)程中大量存在。因此為了解決這一問題,提出了同步的概念,即把異步環(huán)境下的一組并發(fā)進(jìn)程,因直接制約而互相發(fā)送消息、互相合作、互相等待,使得各進(jìn)程按一定的速度執(zhí)行的過程稱為進(jìn)程間的同步。在本次設(shè)計(jì)中,爸爸與媽媽、兒子與女兒的進(jìn)程操作是互斥的,但是爸爸與女兒、媽媽與兒子進(jìn)程之間的操作是同步的。因此要利用進(jìn)程同步的方法來實(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)程的公有信號(hào)量,其初始值為1

13、,可以實(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(sem

14、id_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)7、 源代碼#include <unistd.h>#include<stdlib.h>#include<stdi

15、o.h>#include<time.h>#include<sys/wait.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/sem.h>#include <errno.h>#include<signal.h>#include <string.h>#define SHMKEY 9090 /*共享存儲(chǔ)區(qū)的鍵*/#define SEMKEY_EMPTY 9091#define SE

16、MKEY_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è)字符串:<=32字符*/void set_sembuf_struct(struct sembuf *sem,int semnum, int semop,int semflg) /* 設(shè)置信號(hào)量結(jié)構(gòu) */ sem->sem_num=semnum; sem->sem

17、_op=semop; sem->sem_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 Exi

18、sted!n"); printf("Do You Want 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,

19、IPC_RMID,0) < 0) perror("shmctl: falsed"); /*同時(shí)釋放信號(hào)量*/ 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); semctl(semid_mutex,0,IPC_RMID); semctl(semi

20、d_empty,0,IPC_RMID); semctl(semid_full1,0,IPC_RMID); semctl(semid_full2,0,IPC_RMID); else printf("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è)用于對緩沖區(qū)互斥,2個(gè)用于生產(chǎn)者、消費(fèi)者同步

21、*/ if(semid_mutex = semget(SEMKEY_MUTEX,1, 0777|IPC_CREAT|IPC_EXCL)=-1) if (errno = EEXIST) printf("The SEMKEY_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) p

22、rintf("The SEMKEY_EMPTY Has Existed!n"); else printf("Fail To Create SEMKEY_EMPTY!n"); return -1; if(semid_full1 = semget(SEMKEY_FULL1,1, 0777|IPC_CREAT|IPC_EXCL)=-1) if (errno = EEXIST) printf("The SEM_FULL1 Has Existed!n"); else printf("Fail To Create SEM_FULL1!n

23、"); 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!n"); return -1; /*給信號(hào)量賦初值*/ set_sembuf_struct(&sem_tmp, 0, BUFF_LEN, 0);/*BUFF_LEN*/ semop(

24、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, 0);/*1*/ semop(semid_mutex, &sem_tmp,1); return 0;/*下面的P,V是對系統(tǒng)

25、調(diào)用的簡單封裝*/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_buf;/*struct 參見課件ppt*/ v_buf.sem_num = 0; v_buf.s

26、em_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);/*獲取全局信號(hào)量id*/ semid_empty = semg

27、et(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);/*對私有信號(hào)量作P操作*/ P(semid_mutex); printf("there is

28、%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; semi

29、d_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); rc1=semctl(semid_empty,0,GETVAL); rc2=semctl(semid_mutex,0,GETVAL);if(rc1=0) return 1; /不能放 則等待 else if(rc2=0) retu

30、rn 1; P(semid_empty);/*對私有信號(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,

31、semid_full1,semid_full2, semid_mutex;/*信號(hào)量集合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(semi

32、d_full2,0,GETVAL);if(rc1=0) return 1; /不能放 則等待 P(semid_full2);/*對私有信號(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(SEMK

溫馨提示

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

最新文檔

評論

0/150

提交評論