




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
操作系統(tǒng)實驗報告專業(yè):物聯(lián)網(wǎng)工程實驗三一個進程啟動另一個程序的執(zhí)行【實驗?zāi)康摹吭贚inux環(huán)境系統(tǒng)中,execve系統(tǒng)調(diào)用用于執(zhí)行一個程序(可執(zhí)行二進制文件或腳本)。exec函數(shù)家族,包括execl、execlp、execle、execv、execvp,是execve系統(tǒng)調(diào)用的前端。本實驗要求學(xué)生學(xué)習(xí)在一個進程中啟動另一個程序執(zhí)行的基本方法,了解execve系統(tǒng)調(diào)用和exec函數(shù)家族的使用方法?!緦嶒瀮?nèi)容】(一)初步認(rèn)識“在一個進程中啟動另一個程序的執(zhí)行”。1、編輯一個源程序dummy.c,并編譯為可執(zhí)行程序dummy。//dummy.c#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>intmain(intargc,char**argv){intresult;printf("\nYouarenowinarunningprogram\"%s\".\n",argv[0]);printf("MyPIDis%d.Myparent'sPIDis%d.\n",getpid(),getppid());printf("Pleaseinputaninteger(0-255),whichwillbereturnedtomyparentprocess:\n");scanf("%d",&result);printf("Goodbye.\n\n");return(result&0377);}}2、再編輯一個源程序exec_test.c,并編譯為可執(zhí)行程序exec_test。//exec_test.c#include<stdio.h>#include<stdlib.h>#include<error.h>#include<sys/types.h>#include<unistd.h>#include<sys/wait.h>intmain(intargc,char**argv){intresult;result=fork();if(result<0){perror("Failedtocreatechild");exit(1);}elseif(result==0){//Child1char*cmd="./dummy";printf("Childprocess'sPIDis%d.Myparent'sPIDis%d.\n",getpid(),getppid());printf("Childprocessisabouttoexecute\"%s\"\n\n",cmd);result=execlp(cmd,cmd,NULL);if(result==-1){perror("Inchildprocess,failedtoexecaprogram");}exit(0);}else{//parentintstatus;printf("Parentprocess'sPIDis%d.\n",getpid());printf("Parentprocessiswaiting...\n");wait(&status);printf("Inparentprocess,status=0x%x,WEXITSTATUS(status)=%d(i.e.0x%x)\n",\status,WEXITSTATUS(status),WEXITSTATUS(status));}return(EXIT_SUCCESS);}先執(zhí)行dummy,觀察、分析執(zhí)行結(jié)果;然后執(zhí)行程序exec_test,觀察、分析執(zhí)行結(jié)果。(注意,兩個可執(zhí)行程序都在當(dāng)前目錄下)(二)實現(xiàn)一個簡單的命令解釋外殼(Shell)。1、基本功能:(1)從標(biāo)準(zhǔn)輸入讀取一行字符串,其中包含欲執(zhí)行的命令和它的命令行參數(shù)(如果有的話)。提示:需要將輸入的一行字符串進行拆分,以空格、制表符(\t)作為分隔符,分解為命令、命令行參數(shù)(零個或多個)。如果用戶輸入的命令是“quit”,則退出執(zhí)行。(2)創(chuàng)建一個子進程。(3)在子進程中,執(zhí)行在(1)讀入的命令,如果有命令行參數(shù),也要傳遞。(4)在父進程中,等待子進程結(jié)束,然后打印子進程的返回值。(5)在父進程中,控制轉(zhuǎn)移至(1)。【實驗要求】按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。【實驗設(shè)計】dummy程序:結(jié)果顯示了該進程的PID和父進程的PID,并且將一個值返回給了父進程。exec_test程序:在子進程中鍵入的數(shù)值返回了父進程,并顯示了出來(19).實現(xiàn)一個簡單的命令解釋外殼(Shell)源代碼://example#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>#include<errno.h>#include<sys/wait.h>#include<string.h>intmain(){ intpid; intrtn;//子進程的返回值 intexec_errorno; charcommand[256]; char*p; char*q; char*c[20]; inti=0,j=0; while(1){ //從終端讀取要執(zhí)行的命令 printf(">"); command[0]='\0'; p=fgets(command,256,stdin); if(p==NULL){ perror("Errorinfgets()."); exit(-1); } //Deletethelastchar(newline)inthestringreturnedbyfgets() command[strlen(command)-1]='\0'; p=command; q=p; //Quitifuserinputs"quit" if(!strcmp(command,"quit")){ break; } //Createachildprocesstoexecutecommand pid=fork(); if(pid<0){ perror("Failedwhilecallingfork."); exit(-1); } elseif(pid==0){ //子進程執(zhí)行此命令 for(;;){ c[i]=strtok(p,""); if(c[i]==NULL){ break; } i++; p=NULL; } p=c[0]; for(j=0;j<i;j++){ printf("%s\n",c[j]); } exec_errorno=execvp(p,c); //如果exec函數(shù)返回,表明沒有正常執(zhí)行命令 //只有在這種情況下,才會執(zhí)行下面的打印錯誤信息 perror(command); exit(exec_errorno); } else{ //父進程,等待子進程結(jié)束,并打印子進程的返回值 wait(&rtn); printf("\nValuereturnedfromchildprocess,rtn=%d\n",rtn); printf("WEXITSTATUS(rtn)=%d\n",WEXITSTATUS(rtn)); } } return0; } 【實驗測試結(jié)果及分析】此程序通過對execvp()函數(shù)的調(diào)用,使得通過輸入命令被執(zhí)行。輸入的命令用fgets()存入command字符串中,然后反復(fù)調(diào)用strtok()函數(shù),分割所得字符串,達(dá)到將命令分割的目的,使得多命令行參數(shù)得以實現(xiàn)?!具\行結(jié)果】【收獲及體會】實驗指導(dǎo)書在實驗調(diào)試和分析的過程中,我越來越懂得自學(xué)能力和自我獨立解決問題的重要性。在以后的實驗和學(xué)習(xí)中,我會不斷的加強對這方面的訓(xùn)練。【參考資料】實驗指導(dǎo)書實驗五線程間的互斥與同步【實驗?zāi)康摹坷斫釶OSIX線程(Pthread)互斥鎖和POSIX信號量機制,學(xué)習(xí)它們的使用方法;編寫程序,實現(xiàn)多個POSIX線程的同步控制?!緦嶒瀮?nèi)容】創(chuàng)建4個POSIX線程。其中2個線程(A和B)分別從2個數(shù)據(jù)文件(data1.txt和data2.txt)讀取10個整數(shù).線程A和B把從文件中讀取的逐一整數(shù)放入一個緩沖池.緩沖池由n個緩沖區(qū)構(gòu)成(n=5,并可以方便地調(diào)整為其他值),每個緩沖區(qū)可以存放一個整數(shù)。另外2個線程,C和D,各從緩沖池讀取10數(shù)據(jù)。線程C、D每讀出2個數(shù)據(jù),分別求出它們的和或乘積,并打印輸出。提示:(1)在創(chuàng)建4個線程當(dāng)中,A和B是生產(chǎn)者,負(fù)責(zé)從文件讀取數(shù)據(jù)到公共的緩沖區(qū),C和D是消費者,從緩沖區(qū)讀取數(shù)據(jù)然后作不同的計算(加和乘運算)。使用互斥鎖和信號量控制這些線程的同步。不限制線程C和D從緩沖區(qū)得到的數(shù)據(jù)來自哪個文件。(2)在生產(chǎn)者線程中,確保從文件讀出數(shù)據(jù)以后,再去“生產(chǎn)”。在開始設(shè)計和實現(xiàn)之前,務(wù)必認(rèn)真閱讀下列內(nèi)容:課本6.8.4節(jié);講義(課堂PPT)中關(guān)于“生產(chǎn)者-消費者問題”的部分;課本第6章后面的編程項目——生產(chǎn)者-消費者問題。【實驗要求】按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。【實驗設(shè)計】#include<stdio.h>#include<pthread.h>#include<semaphore.h>#include<stdlib.h>#include<unistd.h>#defineNUM_THREADS5intbuffer[5];intin=0;//寫入標(biāo)識intout=0;//讀取標(biāo)識pthread_mutex_tmutex2in,mutex2out;sem_twri,rea;void*write1(void*arg){FILE*fp1=fopen("data1.txt","r");intw1;inti1=0;for(i1=0;i1<10;i1++){//P(寫資源)sem_wait(&wri);//從文件中讀取一個文件if(fscanf(fp1,"%d",&w1));else{printf("I'mthepthreadwrite1,Ican'treadanumfromdata1.txt.\n");exit(1);}//放入緩存對應(yīng)位置//加in鎖pthread_mutex_lock(&mutex2in);buffer[in]=w1;in=(in+1)%NUM_THREADS;//解in鎖pthread_mutex_unlock(&mutex2in);//V(讀資源)sem_post(&rea);}//線程結(jié)束fclose(fp1);pthread_exit(NULL);}void*write2(void*arg){intw2;FILE*fp2=fopen("data2.txt","r");inti2=0;for(i2=0;i2<10;i2++){//P(寫資源)sem_wait(&wri);//從文件中讀取一個文件if(fscanf(fp2,"%d",&w2));else{printf("I'mthepthreadwrite1,Ican'treadanumfromdata1.txt.\n");exit(1);}//放入緩存對應(yīng)位置//加in鎖pthread_mutex_lock(&mutex2in);buffer[in]=w2;in=(in+1)%NUM_THREADS;//解in鎖pthread_mutex_unlock(&mutex2in);//V(讀資源)sem_post(&rea);}//線程結(jié)束fclose(fp2);pthread_exit(NULL);}void*plus(void*arg){//加進程inta1,b1,c1;intp=0;for(p=0;p<5;p++){//P(讀資源)sem_wait(&rea);//從緩沖中讀取一個文件//加out鎖pthread_mutex_lock(&mutex2out);a1=buffer[out];out=(out+1)%NUM_THREADS;//解out鎖pthread_mutex_unlock(&mutex2out);//V(寫資源)sem_post(&wri);//P(讀資源)sem_wait(&rea);//加out鎖pthread_mutex_lock(&mutex2out);//從緩沖中讀取一個文件b1=buffer[out];out=(out+1)%NUM_THREADS;//解out鎖pthread_mutex_unlock(&mutex2out);c1=a1+b1;//計算求和并且輸出到屏幕printf("I'mthepthreadofplusing,thisismyresult:\t%d+%d=%d.\n",a1,b1,c1);//V(寫資源)sem_post(&wri);}//線程結(jié)束pthread_exit(NULL);}void*mult(void*arg){//乘進程inta2,b2,c2;intp=0;for(p=0;p<5;p++){//P(讀資源)sem_wait(&rea);//加out鎖pthread_mutex_lock(&mutex2out);//從緩沖中讀取一個文件a2=buffer[out];out=(out+1)%NUM_THREADS;//解out鎖pthread_mutex_unlock(&mutex2out);//V(寫資源)sem_post(&wri);//P(讀資源)sem_wait(&rea);//加out鎖pthread_mutex_lock(&mutex2out);//從緩沖中讀取一個文件b2=buffer[out];out=(out+1)%NUM_THREADS;//解out鎖pthread_mutex_unlock(&mutex2out);c2=a2*b2;//計算求積并且輸出到屏幕printf("I'mthepthreadofmultiplying,thisismyresult:\t%d*%d=%d.\n",a2,b2,c2);//V(寫資源)sem_post(&wri);}//線程結(jié)束pthread_exit(NULL);}intmain(){//互斥鎖初始化pthread_mutex_init(&mutex2in,NULL);pthread_mutex_init(&mutex2out,NULL);pthread_tA,B,C,D;interr;//信號量初始化sem_init(&wri,0,5);sem_init(&rea,0,0);//創(chuàng)建線程1err=pthread_create(&A,NULL,write1,NULL);if(err!=0){printf("can'tcreatemyThread1:%s\n",strerror(err));}//創(chuàng)建線程2err=pthread_create(&B,NULL,write2,NULL);if(err!=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 游樂設(shè)備管理規(guī)定
- 油氣儲層力學(xué)性質(zhì)與流體流動
- 油品存放地安全操作規(guī)程
- Photoshop平面設(shè)計基礎(chǔ) 課件 任務(wù)6.3 攝影雜志封面
- 企業(yè)培訓(xùn)員工心態(tài)課件
- 創(chuàng)新型企業(yè)部分股權(quán)激勵與業(yè)績考核合同
- 離婚雙方車輛房產(chǎn)分割及共同財產(chǎn)清算協(xié)議
- 貨架行業(yè)投標(biāo)方案
- 餐飲業(yè)廚師職業(yè)規(guī)劃與就業(yè)合同
- 車輛質(zhì)押貸款合同違約責(zé)任協(xié)議
- 員工帶小孩管理制度
- 衛(wèi)生法律法規(guī)典型案例解析
- 水泥碳排放管理制度
- 2025年目標(biāo)管理實施與評估考試試卷及答案
- 2024江西制造職業(yè)技術(shù)學(xué)院招聘筆試真題帶答案詳解
- 2025年新高考1卷(新課標(biāo)Ⅰ卷)語文試卷
- 永輝超市員工培訓(xùn)協(xié)議書
- 2025年交通基礎(chǔ)設(shè)施建設(shè)投融資模式創(chuàng)新與政策解讀
- 2025年青浦區(qū)區(qū)管企業(yè)統(tǒng)一招聘55人筆試參考題庫附帶答案詳解
- 2025年河南省鐵路建設(shè)投資集團有限公司招聘筆試參考題庫附帶答案詳解
- 廣東省廣州市荔灣區(qū)統(tǒng)考2025年七下數(shù)學(xué)期末考試試題含解析
評論
0/150
提交評論