操作系统实验报告.docx_第1页
操作系统实验报告.docx_第2页
操作系统实验报告.docx_第3页
操作系统实验报告.docx_第4页
操作系统实验报告.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课 程 实 验 报 告课程名称: 操作系统 专业班级:计算机科学与技术1003班 学 号: 姓 名: 鲁辰 指导教师: 报告日期: 2012.12.26 计算机科学与技术学院目 录0 Linux系统生成31 实验一LINUX系统用户界面 实验二进(线)程同步与通信41.1 实验目的41.2 预备知识41.2.1 Linux下的信号灯及其P、V操作41.2.2 线程41.2.3 共享内存41.2.4 进程控制51.2.5 编译、编辑、调试51.3 实验内容51.4 运行结果51.5 源代码52在linux下编程实现P98 4-1172.1 实验目的72.2 预备知识72.2.1 并发程序的誊抄72.2.2 誊抄的实现72.3 实验内容82.4 运行结果82.5 源代码83 实验三 Linux文件目录操作133.1 实验目的、实验要求133.1.1实验目的133.1.2 实验要求133.2 实验内容133.3 预备知识143.3.1 Linux文件属性接口143.3.2 Linux目录结构接口143.4 运行结果153.5 源代码150 Linux系统生成步骤:(1)安装Linux系统Ubuntu10.12(2)使用ctrl+alt+T打开终端(3)设置root用户及root用户密码:使用的命令如图所示(4)进入root用户(5)把源码包解压到 /usr/src/linux-3.6.3(6)编译内核:使用make命令(7)安装编译好的内核(8)查看内核版本1 实验一LINUX系统用户界面 实验二进(线)程同步与通信1.1 实验目的1、掌握Linux系统用户界面中键盘命令的使用。2、学会一种Linux下的编程环境。3、掌握Linux下进(线)程的概念。4、了解Linux进程同步与通信的主要机制,并通过信号灯操作实现进程间的同步与互斥。1.2 预备知识1.2.1 Linux下的信号灯及其P、V操作表1. 1 P、V操作定义P操作V操作 void P(int semid,int index) struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0;/:操作标记:0或IPC_NOWAIT等 semop(semid,&sem,1);/1:表示执行命令的个数 return; void V(int semid,int index) struct sembuf sem; sem.sem_num = index; sem.sem_op = 1; sem.sem_flg = 0; semop(semid,&sem,1); return;1.2.2 线程表1. 2 线程相关函数线程创建pthread_create(pthread_t *thread, pthread_attr_t*attr,void *(*start_routine)(void *),void *arg);线程挂起pthread_join(pthread_t th, void *thread_retrun);1.2.3 共享内存使用共享内存是运行在同一计算机上的进程进行进程间通信的最快的方法,shmget与shmat 系统调用。1.2.4 进程控制 fork与execv系统调用1.2.5 编译、编辑、调试表1. 3 编译、编辑、调试编译cc o test -g test.c lpthread cc o sub1 sub1.c编辑vi调试gdb1.3 实验内容实验一的程序要求: 两个线程,共享公共变量a 线程1负责计算(+1) 线程2负责打印实现:1、线程的同步与互斥2、进程的同步与互斥3、子进程的创建1.4 运行结果图1. 1 运行结果1.5 源代码#include #include #include #include #include #define LOOPS 10void P(int semid,int index);void V(int semid,int index);int semid;int a=0; pthread_t p1,p2;void *subp1();void *subp2();void P(int semid,int index) struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0;/:操作标记:0或IPC_NOWAIT等 semop(semid,&sem,1);/1:表示执行命令的个数 return;void V(int semid,int index)struct sembuf sem; sem.sem_num = index; sem.sem_op = 1; sem.sem_flg = 0; semop(semid,&sem,1); return;void *subp1()int i,j;for (i=0; i LOOPS;i+) P(semid,0);printf(subp1:a=%dn,a);V(semid,1);return;void *subp2()int i,j;for (i=0;i0时,可以进行get操作通过设置信号灯1、2的初值和利用put对信号灯1做v操作、利用get对信号灯2做v操作,使得当信号灯1和信号灯2的资源个数均0时,可以进行copy操作通过设置信号灯3的初值和利用copy对信号灯3做v操作,使得当信号灯3的资源个数0时,可以进行put操作2.3 实验内容1、实现: main、get、copy、put 4个函数2、将这四个函数编译链接(使用makefile)2.4 运行结果图2. 3 运行结果使用./main打开程序2.5 源代码main.c#include#include#include#include#include#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 V(int semid,int index) struct sembuf sem; sem.sem_num = index;/*信号灯数组灯的一个索引,指明哪个信号灯*/ sem.sem_op = 1;/*加到当前信号灯的数值*/ sem.sem_flg = 0; semop(semid,&sem,1); return; void P(int semid,int index) struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0; semop(semid,&sem,1); return;int main(void) union semun semopts; int res,i; struct shmid_ds *buf; int cmd; int shmid1,shmid2; char *s,*t,ss=; pid_t p1,p2,p3; semid = semget(IPCKEY,4,IPC_CREAT|0666); semopts.val = 1; res = semctl(semid,0,SETVAL,semopts); semopts.val = 1; res = semctl(semid,1,SETVAL,semopts); semopts.val = 0; res = semctl(semid,2,SETVAL,semopts); semopts.val = 0; res = semctl(semid,3,SETVAL,semopts); shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666); s=(char *)shmat(shmid1,NULL,SHM_R|SHM_W); shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666); t=(char *)shmat(shmid2,NULL,SHM_R|SHM_W); if(p1=fork() = 0) execv(./get,NULL); else if(p2=fork() = 0) execv(./copy,NULL); else if(p3=fork()=0) execv(./put,NULL); p1=wait(&p1); p2=wait(&p2); p3=wait(&p3); /*for(i=0;i3;i+) while(-1!=wait() ; */ if(semctl(semid,0,IPC_RMID,0)0) printf(error); shmctl(shmid1,IPC_RMID,0); shmctl(shmid2,IPC_RMID,0); return 0;get.c#include#include#include#include#include#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 V(int semid,int index) struct sembuf sem; sem.sem_num = index;/*信号灯数组灯的一个索引,指明哪个信号灯*/ sem.sem_op = 1;/*加到当前信号灯的数值*/ sem.sem_flg = 0; semop(semid,&sem,1); return; void P(int semid,int index) struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0; semop(semid,&sem,1); return;int main(void) int i=0; int shmid1; char *s,*t,str=linux!;/*str为输入的字符,实现一个一个字符的输入,输出,s,t指针当单个字符使用,即s0,t0*/ semid = semget(IPCKEY,4,IPC_CREAT|0666); shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666); s=(char *)shmat(shmid1,NULL,SHM_R|SHM_W);/* 绑定到共享内存块 */ do P(semid,0); s0=stri; printf(getn); i+; V(semid,2); while(s0!=0); copy.c#include#include#include#include#include#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 V(int semid,int index) struct sembuf sem; sem.sem_num = index;/*信号灯数组灯的一个索引,指明哪个信号灯*/ sem.sem_op = 1;/*加到当前信号灯的数值*/ sem.sem_flg = 0; semop(semid,&sem,1); return; void P(int semid,int index) struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0; semop(semid,&sem,1); return;int 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,SHM_R|SHM_W);/* 绑定到共享内存块 */ shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666); t=(char *)shmat(shmid2,NULL,SHM_R|SHM_W); do P(semid,1); P(semid,2); strcpy(t,s); printf(copyn); V(semid,0); V(semid,3); while(t0!=0); put.c#include#include#include#include#include#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 V(int semid,int index) struct sembuf sem; sem.sem_num = index;/*信号灯数组灯的一个索引,指明哪个信号灯*/ sem.sem_op = 1;/*加到当前信号灯的数值*/ sem.sem_flg = 0; semop(semid,&sem,1); return; void P(int semid,int index) struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0; semop(semid,&sem,1); return;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,SHM_R|SHM_W);/* 绑定到共享内存块 */ do /*if(t0=0)break;*/ P(semid,3); if(t0!=0)printf(put-%cn,*t); else printf(put-0n); V(semid,1); while(t0!=0); makefileall:get copy put mainecho completeget:get.ogcc -o get get.ocopy:copy.ogcc -o copy copy.oput:put.ogcc -o put put.omain:main.ogcc -o main main.oget.o:get.cgcc -c get.ccopy.o:copy.cgcc -c copy.cput.o:put.cgcc -c put.cmain.o:main.cgcc -c main.c3 实验三 Linux文件目录操作3.1 实验目的、实验要求3.1.1实验目的了解并掌握Linux文件目录结构。3.1.2 实验要求了解Linux文件系统与目录操作:(1) Linux文件系统 :文件属性; (2)Linux目录结构:目录文件;(3)目录相关函数接口;3.2 实验内容1、熟悉Linux文件系统的使用;2、了解Linux文件系统目录结构;3、编程实现目录查询命令; 功能类似ls -lR; 查询指定目录下的文件及子目录信息; 显示文件的类型、大小、时间等信息; 递归显示子目录中的文件信息;3.3 预备知识3.3.1 Linux文件属性接口表3. 1 文件属性接口函数功能int fstat(int fildes,struct stat *buf);返回文件描述符相关的文件的状态信息int lstat(const char *path, struct stat *buf);如读取到了符号连接,读取符号连接本身的状态信息int stat(const char *path, struct stat *buf);如读取到了符号连接,读取的是符号连接指向文件的信息stat结构体几乎保存了所有的文件状态信息:本程序中主要用到st_mode 文件的权限信息和类型信息,检查类型时使用S_ISDIR(); 宏,检查是否是目录3.3.2 Linux目录结构接口表3. 2 目录结构接口函数功能DIR *opendir(const char *name);通过路径打开一个目录,返回一个DIR结构体指针(目录流),失败返回NULL;struct dirent *readdir(DIR *)读取目录中的下一个目录项,没有目录项可以读取时,返回为NULL;int chdir(const char *path);改变目录,与用户通过cd命令改变目录一样,程序也可以通过chdir来改变目录,这样使得 fopen()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论