版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 操作系統(tǒng)課程設(shè)計(jì)</b></p><p> ——Linux系統(tǒng)管理實(shí)踐與進(jìn)程通信實(shí)現(xiàn)</p><p><b> 二零一三年一月八號(hào)</b></p><p><b> 一、設(shè)計(jì)內(nèi)容 </b></p><p> 1、Linux系統(tǒng)的熟悉與常用操
2、作命令的掌握。</p><p> 2、Linux環(huán)境下進(jìn)程通信的實(shí)現(xiàn)。(實(shí)現(xiàn)父母子女放水果吃水果的同步互斥問(wèn)題,爸爸放蘋(píng)果,女兒專(zhuān)等吃蘋(píng)果,媽媽放橘子,兒子專(zhuān)等吃橘子,盤(pán)子即為緩沖區(qū),大小為5。)</p><p> 二、Linux環(huán)境介紹</p><p> 1、Linux的由來(lái)與發(fā)展</p><p> Linux是一種可以在PC機(jī)上執(zhí)
3、行的類(lèi)似UNIX的操作系統(tǒng),是一個(gè)完全免費(fèi)的操作系統(tǒng)。1991年,芬蘭學(xué)生Linux Torvalds開(kāi)發(fā)了這個(gè)操作系統(tǒng)的核心部分,因?yàn)槭荓inux改良的minix系統(tǒng),故稱(chēng)之為L(zhǎng)inux。</p><p> 2、Linux的優(yōu)點(diǎn)</p><p> ?。?)Linux具備UNIX系統(tǒng)的全部?jī)?yōu)點(diǎn)</p><p> Linux是一套PC版的UNIX系統(tǒng),相對(duì)于Win
4、dows是一個(gè)十分穩(wěn)定的系統(tǒng),安全性好。</p><p> (2)良好的網(wǎng)絡(luò)環(huán)境</p><p> Linux與UNIX一樣,是以網(wǎng)絡(luò)環(huán)境為基礎(chǔ)的操作系統(tǒng),具備完整的網(wǎng)絡(luò)功能,提供在Internet或Intranet的郵件,F(xiàn)TP,www等各種服務(wù)。</p><p><b> ?。?)免費(fèi)的資源</b></p><p&g
5、t; Linux免費(fèi)的資源和公開(kāi)的源代碼方便了對(duì)操作系統(tǒng)的深入了解,給編程愛(ài)好者提供更大的發(fā)揮空間。</p><p> 3、Linux的特點(diǎn)</p><p> 1)全面的多任務(wù),多用戶(hù)和真正的32位操作系統(tǒng)</p><p> 2)支持多種硬件,多種硬件平臺(tái)</p><p> 3)對(duì)應(yīng)用程序使用的內(nèi)存進(jìn)行保護(hù)</p>&
6、lt;p><b> 4)按需取盤(pán)</b></p><p><b> 5)共享內(nèi)存頁(yè)面</b></p><p> 6)使用分頁(yè)技術(shù)的虛擬內(nèi)存</p><p> 7)優(yōu)秀的磁盤(pán)緩沖調(diào)度功能</p><p><b> 8)動(dòng)態(tài)鏈接共享庫(kù)</b></p>
7、<p><b> 9)支持偽終端設(shè)備</b></p><p> 10)支持多個(gè)虛擬控制臺(tái)</p><p> 11)支持多種CPU</p><p> 12)支持?jǐn)?shù)字協(xié)處理器387的軟件模擬</p><p> 13)支持多種文件系統(tǒng)</p><p> 14)支持POSIX的任務(wù)控
8、制</p><p><b> 15)軟件移植性好</b></p><p> 16)與其它UNIX系統(tǒng)的兼容性</p><p> 17)強(qiáng)大的網(wǎng)絡(luò)功能</p><p><b> 三、常用命令介紹</b></p><p><b> 1、目錄操作</b&g
9、t;</p><p> 和DOS相似,Linux采用樹(shù)型目錄管理結(jié)構(gòu),由根目錄(/)開(kāi)始一層層將子目錄建下去,各子目錄以 / 隔開(kāi)。用戶(hù)login后,工作目錄的位置稱(chēng)為 home directory,由系統(tǒng)管理員設(shè)定?!畘’符號(hào)代表自己的home directory,例如 ~/myfile 是指自己home目錄下myfile這個(gè)文件。</p><p> Linux的通配符有
10、三種:’*’和’?’用法與DOS相同,‘-‘代表區(qū)間內(nèi)的任一字符,如test[0-5]即代表test0,test1,……,test5的集合。</p><p> ?。?)顯示目錄文件 ls</p><p> 執(zhí)行格式: ls [-atFlgR] [name] (name可為文件或目錄名稱(chēng))</p><p> 例: ls 顯
11、示出當(dāng)前目錄下的文件</p><p> ls -a 顯示出包含隱藏文件的所有文件</p><p> ls -t 按照文件最后修改時(shí)間顯示文件</p><p> ls -F 顯示出當(dāng)前目錄下的文件及其類(lèi)型</p><p> ls -l 顯示目錄下所有文件的許可權(quán)、擁有者、文件大小、
12、修改時(shí)間及名稱(chēng)</p><p> ls -lg 同上</p><p> ls -R 顯示出該目錄及其子目錄下的文件</p><p> 注:ls與其它命令搭配使用可以生出很多技巧(最簡(jiǎn)單的如"ls -l | more"),更多用法請(qǐng)輸入ls --help查看,其它命令的更多用法請(qǐng)輸入 命令名 --help 查看。
13、</p><p> ?。?)建新目錄 mkdir</p><p> 執(zhí)行格式: mkdir directory-name</p><p> 例: mkdir dir1 (新建一名為dir1的目錄)</p><p> ?。?)刪除目錄 rmdir</p><p> 執(zhí)行格式: rmd
14、ir directory-name 或 rm directory-name</p><p> 例:rmdir dir1 刪除目錄dir1,但它必須是空目錄,否則無(wú)法刪除</p><p> rm -r dir1 刪除目錄dir1及其下所有文件及子目錄</p><p> rm -rf dir1 不管是否空目錄,統(tǒng)統(tǒng)刪除,
15、而且不給出提示,使用時(shí)要小心</p><p> (4)改變工作目錄位置 cd</p><p> 執(zhí)行格式: cd [name] </p><p> 例: cd 改變目錄位置至用戶(hù)login時(shí)的working directory</p><p> cd di
16、r1 改變目錄位置,至dir1目錄</p><p> cd ~user 改變目錄位置,至用戶(hù)的working directory</p><p> cd 改變目錄位置,至當(dāng)前目錄的上層目錄</p><p> cd /user 改變目錄位置,至上一級(jí)目錄下的user目錄</p><p
17、> cd /dir-name1/dir-name2 改變目錄位置,至絕對(duì)路徑(Full path)</p><p> cd 回到進(jìn)入當(dāng)前目錄前的上一個(gè)目錄</p><p> ?。?)顯示當(dāng)前所在目錄 pwd</p><p> 執(zhí)行格式: pwd</p><p> ?。?)查看目錄大小du<
18、/p><p> 執(zhí)行格式: du [-s] directory</p><p> 例:du dir1 顯示目錄dir1及其子目錄容量(以kb為單位)</p><p> du -s dir1 顯示目錄dir1的總?cè)萘?lt;/p><p><b> ?。?)顯示環(huán)境變量</b><
19、/p><p> echo $HOME 顯示家目錄</p><p> echo $PATH 顯示可執(zhí)行文件搜索路徑</p><p> env 顯示所有環(huán)境變量(可能很多,最好用"env|more","env|grep PATH"等)</p><p> ?。?)修改環(huán)境變量,在b
20、ash下用export,如:</p><p> export PATH=$PATH:/usr/local/bin</p><p> 想知道export的具體用法,可以用shell的help命令:help export</p><p><b> 2、文件操作</b></p><p> (1)查看文件(可以是二進(jìn)制的
21、)內(nèi)容 cat</p><p> 執(zhí)行格式:cat filename或more filename 或cat filename|more</p><p> 例: cat file1 以連續(xù)顯示方式,查看文件file1的內(nèi)容</p><p> more file1 </p><p> 或 cat
22、 file1|more 以分頁(yè)方式查看文件的內(nèi)容</p><p> ?。?)刪除文件 rm</p><p> 執(zhí)行格式: rm filename</p><p> 例: rm file?</p><p><b> rm f*</b></p><p>
23、(3)復(fù)制文件 cp</p><p> 執(zhí)行格式: cp [-r] source destination</p><p> 例: cp file1 file2 將file1復(fù)制成file2</p><p> cp file1 dir1 將file1復(fù)制到目錄dir1</p><p&
24、gt; cp /tmp/file1 將file1復(fù)制到當(dāng)前目錄</p><p> cp /tmp/file1 file2 將file1 復(fù)制到當(dāng)前目錄名為file2</p><p> cp –r dir1 dir2 (recursive copy)復(fù)制整個(gè)目錄。</p><p> ?。?)移動(dòng)或更改文件、目錄名稱(chēng)
25、 mv</p><p> 執(zhí)行格式: mv source destination</p><p> 例: mv file1 file2 將文件file1,更名為file2</p><p> mv file1 dir1 將文件file1,移到目錄dir1下</p><p> mv d
26、ir1 dir2 </p><p> ?。?)比較文件(可以是二進(jìn)制的)或目錄的內(nèi)容 diff</p><p> 執(zhí)行格式: diff [-r] name1 name2 (name1、name2同為文件或目錄)</p><p> 例: diff file1 file2 比較file1與file2的不同處 </
27、p><p> diff -r dir1 dir2 比較dir1與dir2的不同處</p><p> (6)文件中字符串的查找 grep</p><p> 執(zhí)行格式: grep string file</p><p> 例: grep abc file1 查找并列出串a(chǎn)bc所在的整行文字&
28、lt;/p><p> (7)文件或命令的路徑尋找</p><p> 執(zhí)行格式一:whereis command 顯示命令的路徑</p><p> 執(zhí)行格式二:which command 顯示路徑及使用者所定義的別名</p><p> 執(zhí)行格式三:whatis command 顯示命令的功能摘要</p><
29、;p> 執(zhí)行格式四:find search -path -name filename -print搜尋指定路徑下某文件的路徑</p><p> 執(zhí)行格式五:locate filename</p><p> 根據(jù)系統(tǒng)預(yù)先生成的文件/目錄數(shù)據(jù)庫(kù)(/var/lib/slocate/slocate.db)查找匹配的文件/目錄,查找速度很快,如果有剛進(jìn)行的文件改變而系統(tǒng)未到執(zhí)行
30、定時(shí)更新數(shù)據(jù)庫(kù)的時(shí)間,可以打入updatedb命令手動(dòng)更新。</p><p> ?。?)建立文件或目錄的鏈接 ln</p><p> 例: ln source target1 建立source文件(已存在)的硬鏈接,命名為target1</p><p> ln -s source target2 建立source文件的符號(hào)鏈接,命名為targ
31、et2</p><p> 以下是幾個(gè)常用命令操作的截圖:</p><p><b> 四、設(shè)計(jì)思想</b></p><p> 當(dāng)計(jì)算機(jī)中兩個(gè)或多個(gè)進(jìn)程在執(zhí)行時(shí)需要使用公用緩沖區(qū),并且對(duì)該緩沖區(qū)采取了互斥措施。這時(shí)如果并發(fā)執(zhí)行這些進(jìn)程就會(huì)造成CPU的極大浪費(fèi),這是操作系統(tǒng)設(shè)計(jì)要求不允許的。而這種現(xiàn)象在操作系統(tǒng)和用戶(hù)進(jìn)程中大量存在。因此為了解決
32、這一問(wèn)題,提出了同步的概念,即把異步環(huán)境下的一組并發(fā)進(jìn)程,因直接制約而互相發(fā)送消息、互相合作、互相等待,使得各進(jìn)程按一定的速度執(zhí)行的過(guò)程稱(chēng)為進(jìn)程間的同步。</p><p> 在本次設(shè)計(jì)中,爸爸與媽媽、兒子與女兒的進(jìn)程操作是互斥的,但是爸爸與女兒、媽媽與兒子進(jìn)程之間的操作是同步的。因此要利用進(jìn)程同步的方法來(lái)實(shí)現(xiàn)這幾者之間的操作,當(dāng)然其中也包含著互斥進(jìn)程,因?yàn)楸P(pán)子每次只能放入或取出一個(gè)水果。</p>
33、<p> 程序設(shè)計(jì)中有如下四個(gè)進(jìn)程:father(),mother(),daughter(),son()。</p><p><b> 五、數(shù)據(jù)結(jié)構(gòu)</b></p><p> 1、信號(hào)量semid_mutex作為進(jìn)程的公有信號(hào)量,其初始值為1,可以實(shí)現(xiàn)進(jìn)程間的互斥,同時(shí)可以表示當(dāng)前狀態(tài)下盤(pán)子里可以放幾個(gè)水果,實(shí)現(xiàn)進(jìn)程間的同步。</p>&l
34、t;p> 2、信號(hào)量semid_full1為進(jìn)程father()與daughter()的私有信號(hào)量,初值為0,表示當(dāng)前盤(pán)子里蘋(píng)果的數(shù)目。</p><p> 3、信號(hào)量semid_full2為進(jìn)程mother()與son()的私有信號(hào)量,初值為0,表示當(dāng)前盤(pán)子里橘子的數(shù)目。</p><p><b> 六、設(shè)計(jì)流程</b></p><p&g
35、t;<b> 爸爸放蘋(píng)果流程圖:</b></p><p><b> 媽媽放橘子流程圖:</b></p><p><b> 女兒吃蘋(píng)果流程圖:</b></p><p><b> 兒子吃橘子流程圖:</b></p><p><b> 源代碼
36、</b></p><p> #include <unistd.h></p><p> #include<stdlib.h></p><p> #include<stdio.h></p><p> #include<time.h></p><p> #
37、include<sys/wait.h></p><p> #include <sys/types.h></p><p> #include <sys/ipc.h></p><p> #include <sys/shm.h></p><p> #include <sys/sem.h&
38、gt;</p><p> #include <errno.h></p><p> #include<signal.h></p><p> #include <string.h></p><p> #define SHMKEY 9090 /*共享存儲(chǔ)區(qū)的鍵*/</p><p>
39、 #define SEMKEY_EMPTY 9091</p><p> #define SEMKEY_MUTEX 9092</p><p> #define SEMKEY_FULL1 9093</p><p> #define SEMKEY_FULL2 9094 /*信號(hào)量數(shù)組的鍵*//*注意:上面的鍵在系統(tǒng)中必須唯一*/</p><p&
40、gt; #define BUFF_LEN 5/*緩沖區(qū)可以存放10個(gè)產(chǎn)品*/</p><p> #define PRODUCT_LEN 1 /*每個(gè)產(chǎn)品是一個(gè)字符串:<=32字符*/</p><p> void set_sembuf_struct(struct sembuf *sem,int semnum, int semop,int semflg) </p>&
41、lt;p><b> { </b></p><p> /* 設(shè)置信號(hào)量結(jié)構(gòu) */ </p><p> sem->sem_num=semnum; </p><p> sem->sem_op=semop; </p><p> sem->sem_flg=semflg; </p>&
42、lt;p><b> } </b></p><p> int begin()</p><p><b> {</b></p><p> char *addr, end;</p><p> int shmid;</p><p> int semid_empty,
43、semid_full1,semid_full2, semid_mutex;</p><p> struct sembuf sem_tmp;</p><p> /*開(kāi)辟共享存儲(chǔ)區(qū)*/</p><p> if ((shmid = shmget(SHMKEY, BUFF_LEN * PRODUCT_LEN+3, 0777|IPC_CREAT|IPC_EXCL)) =
44、= -1)</p><p><b> {</b></p><p> if (errno == EEXIST)</p><p><b> {</b></p><p> printf("The Buffer Has Existed!\n");</p><p
45、> printf("Do You Want To Delete The Buffer(Y = yes)?\n====:");</p><p> scanf("%c", &end);</p><p> if(end == 'y' || end == 'Y')</p><p>&
46、lt;b> {</b></p><p> /* 共享存儲(chǔ)區(qū)、信號(hào)量并不隨程序的結(jié)束而被刪除,如果我們沒(méi)刪除的話, </p><p> 可以用ipcs命令查看,用ipcrm刪除 </p><p><b> */ </b></p><p><b> /*釋放緩沖區(qū)*/</b>
47、</p><p> shmid = shmget(SHMKEY, BUFF_LEN * PRODUCT_LEN+3, 0777);</p><p> if (shmctl(shmid,IPC_RMID,0) < 0)</p><p> perror("shmctl: falsed");</p><p> /*
48、同時(shí)釋放信號(hào)量*/ </p><p> semid_mutex = semget(SEMKEY_MUTEX,1, 0777);/*獲取全局信號(hào)量id*/</p><p> semid_empty = semget(SEMKEY_EMPTY,1, 0777);</p><p> semid_full1 = semget(SEMKEY_FULL1,1, 077
49、7);</p><p> semid_full2 = semget(SEMKEY_FULL2,1, 0777);</p><p> semctl(semid_mutex,0,IPC_RMID);</p><p> semctl(semid_empty,0,IPC_RMID);</p><p> semctl(semid_full1,0
50、,IPC_RMID);</p><p> semctl(semid_full2,0,IPC_RMID);</p><p><b> }</b></p><p><b> }</b></p><p><b> else </b></p><p>
51、 printf("Fail To Create Buffer!\n");</p><p> return -1;</p><p><b> }</b></p><p> addr = (char*)shmat(shmid, 0, 0);/*連接緩沖區(qū)*/ </p><p> memset
52、(addr, 0, BUFF_LEN * PRODUCT_LEN+3); //初始化存儲(chǔ)區(qū) 為0</p><p> shmdt(addr); /*離開(kāi)緩沖區(qū)*/</p><p> /*創(chuàng)建3個(gè)信號(hào)量:1個(gè)用于對(duì)緩沖區(qū)互斥,2個(gè)用于生產(chǎn)者、消費(fèi)者同步*/</p><p> if((semid_mutex = semget(SEMKEY_MUTEX,1,
53、0777|IPC_CREAT|IPC_EXCL))==-1) </p><p><b> { </b></p><p> if (errno == EEXIST)</p><p> printf("The SEMKEY_MUTEX Has Existed!\n");</p><p><b&
54、gt; else </b></p><p> printf("Fail To Create SEMKEY_MUTEX!\n");</p><p> return -1; </p><p><b> } </b></p><p> if((semid_empty= semget(S
55、EMKEY_EMPTY,1, 0777|IPC_CREAT|IPC_EXCL))==-1) </p><p><b> { </b></p><p> if (errno == EEXIST)</p><p> printf("The SEMKEY_EMPTY Has Existed!\n");</p>
56、<p><b> else </b></p><p> printf("Fail To Create SEMKEY_EMPTY!\n");</p><p> return -1; </p><p><b> } </b></p><p> if((semid_
57、full1 = semget(SEMKEY_FULL1,1, 0777|IPC_CREAT|IPC_EXCL))==-1) </p><p><b> { </b></p><p> if (errno == EEXIST)</p><p> printf("The SEM_FULL1 Has Existed!\n")
58、;</p><p><b> else </b></p><p> printf("Fail To Create SEM_FULL1!\n");</p><p> return -1; </p><p><b> } </b></p><p>
59、if((semid_full2= semget(SEMKEY_FULL2,1, 0777|IPC_CREAT|IPC_EXCL))==-1) </p><p><b> { </b></p><p> if (errno == EEXIST)</p><p> printf("The SEM_FULL2 Has Existed!
60、\n");</p><p><b> else </b></p><p> printf("Fail To Create SEM_FULL2!\n");</p><p> return -1; </p><p><b> } </b></p>&l
61、t;p> /*給信號(hào)量賦初值*/</p><p> set_sembuf_struct(&sem_tmp, 0, BUFF_LEN, 0);/*BUFF_LEN*/</p><p> semop(semid_empty, &sem_tmp,1);</p><p> set_sembuf_struct(&sem_tmp, 0, 0
62、, 0);/*0*/</p><p> semop(semid_full1, &sem_tmp,1);</p><p> set_sembuf_struct(&sem_tmp, 0, 0, 0);/*0*/</p><p> semop(semid_full2, &sem_tmp,1);</p><p> se
63、t_sembuf_struct(&sem_tmp, 0, 1, 0);/*1*/ </p><p> semop(semid_mutex, &sem_tmp,1);</p><p><b> return 0;</b></p><p><b> }</b></p><p>
64、 /*下面的P,V是對(duì)系統(tǒng)調(diào)用的簡(jiǎn)單封裝*/</p><p> int P(int semid)</p><p><b> {</b></p><p> struct sembuf p_buf;</p><p> p_buf.sem_num = 0;</p><p> p_buf.sem
65、_op = -1;</p><p> p_buf.sem_flg = 0;</p><p> if(semop(semid, &p_buf, 1)==-1)/*semop參見(jiàn)課件ppt*/</p><p><b> {</b></p><p> perror ("p (semid) falsed
66、");</p><p><b> exit (1);</b></p><p><b> }</b></p><p><b> else</b></p><p><b> return 0;</b></p><p>
67、<b> }</b></p><p> int V(int semid)</p><p><b> {</b></p><p> struct sembuf v_buf;/*struct 參見(jiàn)課件ppt*/</p><p> v_buf.sem_num = 0;</p>
68、<p> v_buf.sem_op = 1;</p><p> v_buf.sem_flg = 0;</p><p> if(semop(semid, &v_buf, 1)==-1) {</p><p> perror (" v (semid) failed");</p><p><b&g
69、t; exit (1);</b></p><p><b> } </b></p><p><b> else</b></p><p><b> return 0;</b></p><p><b> }</b></p>&
70、lt;p> int father()</p><p><b> {</b></p><p> int semid_empty, semid_full1,semid_full2, semid_mutex;/*信號(hào)量集合id*/</p><p> int rc1,rc2,rc3;</p><p> semid
71、_mutex = semget(SEMKEY_MUTEX,1, 0777);/*獲取全局信號(hào)量id*/</p><p> semid_empty = semget(SEMKEY_EMPTY,1, 0777);</p><p> semid_full1 = semget(SEMKEY_FULL1,1, 0777);</p><p> semid_full2 =
72、semget(SEMKEY_FULL2,1, 0777);</p><p> rc1=semctl(semid_empty,0,GETVAL);</p><p> rc2=semctl(semid_mutex,0,GETVAL);</p><p> if(rc1==0)</p><p><b> { </b>&l
73、t;/p><p> return 1; //不能放 則等待 </p><p><b> }</b></p><p> if(rc2==0 )</p><p><b> {</b></p><p><b> return 1;&l
74、t;/b></p><p><b> }</b></p><p> P(semid_empty);/*對(duì)私有信號(hào)量作P操作*/</p><p> P(semid_mutex);</p><p> printf("there is %d places to put apples\n",rc
75、1);</p><p> printf("PUT AN APLLE\n"); </p><p> V(semid_mutex);</p><p> V(semid_full1);</p><p> rc3=semctl(semid_full1,0,GETVAL);</p><p> pri
76、ntf("daughter can get %d apples\n",rc3);</p><p><b> return 0;</b></p><p><b> }</b></p><p> int mother()</p><p> { int semid_empty,
77、 semid_full1,semid_full2, semid_mutex;/*信號(hào)量集合id*/</p><p> int rc1,rc2,rc3;</p><p> semid_mutex = semget(SEMKEY_MUTEX,1, 0777);/*獲取全局信號(hào)量id*/</p><p> semid_empty = semget(SEMKEY_EM
78、PTY,1, 0777);</p><p> semid_full1 = semget(SEMKEY_FULL1,1, 0777);</p><p> semid_full2 = semget(SEMKEY_FULL2,1, 0777);</p><p> rc1=semctl(semid_empty,0,GETVAL);</p><p&g
79、t; rc2=semctl(semid_mutex,0,GETVAL);</p><p> if(rc1==0) </p><p><b> { </b></p><p> return 1; //不能放 則等待 </p><p><b> }</b><
80、;/p><p> else if(rc2==0)</p><p><b> { </b></p><p><b> return 1;</b></p><p><b> }</b></p><p> P(semid_empty);/*對(duì)私有信號(hào)量作
81、P操作*/</p><p> P(semid_mutex);</p><p> printf("there is %d places to put oranges\n",rc1);</p><p> printf("PUT AN ORANGE!!!\n");</p><p> V(semid_m
82、utex);</p><p> V(semid_full2);</p><p> rc3=semctl(semid_full2,0,GETVAL);</p><p> printf("son can get %d oranges\n",rc3);</p><p><b> return 0;</b&
83、gt;</p><p><b> }</b></p><p><b> int son()</b></p><p><b> {</b></p><p> int semid_empty, semid_full1,semid_full2, semid_mutex;/*信
84、號(hào)量集合id*/</p><p> int rc1,rc2;</p><p> semid_mutex = semget(SEMKEY_MUTEX,1, 0777);/*獲取全局信號(hào)量id*/</p><p> semid_empty = semget(SEMKEY_EMPTY,1, 0777);</p><p> semid_ful
85、l1 = semget(SEMKEY_FULL1,1, 0777);</p><p> semid_full2 = semget(SEMKEY_FULL2,1, 0777);</p><p> rc2=semctl(semid_full1,0,GETVAL);</p><p> rc1=semctl(semid_full2,0,GETVAL);</p&g
86、t;<p> if(rc1==0) </p><p><b> {</b></p><p> return 1; //不能放 則等待 </p><p><b> }</b></p><p> P(semid_full2);/*對(duì)私有信號(hào)量作P操
87、作*/</p><p> P(semid_mutex);</p><p> printf("SUM:%d apples and %d oranges\n",rc2,rc1);</p><p> printf("there is %d oranges to get \n",rc1);</p><p&g
88、t; printf("GET AN ORANGE !!!\n");</p><p> V(semid_empty);</p><p> V(semid_mutex);</p><p><b> return 0;</b></p><p><b> }</b></p
89、><p> int daughter()</p><p><b> {</b></p><p> int semid_empty, semid_full1,semid_full2, semid_mutex;/*信號(hào)量集合id*/</p><p> int rc1,rc2,rc3;</p><p&g
90、t; semid_mutex = semget(SEMKEY_MUTEX,1, 0777);/*獲取全局信號(hào)量id*/</p><p> semid_empty = semget(SEMKEY_EMPTY,1, 0777);</p><p> semid_full1 = semget(SEMKEY_FULL1,1, 0777);</p><p> semid
91、_full2 = semget(SEMKEY_FULL2,1, 0777);</p><p> rc2=semctl(semid_full1,0,GETVAL);</p><p> rc1=semctl(semid_full2,0,GETVAL);</p><p> if(rc2==0)</p><p><b> {<
92、/b></p><p> return 1; //不能放 則等待 </p><p><b> }</b></p><p> P(semid_full1); </p><p> P(semid_mutex);</p><p> printf("
93、SUM:%d apples and %d oranges\n",rc2,rc1);</p><p> printf("there is %d apples to get \n",rc2);</p><p> printf("GET AN APPLE\n");</p><p> V(semid_empty);
94、</p><p> V(semid_mutex);</p><p><b> return 0;</b></p><p><b> }</b></p><p> int main()</p><p><b> {</b></p>
95、<p><b> int pid;</b></p><p> int i = 0, x;</p><p><b> begin();</b></p><p> pid = fork();</p><p> if(fork()==0)</p><p><
96、;b> {</b></p><p><b> father();</b></p><p><b> }</b></p><p> if(fork()==0)</p><p><b> {</b></p><p><b&g
97、t; mother();</b></p><p><b> }</b></p><p> if(fork()==0)</p><p><b> {</b></p><p> daughter();</p><p><b> }</b&g
98、t;</p><p> if(fork()==0)</p><p><b> {</b></p><p><b> son();</b></p><p><b> }</b></p><p><b> return 0;</b&
99、gt;</p><p><b> }</b></p><p><b> 八、調(diào)試與運(yùn)行</b></p><p> 首先,利用g++ ks.cpp編譯一次,若有錯(cuò)誤,則根據(jù)錯(cuò)誤提示對(duì)程序進(jìn)行修改。其次,編譯通過(guò)后執(zhí)行./a.out,若原先已有共享緩沖區(qū),則刪除原先緩沖區(qū),再創(chuàng)建新的共享緩沖區(qū).,然后再次執(zhí)行./a.o
100、ut,觀察系統(tǒng)進(jìn)程調(diào)度。</p><p><b> 運(yùn)行結(jié)果如下:</b></p><p><b> 九、設(shè)計(jì)總結(jié)</b></p><p> 在設(shè)計(jì)這個(gè)題目之前,由于對(duì)進(jìn)程同步的實(shí)現(xiàn)方法不是很了解,對(duì)于怎樣具體實(shí)現(xiàn)進(jìn)程同步有很大的疑問(wèn),所以在網(wǎng)上進(jìn)行了查找,但幾經(jīng)搜索都沒(méi)有找到合適的材料。就是在這種雖然有一定基礎(chǔ),但
101、并不能完全依靠的前提下,自己通過(guò)查找相關(guān)的書(shū)籍,了解本次設(shè)計(jì)中涉及到的數(shù)據(jù)結(jié)構(gòu)后,成功實(shí)現(xiàn)了進(jìn)程同步的功能。從對(duì)進(jìn)程同步只是一個(gè)概念上的認(rèn)識(shí),到最終將它的功能實(shí)現(xiàn)這一過(guò)程,我感到非常滿意與欣慰,因?yàn)檫@些都是通過(guò)自己的努力一步一步實(shí)現(xiàn)的。</p><p> 同時(shí),本次課程設(shè)計(jì)也存在著不足之處。雖然熟悉和了解了程序中各數(shù)據(jù)結(jié)構(gòu)的定義和創(chuàng)建,但是在一些細(xì)節(jié)問(wèn)題上還沒(méi)有一個(gè)很明確的認(rèn)識(shí),只是機(jī)械的合法的使用它。當(dāng)然,在
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)(文件系統(tǒng)管理)
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程通信與進(jìn)程同步機(jī)制實(shí)踐
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程通信與進(jìn)程同步機(jī)制實(shí)踐
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程管理系統(tǒng)
- linux操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程的軟中斷通信與管道通信
- linux課程設(shè)計(jì)報(bào)告--linux操作系統(tǒng)應(yīng)用
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)
- 操作系統(tǒng)模擬進(jìn)程課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度子系統(tǒng)模擬實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)說(shuō)明書(shū)--基于linux的進(jìn)程之間通信
- 操作系統(tǒng)課程設(shè)計(jì)——操作系統(tǒng)課程設(shè)計(jì)模擬操作系統(tǒng)
- linux系統(tǒng)管理習(xí)題
- 生產(chǎn)系統(tǒng)管理課程設(shè)計(jì)
- 課程設(shè)計(jì)--超市銷(xiāo)售系統(tǒng)管理
- 進(jìn)程調(diào)度算法 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)-管道通信課程設(shè)計(jì)
- linux操作系統(tǒng)基礎(chǔ)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告-linux頁(yè)面換入換出分析、進(jìn)程管理器
評(píng)論
0/150
提交評(píng)論