当前位置: 首页 > 范文大全 > 自查报告 >

【华科操作系统实验报告】 windows基本操作

时间:2021-10-23 14:40:40 来源:网友投稿

  课程实验报告

 课程名称: 操作系统原理

 专业班级: CS1209

 学 号:

 姓 名:

 指导教师:

 报告日期: 2015年1月5日

 计算机科学与技术学院

 目录

  TOC \o "1-5" \h \z \o "Current Document" 1 实验一 Linux 线程及信号灯 11.1实验目的与内容 1

  \o "Current Document" 1.1.1实验目的 11.1.2实验内容 1

 1.2实验过程 1

  \o "Current Document" 1.2.1预备知识 11.2.2实验测试与结果 2

 1.3实验总结 3

  \o "Current Document" 1.4源代码 4 \o "Current Document" 2实验二Linux进程及同步 72.1实验目的与内容 7

 2.1.1实验目的 7

  \o "Current Document" 2.1.2实验内容 72.2实验过程 7

 2.2.1预备知识 7

 2.2.2实验测试与结果 8

 2.3实验总结 9

  \o "Current Document" 2.4源代码 9 \o "Current Document" 3实验三Linux文件目录操作 133.1实验目的与内容 13

 3.1.1实验目的 13

 3.1.2实验内容 13

 3.2实验过程 13

 3.2.1预备知识 13

 3.2.2实验测试与结果 14

 3.3实验总结 15

  \o "Current Document" 3.4源代码 15实验一 Linux线程及信号灯

 1.1实验目的与内容

 1.1.1实验目的1、 熟悉Linux线程接口。

 2、 熟悉Linux信号灯编程。

 3、 了解Linux进程同步与通信的主要机制,并通过信号灯操作实现进程间 的同步与互斥。1.1.2实验内容

 1、编程模拟实现飞机售票: 创建多个售票线程; 使用公用全局变量保存已售票数量; 创建互斥信号灯;对售票线程临界区实施P、V操作;

 2编程模拟实现双线程单缓冲区的合作

 创建一个计算线程与一个输出线程;

 创建同步信号灯;

 缓冲区用全局公用数组变量; 对计算线程与输出线程实施P、V操作;

 1.2实验过程

 1.2.1预备知识

 Linux下的信号灯及其P、V操作:

 表1. 1 P、V操作定义

 void p(i nt semid,i nt semno) {

 struct sembuf sop; sop.sem_ num=se mno; sop.sem_op=-1; sop.sem_flg=0; semop(semid,&sop,1);

 }

 void v(i nt semid,i nt semno) {

 struct sembuf sop; sop.sem_ num=se mno; sop.sem_op=1; sop.sem_flg=0; semop(semid,&sop,1);

 }

 线程:

 表1.2线程相关函数

 线程创建

 pthread_create(pthread_t *thread, pthread_attr_t void *(*start_routine)(void *),void *arg);

 *attr,

 线程挂起

 pthread _join (pthread_t th, void **thread_retr un);

 共享内存:

 使用共享内存是运行在同一计算机上的进程进行进程间通信的最快的方 法,shmget与shmat系统调用。进程控制:

 fork与 execv系统调用;

 编译、编辑、调试

 表1.3编译、编辑、调试

 编译

 cc — test -g test.c Tpthread cc — sub1 sub1.c

 编辑

 vi

 调试

 gdb

 1.2.2实验测试与结果

 测试结果:模拟售票

 说明(图1.1.1和1.1.2):共有300张票,有三个线程分别代表三个售票窗口

 X □ ubuntu-kylin^ubuntu-kyUn: ^/Desktop

 ?/ticketgcc ticket * c -Ipthread -o ticket */ticketbuntu-kylin@dbuntu-kylin:cd /hone/ubuntu-kyItn/Desktop buntu- kyli.n(3ubuntu- kyltn: -/Desktops ash: ./ticket:权限术够 buntu-kylln@dbuntu-kylin:-/Desktop? buntu* kylinUubuntu-kylin:-/Desktops i口1 :本航班共有站日个座位F请问您需要买几张? 孑口2 :本航班共有HEH3个座位「请问您需要买几张?

 ?/ticket

 gcc ticket * c -Ipthread -o ticket */ticket

 □ 3 :本航班共有3阳个座位,请问您需要买几张? 0&

 口 3 :剩余票数不^ubuntu-kylin^iubuntu-kylin:-/Desktops I

 图 1.1.1

 ubuntu-kylingubuntu-kylin:-$ cd /hone/ubuntu-kylin/Desktop ubuntu-kyltn@ubuntu-kyltn:*/Desktop$ */ticket窗口 1 :本航班共有个座位,请问您需要买几张? 窗口3 :本航班共有300个座位,请问您需要买几张? 窗口2 :本航班共有个座位,请问您需要买几张?50

 50

 100

 ubuntu-kylingubuntu-kylin:-/Desktops |

 图 1.1.2

 说明(图1.1.3和1.1.4):每个窗口每次只卖出一张,直到卖完

 图 1.1.3

 图 1.1.4

 测试结果:双线程单缓冲区的合作

 图1.2

 1.3实验总结

 本次实验刚做的时候用三个线程做依次访问卖几张来卖出,后来老师让 我改成每次买一张直到卖完,做出来了,但是我加的循环体加的位置不对,

 运行一两次可能没问题,但运行几万次可能会出现问题,此 bug老师给我指

 出的,程序还有待优化。

 1.4源代码

 1:

 #include <stdio.h>

 #include <pthread.h>

 #include <linux/sem.h>

 #include <sys/types.h> #include <stdlib.h>int ticket=300;

 int mutex;

 void p(int semid,int semno) {

 struct sembuf sop; sop.sem_num=semno; sop.sem_op=-1;sop.sem_flg=0; semop(semid, &sop,1);

 }

 void v(int semid,int semno) {

 struct sembuf sop; sop.sem_num=semno; sop.sem_op=1;sop.sem_flg=0; semop(semid, &sop,1);

 }

 void thread1(void)

 {

 int i;

 \n",ticket);p(mutex,0);

 \n",ticket);

 printf("窗口 1:本航班共有%d个座位,请问您需要买几张? scanf("%d",&i);if(i>ticket)

 printf("窗口 1:剩余票数不够”);

 else

 ticket=ticket-i;

 v(mutex,0);

 }

 void thread2(void)

 {

 —int i;

 p(mutex,O);

 \n",ticket);\n",ticket);printf(”窗口 2 :本航班共有%d个座位,请问您需要买几张? scanf("%d",&i);\n",ticket);

 \n",ticket);

 if(i>ticket)

 printf("窗口 2:剩余票数不够”);

 else

 ticket=ticket-i;

 v(mutex,0);

 }

 void thread3(void)

 {

 int i;

 p(mutex,0);

 printf("窗口 3 :本航班共有%d个座位,请问您需要买几张? scanf("%d",&i);if(i>ticket)

 printf("窗口 3:剩余票数不够”);

 else

 ticket=ticket-i;

 v(mutex,0);

 }

 int main()

 {

 pthread_t id1,id2,id3;

 int ret1,ret2,ret3;

 union semun arg;

 mutex =semget(IPC_PRIVATE,IPC_CREAT);

 arg.val = 1;

 semctl(mutex,0,IPC_RMID,0);

 ret仁 pthread_create(& d1,NULL,(void*)thread1,NULL); ret2=pthread_create(& d2,NULL,(void*)thread2,NULL); ret3=pthread_create(& d3,NULL,(void*)thread3,NULL);if(ret1!=0){

 printf("Creat 1st pthread error!\n"); exit(1);}

 if(ret2!=0){

 printf("Creat 2st pthread error!\n"); exit(1);}

 if(ret3!=0){

 printf("Creat 3st pthread error!\n"); exit(1);}

 pthread _join(id1,NULL);

 pthread _join(id2,NULL);

 pthread _join(id3,NULL);

 return 0;

 2:

 #includevstdio.h>

 #includevstdlib.h> #includevpthread.h> #includevlinux/sem.h> #includevsys/types.h> int q[100];int m;

 int w=0;

 void P(int semid,int semno)

 {

 struct sembuf sop; sop.sem_num=semno; sop.sem_op=-1;sop.sem_flg=0; semop(semid, &sop,1);

 }

 void V(int semid, int semno){ struct sembuf sop; sop.sem_num=semno; sop.sem_op=1;sop.sem_flg=0; semop(semid, &sop,1);

 }

 void pa(){

 P(m,1);

 w++; q[w]+=1;

 V(m,0);

 }

 void pb

 (){

 P(m,0);

 printf("jieguo = %d\n",q[w]);

 w--;

 V(m,1);

 }

 int main(void){ pthread_t id1; pthread_t id2; pthread_t id3; pthread_t id4;int i,ret1,ret2; union semun arg;

 arg.val=0; m=semget(IPC_PRIVATE,2,IPC_CREAT|066); semctl(m,O,SETVAL,arg);arg.val=1;

 semctl(m,1,SETVAL,arg);

 ret1=pthread_create(&id1,NULL,(void*)pa,NULL); if(ret1!=0){printf("create pthread error!\n"); exit (1);}

 printf("id is %d\n",id1); ret2=pthread_create(&id2,NULL,(void*)pb,NULL); if(ret2!=0){printf("create pthread error!\n"); exit (1);}

 printf("id is %d\n",id2);

 pthread _join(id1,NULL);

 pthread _join(id2,NULL);

 return 0; }

 实验二Linux进程及同步

 2.1实验目的与内容

 2.1.1实验目的了解并掌握Linux进程及同步

 2.2.2实验内容

 编程模拟实现誊抄;

 创建三个誊抄进程;

 基于共享内存建立缓冲区; 创建同步信号灯;

 对各誊抄进程施加P、V操作;

 2.2实验过程

 2.2.1预备知识

 ①并发程序的誊抄:

 g

 g

 get程序:负责从输入序列f中读取字符并送到缓冲区s中; copy程序:把缓冲区s中的数据复制到缓冲区t中去; put程序:从缓冲区t中取出数据打印;②誊抄的实现:

 在相应的圆圈对应的进程中,通过修改箭头上对应序号的信号灯控制进程的运行,设有 4个信号灯分别为0

 在相应的圆圈对应的进程中,通过修改箭头上对应序号的信号灯控制进程的运行,设有 4个信号灯分别为

 0、 1、 2、 3

 在进程中对信号灯的控制可简写为:

 get()

 {

 p(0);

 get操作; v(2);

 }

 copy()

 {

 p(1);

 p(2); copy操作; v(0);

 v(3);

 }

 put()

 {

 p(3); put操作; v(1);

 }

 通过设置信号灯 0的初值和利用 copy对信号灯0做v操作,使得 当信号灯0的资源个数>0时,可 以进行get操作

 通过设置信号灯1、2的初值和利 用put对信号灯1做v操作、利用 get对信号灯2做v操作,使得当 信号灯1和信号灯2的资源个数 均>0时,可以进行copy操作

 通过设置信号灯 3的初值和利用 copy对信号灯3做v操作,使得 当信号灯3的资源个数>0时,可 以进行put操作

 2.2.2实验测试与结果

 运行结果:

 X □ ubuntu-kyllin<9ubuntu-kylln: ^/Desktop ubun t u - kyl i n^u burn tu-ky linDesktops jbuntu-kyItn?ubiLinitu-kyItmDesktops ./nain get copy getput-■-?>1

 copy

 put…八H

 get

 copy

 pUt —打 get copy put …m get copy put …5 get copy put …a get copy put …+使用./main打开程序

 2.3实验总结

 通过此次实验了解了进程的创建,知道了进程与线程的区别。编写的程序输 出固定的几个字符,功能上没做好,欠佳,有待优化。2.4源代码

 头文件m.h

 #include

 <sys/types.h>

 #include

 <sys/sem.h>

 #include

 <semaphore.h>

 #include

 <stdio.h>

 #include

 <stdlib.h>

 #include

 <sys/stat.h>

 #include

 <fcntl.h>

 #include

 <sys/shm.h>

 #define

 LOOPS10

 #define

 IPCKEY (key_t)

 0x11

 #define

 SHMKEY1key_t)

 0x222

 #define

 SHMKEY2key_t)

 0x333

 void P(int semid, int index);

 void V(int semid, int index);

 int semid;

 void V(int semid, int index)

 1

 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 ;

 }

 Main.c

 #include"m.h"

 int main(void)

 {

 int res,i;

 struct shmid_ds *buf;

 int cmd;

 int shmid1,shmid2;

 char *s,*t;

 pid_t p1,p2,p3;

 semid = semget(IPCKEY,4,IPC_CREAT|0666);

 res = semctl(semid,0,SETVAL,0);

 res = semctl(semid,1,SETVAL,1);

 res = semctl(semid,2,SETVAL,0);

 res = semctl(semid,3,SETVAL,1);

 shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666); printf("%d",shmid1);s=(char *)shmat(shmid1,NULL,NULL);

 shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666); t=(char *)shmat(shmid2,NULL,NULL);if((p 1= fork()) == 0){ execv("./get",NULL); }else

 {

 if((p2=fork()) == 0){ execv("./copy",NULL);} else {

 if((p3=fork())==0){ execv("./put",NULL); }}

 }

 p仁 wait(&p1);

 p2=wait(&p2);

 p3=wait(&p3);

 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"m.h"

 int main(void)

 {

 int i=0;

 int shmid1;

 char *s,*t,str[]="linux!";

 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=str[i];

 printf("get\n");

 i++;

 V(semid,0);

 }while(s[0]!='\0');

 }

 Copy.c #include"m.h" int main(void) {

 int j=0;

 int shmid1,shmid2;

 char *s,*t;

 semid = semget(IPCKEY,4,IPC_CREAT|0666);

 shmidl = 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);

 strcpy(t,s); printf("copy\n");

 V(semid,2);

 V(semid,1);

 }while(t[0]!='\0');

 }

 Put.c

 #include"m.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,NULL);do

 {

 /*if(t[0]=='\0')break;*/

 P(semid,2);

 if(t[0]!='\0')printf("put---->%c\n",*t);

 else printf("put——>\\0\n");

 V(semid,3);

 }while(t[0]!='\0');

 }

 实验三Linux文件目录操作

 3.1实验目的与内容

 3.1.1实验目的了解并掌握Linux文件目录结构

 3.1.2实验内容

 编程实现目录查询命令;

 功能类似Is -IR;

 查询指定目录下的文件及子目录信息; 显示文件的类型、大小、时间等信息;

 递归显示子目录中的文件信息;

 3.2实验过程

 3.2.1预备知识

 Linux文件属性接口:

 表3. 1文件属性接口

 函数

 功能

 int fstat(i nt fildes,struct stat *buf);

 返回文件描述符相关的文件的状态信 息

 int lstat(const char *path, struct stat *buf);

 如读取到了符号连接,读取符号连接本 身的状态信息

 int stat(c onst char *path, struct stat *buf);

 如读取到了符号连接,读取的是符号连 接指向文件的信息

 stat结构体几乎保存了所有的文件状态信息:

 本程序中主要用到 st_mode文件的权限信息和类型信息,检查类型时使用

 S_ISDIR();宏,检查是否是目录

 Linux目录结构接口:

 表3. 2目录结构接口

 函数

 功能

 DIR *ope ndir(c onst char *n ame);

 通过路径打开一个目录,返回一个DIR结构体 指针(目录流),失败返回NULL;

 struct dire nt *readdir(DIR *)

 读取目录中的下一个目录项,没有目录项可以

 读取时,返回为NULL;

 int chdir(c onst char *path);

 改变目录,与用户通过cd命令改变目录一样, 程序也可以通过chdir来改变目录,这样使得 fope n() ,ope ndir(),这里需要路径的系统调用,可 以使用相对于当前目录的相对路径打开文件 (目录)。

 in t closedir(DIR*)

 关闭目录流

 在本程序中,用到结构 dire nt中的char d_name[256];(文件名)项3.2.2实验测试与结果

 运行结果:

 说明:图3.1为打开指定某一文件夹里的目录内容;图 3.2为根目录的内容

 r

 ubuntu-kylin@ubuntu-kytin:-/Desktops *

 /wenjan

 Input Dir Namel

 mirzat

 DIR DEPTH:

 0

 DIR NAME:

 未命名文科

 F夹

 DIR DEPTH:

 1

 DIR NAME:

 未命名文習

 F夹

 FILE DEPTH:

 1

 FILE NAME:

 put ■匸

 FILE DEPTH:

 1

 FILE NAME:

 put

 FILE DEPTH:

 1

 FILE NAME:

 main.c

 FILE DEPTH:

 1

 FILE NAME:

 main

 FILE DEPTH:

 1

 FILE NAME:

 h

 FILE DEPTH:

 1

 FILE NAME:

 get *匚

 FILE DEPTH:

 1

 FILE NAME:

 get

 FILE DEPTH:

 1

 FILE NAME:

 copy

 FILE DEPTH:

 1

 FILE NAME:

 copy

 FILE DEPTH:

 0

 FILE NAME:

 put .c

 FILE DEPTH:

 0

 FILE NAME:

 put

 FILE DEPTH:

 0

 FILE NAME:

 main.c

 FILE DEPTH:

 0

 FILE NAME:

 matn

 FILE DEPTH:

 0

 FILE NAME:

 ruh

 FILE DEPTH:

 0

 FILE NAME:

 get ,c

 FILE DEPTH:

 0

 FILE NAME:

 get

 FILE DEPTH:

 e

 FILE NAME:

 copy.c

 FILE DEPTH:

 0

 FILE NAME:

 spy

 ubuntu-kyltnfiubuntU'kyltn:-/Desktops 1

 图3.1

 3 - n

 L 厶」—

 FILE

 DEPTH:

 ; 5

 FILE

 NAME;

 sjkhotftxed,exe

 FILE

 DEPTH:

 : 5

 FILE

 NAME;

 : sjkuphotftx^exe

 DIR DEPTH;

 5

 OIR NAME:

 skin

 FILE

 DEPTH:

 ; 6

 FILE

 NAME;

 : newmet事

 FILE

 DEPTH!

 ; 6

 FILE

 NAME!

 【 newhetal46 ksktn

 FILE

 DEPTH:

 ; 6

 FILE

 NAME;

 newnostalgta.ksfskin

 FILE

 DEPTH:

 : 6

 FILE

 NAME:

 : newnostalgta.ksktn

 FILE

 DEPTH:

 : 6

 FILE

 NAME:

 : ne^xinyuzhou *ksfskin

 FILE

 DEPTH:

 : 6

 FILE

 NAME;

 newxinyuzhou Askin

 FILE

 DEPTH:

 I 6

 FILE

 NAME:

 ; sktncfg.ini

 FILE

 DEPTH:

 ; 5

 FILE

 NAME J

 ksperfexan.疋ip一kt

 DIR DEPTH:

 5

 OIR NAME:

 ksrcfg

 FILE

 DEPTH;

 ; &

 FILE

 NAME:

 : exFicfg3a *dat

 FILE

 DEPTH:

 : 6

 FILE

 NAME J

 : sysrep3a.dat

 FILE

 DEPTH:

 : S

 FILE

 NAME:

 ; ksreng3tdll

 FILE

 DEPTH:

 ; 5

 FILE

 NAME;

 : ksreng3. dll Aog

 FILE

 DEPTH:

 : 5

 FILE

 NAME!

 : ksre ng"g*lnt

 FILE

 DFPTH:

 ; 5

 FILE

 NAME;

 : ksrs匚厂iptm.log

 FILE

 DEPTH:

 : 5

 FILE

 NAME:

 ksscfgx Ant

 FILE

 DEPTH:

 : 5

 FILE

 NAME:

 ; ksscore^dll

 FILE

 DEPTH:

 ; 5

 FILE

 NAME;

 ksshield ?dlL

 FILE

 DEPTH:

 : 5

 FILE

 NAME:

 : ksskrpr,sys

 FILE

 DEPTH:

 ; 5

 FILE

 NAME:

 : kstools* dll

 FILE

 DEPTH:

 : 5

 FILE

 NAME;

 : kswbc *dll

 k

 图3.2

 3.3实验总结

 本程序显示包含目录下的文件名及深度、目录名与深度,功能上创建时间等 还未作出,有待改良。3.4源代码

 #include <unistd.h>

 #include <sys/stat.h>

 #include <stdio.h>

 #include <string.h>

 #include <stdlib.h>

 #include <dirent.h>

 void printdir(char *dir, int depth)

 {

 DIR *dp;

 struct dirent *entry;

 struct stat statbuf;

 if (((dp = opendir(dir)))== NULL)// opendir{

 printf("Open Dir Failed!\n"); return ;

 }

 chdir(dir); //chdir

 while( (entry=readdir(dp))!=NULL) //readdir{

 lstat(entry->d_name, &statbuf);

 if(S_ISDIR(statbuf.st_mode))

 { if(strcmp(entry->d_name,"..")==O||strcmp(entry->d_name,".")==O) continue;printf("DIR DEPTH: %d ",depth);

 printf("DIR NAME: %s\n",entry->d_name);

 printdir(entry->d_name,depth+1);

 }

 else

 {

 printf("FILE DEPTH: %d ",depth);

 printf("FILE NAME: %s\n",entry->d_name);

 }

 } chdir("..");//chdir closedir(dp); //closedir}

 int main(void){

 char a[50];

 printf("Input Dir Name!\n");

 scanf("%s",a);

 printdir(a,0);

 return 0;

 }

相关热词搜索: 操作系统 实验 报告 华科