華科操作系統(tǒng)實驗報告_第1頁
華科操作系統(tǒng)實驗報告_第2頁
華科操作系統(tǒng)實驗報告_第3頁
華科操作系統(tǒng)實驗報告_第4頁
華科操作系統(tǒng)實驗報告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、課 程 實 驗 報 告課程名稱: 操 作 系 統(tǒng) 原 理 專業(yè)班級: 學 號: 姓 名: 指導教師: 報告日期: 計算機科學與技術(shù)學院目錄目錄2實驗一:線程的同步3一、實驗目的3二、實驗內(nèi)容3三、實驗心得6實驗二:謄抄實驗的進程實現(xiàn)7一、實驗目的7二、實驗內(nèi)容7三、實驗心得10實驗三:Linux文件目錄操作12一、實驗目的12二、實驗內(nèi)容12三、實驗心得14實驗一:線程的同步一、實驗目的1、掌握Linux系統(tǒng)用戶界面中鍵盤命令的使用。2、學會一種Linux下的編程環(huán)境。3、掌握Linux下進(線)程的概念。4、了解Linux進程同步與通信的主要機制,并通過信號燈操作實現(xiàn)進程間的同步與互斥。二、

2、實驗內(nèi)容1、程序要求 兩個線程,共享公共變量a 線程1負責計算(+1) 線程2負責打印2、運行環(huán)境軟件配置(含操作系統(tǒng)版本):ubuntu - 14.10硬件:PC3、源程序源程序:#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <sys/types.h>#include <sys/sem.h>#include <sys/ipc.h>int semid;int a=0;typedef union senumint val;struct se

3、mid_ds *buf;unsigned short *array;struct seminfo *_buf;SEM_CTL_UN;void P(int semid,int index) struct sembuf sem; sem.sem_num = index; sem.sem_op = -1;/P sem.sem_flg = 0;/biaoji semop(semid,&sem,1);void V(int semid,int index) struct sembuf sem; sem.sem_num = index; sem.sem_op = 1; sem.sem_flg = 0

4、; semop(semid,&sem,1);void* thread1(void *arg)int i=0;for(i;i<8;i+)P(semid,0);printf("add:n");a=a+1;printf("a=%dn",a);V(semid,1);void* thread2(void *arg)int i=0;for(i;i<8;i+) P(semid,1);printf("print:n");printf("a=%dn",a);V(semid,0);int main()pthread

5、_t id1,id2;int ret1,ret2;key_t key;SEM_CTL_UN semctlarg1;SEM_CTL_UN semctlarg2; key=1;semid=semget(key,2,IPC_CREAT|0666);/創(chuàng)建semctlarg1.val=1;semctlarg2.val=0; semctl(semid,0,SETVAL,semctlarg1);/初始化semctl(semid,1,SETVAL,semctlarg2);ret1=pthread_create(&id1,NULL,thread1,NULL);ret2=pthread_create(&

6、amp;id2,NULL,thread2,NULL);pthread_join(id1,NULL);pthread_join(id2,NULL);4、實驗結(jié)果實驗結(jié)果截圖如下:圖1-1 線程同步三、實驗心得通過本次實驗,我掌握了Linux系統(tǒng)用戶界面中鍵盤命令的使用,熟悉了Linux下的編程環(huán)境,進一步理解并掌握了線程的概念,了解了線程同步與通信的主要機制,并能通過信號燈操作實現(xiàn)線程間的同步和互斥。由于本次實驗較為簡單,主要目的是熟悉Linux編程環(huán)境,所以代碼量較小,難度不大,實驗過程中沒有遇到太大問題。通過實驗熟悉了線程的創(chuàng)建和信號燈的設置,為以后的實驗打下了基礎(chǔ)。實驗二:謄抄實驗的進程實

7、現(xiàn)一、實驗目的在Linux下編程實現(xiàn)謄抄問題,通過多個進(線)程合作將源文件復制到目標文件中。二、實驗內(nèi)容1、程序要求main、get、copy、put四個可執(zhí)行程序(或線程)。main:初始化信號燈、緩沖區(qū),創(chuàng)建三個子進程,等待子進程運行結(jié)束后做 善后處理;get : 讀源文件,送入緩沖區(qū)S;copy:從S復制信息到T;put : 將T中信息寫入目標文件。2、運行環(huán)境軟件配置(含操作系統(tǒng)版本):ubuntu - 14.10硬件:PC3、源程序源程序:Get:#include"touwenjian.h" int main(void) int i=0; int shmid1;

8、 char *s,*t,str="wangzihao!" semid = semget(IPCKEY,4,IPC_CREAT|0666); shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666); s=(char *)shmat(shmid1,NULL,NULL); do P(semid,1); *s=stri; printf("getn"); i+; V(semid,0); while(s0!='0'); copy:#include"touwenjian.h" int

9、 main(void) int j=0; int shmid1,shmid2; char *s,*t; semid = semget(IPCKEY,4,IPC_CREAT|0666); shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666); s=(char *)shmat(shmid1,NULL,NULL); shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666); t=(char *)shmat(shmid2,NULL,NULL); do P(semid,0); P(semid,3); st

10、rcpy(t,s); printf("copyn"); V(semid,2); V(semid,1); while(t0!='0'); Put:#include"touwenjian.h" int main(void) int k=0; int shmid1,shmid2; char *s,*t; semid = semget(IPCKEY,4,IPC_CREAT|0666); shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666); t=(char *)shmat(shmid2,NULL

11、,NULL); do /*if(t0='0')break;*/ P(semid,2); if(t0!='0')printf("put->%cn",*t); else printf("put->0n"); V(semid,3); while(t0!='0'); 頭文件:#include <sys/types.h>#include <sys/sem.h>#include <semaphore.h>#include <stdio.h>#include &

12、lt;stdlib.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/shm.h>#define LOOPS 10#define IPCKEY (key_t) 0x11#define SHMKEY1 (key_t)0x222#define SHMKEY2 (key_t)0x333void P(int semid,int index); void V(int semid,int index); int semid; void P(int semid,int index) /對標記符為semid的

13、信號量集 中的第index個 /元素進行P操作(信號量操作要用到semop()函數(shù)) struct sembuf sem; /此數(shù)據(jù)類型在sys/sem.h中定義 sem.sem_num = index;/對信號量集中的第index個元素進行P操作 sem.sem_op = -1;/表示P操作 sem.sem_flg = 0;/操作標記:0或IPC_NOWAIT等 semop(semid,&sem,1);/1:要操作1個信號量void V(int semid,int index) struct sembuf sem;sem.sem_num =index;sem.sem_op=1;sem

14、.sem_flg=0;semop(semid,&sem,1);return;4、實驗結(jié)果實驗結(jié)果截圖如下:圖2-1 謄抄問題進程實現(xiàn)三、實驗心得本次實驗實現(xiàn)了謄抄問題的進程實現(xiàn),這是一個經(jīng)典的進程問題,通過進程合作將源文件復制到目標文件中。本次實驗相較于第一次實驗較為復雜,涉及到了文件操作的相關(guān)系統(tǒng)調(diào)用等操作。實驗中共享內(nèi)存的設置是重點。通過本次實驗,我對進程的合作有了更深的了解和認識,掌握了常用文件操作相關(guān)系統(tǒng)調(diào)用,熟悉了進程的同步于互斥,了解了exec函數(shù)組的用法??偠灾?,通過本次試驗我收獲頗豐。實驗三:Linux文件目錄操作一、實驗目的 了解并掌握Linux文件目錄結(jié)構(gòu)。二、實

15、驗內(nèi)容1、程序要求 1)、熟悉Linux文件系統(tǒng)的使用; 2)、了解Linux文件系統(tǒng)目錄結(jié)構(gòu); 3)、編程實現(xiàn)目錄查詢命令; 功能類似ls -l; 查詢指定目錄下的文件及子目錄信息; 顯示文件的類型、大小、時間等信息; 遞歸顯示子目錄中的文件信息;2、運行環(huán)境軟件配置(含操作系統(tǒng)版本):ubuntu - 14.10硬件:PC3、源程序源程序:#include <unistd.h>#include <sys/stat.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#

16、include <dirent.h>void printdir(char *dir, int depth)DIR *dp;struct dirent *entry;struct stat statbuf;if (dp=opendir(dir)=NULL)/打開目錄不成功printf("open the file error!n");return ;chdir(dir);char s1000;while (entry=readdir(dp)!=NULL)/讀到一個目錄項 if (strcmp(entry->d_name,".")=0|st

17、rcmp(entry->d_name, ".")=0)continue;/跳過strcpy(s,"./");strcat(s,entry->d_name);lstat(s, &statbuf);/讀取到了符號鏈接,lstat讀取符號鏈接本身的狀態(tài)信息if (S_ISDIR(statbuf.st_mode)/權(quán)限&類型 int i=0; for(i=0;i<depth;i+) printf(" "); printf("|-%sn", entry->d_name);/文件名 printdir(entry->d_name, depth+1);else int i=0; for(;i<depth;i+) printf(" "); printf("|-%s %ld%ldn", entry->d_name,statbuf.st_size, statbuf.st_ino); chdir("./");closedir(dp);void main(void) char dir1000; int depth=0;scanf("%s&quo

溫馨提示

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

最新文檔

評論

0/150

提交評論