長(zhǎng)春大學(xué)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)(學(xué)生版)_第1頁(yè)
長(zhǎng)春大學(xué)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)(學(xué)生版)_第2頁(yè)
長(zhǎng)春大學(xué)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)(學(xué)生版)_第3頁(yè)
長(zhǎng)春大學(xué)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)(學(xué)生版)_第4頁(yè)
長(zhǎng)春大學(xué)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)(學(xué)生版)_第5頁(yè)
已閱讀5頁(yè),還剩27頁(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、實(shí)驗(yàn)一 熟悉Linux環(huán)境一、實(shí)驗(yàn)?zāi)康模?、熟悉Linux下的基本操作命令,能在Linux下進(jìn)行常用的操作。 2、了解Linux下cc或gcc編譯器的使用,能運(yùn)行簡(jiǎn)單的C語(yǔ)言程序。二、實(shí)驗(yàn)知識(shí)預(yù)備(Linux相關(guān)的操作命令)1、 查看文件目錄的命令 lsls a 顯示指定目錄下所有子目錄與文件,包括隱藏文件ls -ld xh 以長(zhǎng)格式顯示指定目錄xh的信息 2、 改變當(dāng)前目錄(cd)、創(chuàng)建新目錄(mkdir)、顯示當(dāng)前目錄(pwd)的命令mkdir tjl 在當(dāng)前目錄下建立子目錄tjlcd tjl 進(jìn)入子目錄tjlcd . 返回上一級(jí)目錄pwd 顯示當(dāng)前工作目錄的絕對(duì)路徑3、 查看文件內(nèi)容的命

2、令 cat moremore linuxbook.txt 顯示linuxbook.txt文件的內(nèi)容cat testfile.txt 建立文件testfile.tex,文件內(nèi)容由鍵盤輸入,按下Ctrl+D組合鍵,存盤退出。4、 文件或目錄復(fù)制的命令 cp cp file1.txt file1.txt 將當(dāng)前目錄下的文件file1.txt復(fù)制成file2.txt5、刪除文件或目錄 rm rm ile1.txt 刪除當(dāng)前目錄下的文件file1.txt rm -i* 以交互方式刪除目錄下的所有非隱藏文件 rm -rf xh 強(qiáng)制刪除當(dāng)前目錄下的xh子目錄6、 inux下編輯文件的方法 gedit a.

3、c 打開編輯器編寫程序。7、 在Linux下編譯C程序的方法 先編譯: gcc a.c -o a 再執(zhí)行: ./a8、 取得幫助的方法man ls9、 權(quán)限操作 chmodChmod 屬性字 文件名 屬性字 u-擁有者 g-組用戶 o-其它用戶Chmod u+x tt (將文件tt加上擁有者可執(zhí)行)Chmod 700 a (設(shè)置文件a權(quán)限為可執(zhí)行)Chmod +x a (同上)三、實(shí)驗(yàn)內(nèi)容1.登錄linux系統(tǒng),熟悉終端窗口的操作,了解linux文件系統(tǒng)。2在終端練習(xí)相關(guān)的命令。3編寫程序:輸出顯示hello,everyone!的C語(yǔ)言程序,并編譯和執(zhí)行。附錄1 Linux 文件系統(tǒng)結(jié)構(gòu)1、

4、Linux目錄結(jié)構(gòu)Linux文件系統(tǒng)是樹狀的結(jié)構(gòu),系統(tǒng)中每個(gè)分區(qū)都是一個(gè)文件系統(tǒng),都有自己的目錄層次。Linux會(huì)將這些分屬不同分區(qū)的、單獨(dú)的文件系統(tǒng)按樹狀的方式形成一個(gè)系統(tǒng)的總目錄層次結(jié)構(gòu)。目錄提供了一個(gè)管理文件方便而有效的途徑,最上層是根目錄,其他的所有目錄都是從根目錄出發(fā)而生成的,如下圖。微軟的DOS和Windows也是采用樹狀結(jié)構(gòu),但是其樹狀結(jié)構(gòu)的根是磁盤分區(qū)的盤符,有幾個(gè)分區(qū)就有幾個(gè)樹狀結(jié)構(gòu),它們之間的關(guān)系是并列的。但在Linux中,無(wú)論操作系統(tǒng)管理幾個(gè)磁盤分區(qū),這樣的目錄樹都只有一個(gè)。 /root/bin /home /dev /etc /lib /sbin /tmp /use /

5、var/X11R6 /src /lib /local /man /bin圖 Linux的目錄結(jié)構(gòu)Linux使用標(biāo)準(zhǔn)的目錄結(jié)構(gòu),在安裝時(shí),安裝程序就已經(jīng)為用戶創(chuàng)建了文件系統(tǒng)和完整而固定的目錄結(jié)構(gòu),并指定了每個(gè)目錄的作用和其中的文件類型。2、 目錄功能簡(jiǎn)介 /bin 存放常用的二進(jìn)制執(zhí)行命令,如ls、mv、rm、 mkdir和telnet等。通常與/usr/bin的內(nèi)容是一樣的。 /dev 存放與設(shè)備有關(guān)的特殊文件?;镜腢NUX和Linux系統(tǒng)都將設(shè)備當(dāng)成文件,如/dev/fd0代表軟盤,/dev/cdrom則表示光盤。/etc 存放系統(tǒng)管理和配置文件,如LILO的參數(shù)、用戶的賬號(hào)和密碼,以及系

6、統(tǒng)的主要設(shè)置。/home 為用戶設(shè)置的目錄,比如用戶服務(wù)user的主目錄就是/home/usre。/lib 標(biāo)準(zhǔn)程序設(shè)計(jì)庫(kù),又叫動(dòng)態(tài)鏈接共享庫(kù),在Linux執(zhí)行或編譯內(nèi)核時(shí),均會(huì)用到。/slib 系統(tǒng)管理命令,存放的是系統(tǒng)管理員使用的管理程序,如fdisk、mount、 mkswap等。/boot 放置Linux核心與啟動(dòng)和關(guān)閉系統(tǒng)有關(guān)的文檔。/tmp 公用的臨時(shí)文件存儲(chǔ)點(diǎn)。/root 系統(tǒng)管理員的主目錄。/mnt 系統(tǒng)提供這個(gè)目錄是讓用戶臨時(shí)裝載其他的文件系統(tǒng),如裝載軟盤的文件系統(tǒng)。/lost+found 這個(gè)目錄平時(shí)是空的,系統(tǒng)非正常關(guān)機(jī)時(shí)而留下的文件會(huì)放在這里。類似于Windows下的*

7、.chk文件。/proc 虛擬的目錄,是系統(tǒng)內(nèi)存的映射??芍苯釉L問這個(gè)目錄來(lái)獲取系統(tǒng)信息。/var 這是系統(tǒng)在工作時(shí)預(yù)先設(shè)置的工作目錄,如各種服務(wù)的日志文件和收發(fā)的郵件等。/use 最龐大和最重要的目錄之一,要用到的應(yīng)用程序和文件幾乎都在這個(gè)目錄下。其中主要有:/usr/X11R6 存放X Windows的目錄。/usr/bin 眾多的應(yīng)用程序。/usr/sbin 超級(jí)用戶的一些管理程序。/usr/doc Linux系統(tǒng)的說(shuō)明文檔。/usr/include Linux下開發(fā)和編譯應(yīng)用程序所需要的頭文件。/usr/lib 存放常用的動(dòng)態(tài)鏈接訓(xùn)和軟件包的配置文件。/usr/man 存儲(chǔ)幫助文檔。/

8、usr/src Linux內(nèi)核的源代碼就放在這里,編譯內(nèi)核時(shí)必須用到。/usr/local/bin 本地增加的命令,通常用于軟件的升級(jí)。/usr/local/lib 本地增加的庫(kù)。實(shí)驗(yàn)二 進(jìn)程管理一、實(shí)驗(yàn)?zāi)康?1 )加深對(duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別。(2)進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的實(shí)質(zhì)。(3)學(xué)習(xí)通過進(jìn)程執(zhí)行新的目標(biāo)程序的方法。二、實(shí)驗(yàn)知識(shí)預(yù)備三、實(shí)驗(yàn)內(nèi)容1如何獲得當(dāng)前進(jìn)程和父進(jìn)程的ID號(hào),以及其用戶和組的相關(guān)信息( pid.c)。#include #include #include int main() pid_t myPid; pid_t myParentPid; gid_t myGi

9、d; uid_t myUid; myPid=getpid(); myParentPid=getppid(); myGid=getgid(); myUid=getuid(); printf(my process id is %dn,myPid); printf(my parents process id is %dn,myParentPid); printf(my user id is %dn,myUid); printf(my group id is %dn,myGid); return 0; 2一個(gè)程序如何運(yùn)行另一個(gè)程序 答案:調(diào)用execvpexccvp目標(biāo)在指定路徑中查找并執(zhí)行一個(gè)文件頭

10、文件#include函數(shù)Result=execvp(const char *file,const char *argv)參數(shù)File 要執(zhí)行的文件名Argv 字符串?dāng)?shù)組返回值-1 如果出錯(cuò)例:exec_test.c#include #include #include #include #include int main(int argc, char *argv) /以NULL結(jié)尾的字符串?dāng)?shù)組的指針,適合包含v的exec函數(shù)參數(shù) char *arg = ls, -a, NULL; /* * 創(chuàng)建子進(jìn)程并調(diào)用函數(shù)execl * execl 中希望接收以逗號(hào)分隔的參數(shù)列表,并以NULL指針為結(jié)束標(biāo)志

11、 */ if( fork() = 0 ) / in clild printf( 1-execl-n ); if( execl( /bin/ls, ls,-a, NULL ) = -1 ) perror( execl error ); exit(1); sleep(1); /* *創(chuàng)建子進(jìn)程并調(diào)用函數(shù)execv *execv中希望接收一個(gè)以NULL結(jié)尾的字符串?dāng)?shù)組的指針 */ if( fork() = 0 ) / in child printf(2-execv-n); if( execv( /bin/ls,arg) 0) perror(execv error ); exit(1); sleep(

12、1); /* *創(chuàng)建子進(jìn)程并調(diào)用 execlp *execlp中 *l希望接收以逗號(hào)分隔的參數(shù)列表,列表以NULL指針作為結(jié)束標(biāo)志 *p是一個(gè)以NULL結(jié)尾的字符串?dāng)?shù)組指針,函數(shù)可以DOS的PATH變量查找子程序文件 */ if( fork() = 0 ) / in clhild printf(3-execlp-n); if( execlp( ls, ls, -a, NULL ) 0 ) perror( execlp error ); exit(1); sleep(1); /* *創(chuàng)建子里程并調(diào)用execvp *v 望接收到一個(gè)以NULL結(jié)尾的字符串?dāng)?shù)組的指針 *p 是一個(gè)以NULL結(jié)尾的字符

13、串?dāng)?shù)組指針,函數(shù)可以DOS的PATH變量查找子程序文件 */ if( fork() = 0 ) printf(4-execvp-n); if( execvp( ls, arg ) 0 ) perror( execvp error ); exit( 1 ); sleep(1); /* *創(chuàng)建子進(jìn)程并調(diào)用execle *l 希望接收以逗號(hào)分隔的參數(shù)列表,列表以NULL指針作為結(jié)束標(biāo)志 *e 函數(shù)傳遞指定參數(shù)envp,允許改變子進(jìn)程的環(huán)境,無(wú)后綴e時(shí),子進(jìn)程使用當(dāng)前程序的環(huán)境 */ if( fork() = 0 ) printf(5-execle-n); if( execle(/bin/ls, ls

14、, -a, NULL, NULL) = -1 ) perror(execle error ); exit(1); sleep(1); /* *創(chuàng)建子進(jìn)程并調(diào)用execve * v 希望接收到一個(gè)以NULL結(jié)尾的字符串?dāng)?shù)組的指針 * e 函數(shù)傳遞指定參數(shù)envp,允許改變子進(jìn)程的環(huán)境,無(wú)后綴e時(shí),子進(jìn)程使用當(dāng)前程序的環(huán)境 */ if( fork() = 0 ) printf(6-execve-n); if( execve( /bin/ls, arg, NULL ) = 0) perror(execve error ); exit(1); return 0;2 如何建立新的進(jìn)程 Fork目標(biāo)創(chuàng)建進(jìn)

15、程頭文件#include函數(shù)Pid_t=fork(void)參數(shù)沒有返回值-1 如果出錯(cuò)0 返回到子進(jìn)程Pid 將進(jìn)程的進(jìn)程ID傳給父進(jìn)程例:#includemain()int fork_rv; print(before:my pid is %dn,getpid(); fork_rv=fork();if (fork_rv=-1) perror(fork);else if(fork_rv=0) printf(“I am the child.mypid=%dn”,getpid();else printf(“I am the parent,my child.is %dn”,fork_rv);運(yùn)行結(jié)果

16、: before:my pid is 5931 I am the parent,my child is 5932 I am the child, my pid=5932 3vfork(1)執(zhí)行程序fork.c,寫出輸出結(jié)果。#include #include #include #include int main()pid_t pid;/ pid 實(shí)質(zhì)是一個(gè)整數(shù)int n = 0;/定義一個(gè)局部變量pid = fork();/創(chuàng)建進(jìn)程if(pid 0)/返回值大于0,表示是父進(jìn)程,返回的子進(jìn)程IDwhile(1)printf(this is father processn);printf(fat

17、her n=%dn,n);sleep(1);/休眠一秒鐘return 0;(2)執(zhí)行程序vfork.c,寫出輸出結(jié)果。#include #include #include #include int main()pid_t pid;/ pid 實(shí)質(zhì)是一個(gè)整數(shù)int n = 0;/定義一個(gè)局部變量pid = vfork();/創(chuàng)建進(jìn)程if(pid =3)break;exit(1);if(pid 0)/返回值大于0,表示是父進(jìn)程,返回的子進(jìn)程IDwhile(1)printf(this is father processn);printf(father n=%dn,n);sleep(1);/休眠一秒鐘

18、return 0;4 終止進(jìn)程#include#includeint main()printf(using _exit-n);printf(This is the content in buffer);_exit(0); #include#includeint main()printf(using exit-n);printf(This is the content in buffer);exit(0); 5 父進(jìn)程如何等待子進(jìn)程的退出 Wait目標(biāo)等待進(jìn)程結(jié)束頭文件#include#include函數(shù)Pid_t result=wait(int * statusptr)參數(shù)Statusptr子

19、進(jìn)程的運(yùn)行結(jié)果返回值-1 如果出錯(cuò)Pid 結(jié)束進(jìn)程的進(jìn)程ID例:waitdemo.c#includemain()int newpid;int delay=2; int child_code(),parent_code(); printf(before:mypid is %dn,getpid(); if(newpid=fork()=-1) perror(fork);else if(newpid=0) child_code(delay);else parent_code(newpid);int child_code(int delay) printf(child %d here.will slee

20、p for %d secondsn,getpid(),delay); sleep(delay); printf(child done.about to exitn); exit(17);int parent_code(int childpid)int wait_rv; wait_rv=wait(0); printf(done waiting for %d.wait returned:%dn,childpid,wait_rv);運(yùn)行結(jié)果: befora:mypid is 10328 child 10329 here.will sleep for 2 seconds child done. Abo

21、ut to exit do waiting for 10329.wait returned:10329實(shí)驗(yàn)三 編程實(shí)現(xiàn)自己的shell一、實(shí)驗(yàn)?zāi)康牧私鈙hell的功能和其執(zhí)行程序的過程,編寫自己的shell程序。二、實(shí)驗(yàn)知識(shí)預(yù)備1. 通過PS命令查看用戶空間的進(jìn)程 $ps pid tty time cmd 1775 pts/1 00:00:17 bash 1981 pts/1 00:00:00 ps 可以設(shè)置參數(shù): -a :列出所在進(jìn)程,包括其他終端由其他用戶運(yùn)行 的程序。 -l:更出各個(gè)進(jìn)程的詳細(xì)狀態(tài)。2shell進(jìn)程控制和程序控制的一個(gè)工具Shell是一個(gè)管理進(jìn)程和運(yùn)行進(jìn)程的程序。有三個(gè)主

22、要功能。(1)運(yùn)行程序:shell是一個(gè)程序啟動(dòng)器。(2)管理輸入和輸出:shell將進(jìn)程的輸入和輸出連接到一個(gè)文件或其他的進(jìn)程。(3)編程3shell如何運(yùn)行程序的(1)用戶鍵入程序名 a.out(2)Shell建立一個(gè)新的進(jìn)程來(lái)運(yùn)行這個(gè)程序;(3)Shell將程序從磁盤載入(4)程序在它的進(jìn)程中運(yùn)行直到結(jié)束4如何編程實(shí)現(xiàn)自己的shell為了要寫一個(gè)shell,需要:(1)運(yùn)行一個(gè)程序(2)建立一個(gè)進(jìn)程(3)等待exit()三、實(shí)驗(yàn)內(nèi)容1編輯程序psh1.c,編譯并執(zhí)行。#include#include#include#define maxargs 20#define arglen 100i

23、nt main()char *arglistmaxargs+1; int numargs; char argbufarglen; char *makestring(); numargs=0; while(numargs0)arglistnumargs=0; execute(arglist); numargs=0; return 0;int execute(char *arglist)execvp(arglist0,arglist);perror(execvp failed);exit(1);char *makestring(char *buf)char *cp,*malloc(); bufst

24、rlen(buf)-1=0; cp=malloc(strlen(buf)+1); if(cp=0)fprintf(stderr,no memoryn); exit(1);strcpy(cp,buf);return cp;2編輯程序psh2.c,編譯并執(zhí)行。#include#include#include#define maxargs 20#define arglen 100int main()char *arglistmaxargs+1; int numargs; char argbufarglen; char *makestring(); numargs=0; while(numargs0)

25、arglistnumargs=0; execute(arglist); numargs=0; return 0;int execute(char *arglist)int pid,exitstatus;pid=fork();switch(pid)case -1:perror(fork failed); exit(1);case 0: execvp(arglist0,arglist); perror(excvp failed); exit(1);default:while(wait(&exitstatus)!=pid); printf(child exited with status %d,%d

26、n,exitstatus8,exitstatus&0377);char *makestring(char *buf)char *cp,*malloc(); bufstrlen(buf)-1=0; cp=malloc(strlen(buf)+1); if(cp=0)fprintf(stderr,no memoryn); exit(1);strcpy(cp,buf);return cp;3測(cè)試運(yùn)行結(jié)果(1)分別執(zhí)行psh1和psh2,執(zhí)行過程中,輸入ps命令寫出兩個(gè)程序運(yùn)行的結(jié)果。并分析區(qū)別和原因。(2)在執(zhí)行psh2過程程,輸入./psh1和ps命令寫程序運(yùn)行的結(jié)果。、實(shí)驗(yàn)四 線程通訊一、實(shí)驗(yàn)?zāi)?/p>

27、的用clone()創(chuàng)建四個(gè)輕進(jìn)程(線程),用參數(shù)指明共享內(nèi)存等資源,通過共享內(nèi)存模擬生產(chǎn)者-消費(fèi)者問題。二、實(shí)驗(yàn)知識(shí)預(yù)備1.int clone(int(*fn)(void *arg),void *stack, int flag,void *arg); fn-輕進(jìn)程所執(zhí)行的函數(shù);stack-所使用的棧 arg-是調(diào)用過程的對(duì)應(yīng)參數(shù) flag-是組合值 CLONE_VM:表示子進(jìn)程共享父進(jìn)程內(nèi)存 CLONE_FS:表示子進(jìn)程共享父進(jìn)程的文件系統(tǒng) CLONE_SIGHAND:表示子進(jìn)程共享父進(jìn)程的消息處理機(jī)制 CLONE_PID:指子進(jìn)程繼承父進(jìn)程的id號(hào)2. 信號(hào)燈類Sem_t sSem_init

28、(s,m,n)sem_wait(&s)Sem_post(&s)3.互斥鎖類Pthread_mutex_t mutexPthread_mutex_init(&mutex,NULL)Pthread_mutex_lock(&mutex)Pthread_mutex_unlock三、實(shí)驗(yàn)內(nèi)容1編輯程序 clone.c#include #include #include #include #include int producer(void *args);int consumer(void *args);pthread_mutex_t mutex;sem_t product;sem_t warehouse

29、;char buffer84;int bp=0;main(int argc,char *argv) pthread_mutex_init(&mutex,NULL); sem_init(&product,0,0); sem_init(&warehouse,0,8); int clone_flag,arg,retval; char *stack; clone_flag=CLONE_VM; int i; for(i=0;i2;i+) arg=i; stack=(char*)malloc(4096); retval=clone(void*)producer,&(stack4095),clone_fla

30、g, (void*)&arg); stack=(char*)malloc(4096); retval=clone(void*)consumer,&(stack4095),clone_flag, (void*)&arg); exit(1);int producer(void *args) int id=*(int*)args); int i; for(i=0;i10;i+) sleep(i+1); sem_wait(&warehouse); pthread_mutex_lock(&mutex); if(id=0) strcpy(bufferbp,aaa0); else strcpy(buffer

31、bp,bbb0); bp+; printf(producer %d produce %s in %dn,id,bufferbp,bp-1); pthread_mutex_unlock(&mutex); sem_post(&product); printf(producer %d is over!n,id); int consumer(void *args) int id=*(int*)args); int i; for(i=0;i10;i+) sleep(10-i); sem_wait(&product); pthread_mutex_lock(&mutex); bp-; printf(con

32、sumer %d get %s in %d n,id,bufferbp,bp+1); strcpy(bufferbp,zzz0); pthread_mutex_unlock(&mutex); sem_post(&warehouse); printf(consumer %d is over!n,id); 2編譯gcc clone.c -o cl lpthread3.執(zhí)行4分析執(zhí)行的結(jié)果實(shí)驗(yàn)五 進(jìn)程高級(jí)通訊一、實(shí)驗(yàn)?zāi)康模河肞ipe()創(chuàng)建一個(gè)管道,然后用fork()創(chuàng)建兩個(gè)生產(chǎn)進(jìn)程和兩個(gè)消費(fèi)進(jìn)程,它們之間能過pipe()傳遞信息。二、實(shí)驗(yàn)知識(shí)預(yù)備1. pid=fork() 創(chuàng)建一個(gè)子進(jìn)程,子進(jìn)程是

33、父進(jìn)程的完整復(fù)制。 返回值對(duì)于父進(jìn)程,是子進(jìn)程的ID,對(duì)于子進(jìn)程值為0。2Ret_val=pipe(fd) 創(chuàng)建一個(gè)管道文件,參數(shù)定義為int fd2 返回值為兩個(gè)文件描述符,放置在fd中。 fd0用于管道文件的讀fd1用于管道文件的寫3子進(jìn)程1: write(fd1,buf1,count1);子進(jìn)程2: read(fd0,buf2,count2)三、實(shí)驗(yàn)內(nèi)容1編輯程序 jc.c#include sys/types.h#include sys/file.h#include unistd.hchar r_buf4;char w_buf4;int pipe_fd2;pid_t pid1,pid2,

34、pid3,pid4;int producer(int id);int consumer(int id);int main(int argc,char *argv) if (pipe(pipe_fd)0) printf(pipe create error.n); exit(-1); else printf(pipe is created successfully!n); if(pid1=fork()=0) producer(1); if(pid2=fork()=0) producer(2); if(pid3=fork()=0) consumer(1); if(pid4=fork()=0) con

35、sumer(2); close(pipe_fd0); close(pipe_fd1);int i,pid,status;for(i=0;i4;i+) pid=wait(&status);exit(0);int producer(int id)printf(producer %d is running!n,id); close(pipe_fd0); int i=0; for(i=1;i10;i+)sleep(3); if(id=1) strcpy(w_buf,aaa0); else strcpy(w_buf,bbb0); if(write(pipe_fd1,w_buf,4)=-1) printf

36、(write to pipe errorn); close(pipe_fd1); printf(producer %d is over!n,id); exit(id); int consumer(int id)close(pipe_fd1);printf(consumer %d is running!n,id); if(id=1) strcpy(w_buf,ccc0); else strcpy(w_buf,ddd0);while(1) sleep(1); strcpy(r_buf,eee0); if(read(pipe_fd0,r_buf,4)=0) break; printf(consume

37、r %d get %s,while the w_buf is %sn,id,r_buf,w_buf); close( pipe_fd0 ); printf(consumer %d is over!n,id); exit(id); #include #include #include #include #include int producer(void *args);int consumer(void *args);pthread_mutex_t mutex;sem_t product;sem_t warehouse;char buffer84;int bp=0;main(int argc,c

38、har *argv) pthread_mutex_init(&mutex,NULL); sem_init(&product,0,0); sem_init(&warehouse,0,8); int clone_flag,arg,retval; char *stack; clone_flag=CLONE_VM; int i; for(i=0;i2;i+) arg=i; stack=(char*)malloc(4096); retval=clone(void*)producer,&(stack4095),clone_flag, (void*)&arg); stack=(char*)malloc(40

39、96); retval=clone(void*)consumer,&(stack4095),clone_flag, (void*)&arg); exit(1);int producer(void *args) int id=*(int*)args); int i; for(i=0;i10;i+) sleep(i+1); sem_wait(&warehouse); pthread_mutex_lock(&mutex); if(id=0) strcpy(bufferbp,aaa0); else strcpy(bufferbp,bbb0); bp+; printf(producer %d produce %s in %dn,id,bufferbp,bp-1); pthread_mutex_unlock(&mutex); sem_post(&product); printf(producer %d is over!n,id); int consumer(void *args) int id=*(int*)args); int i; for(i=0;i”),當(dāng)主程序無(wú)任務(wù)可調(diào)度時(shí)執(zhí)行,以空耗一個(gè)時(shí)間單

溫馨提示

  • 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)論