中国石油大学(华东)操作系统课程设计报告姓名:学号:成绩:目录实验一、螺旋矩阵 (3)实验二、用Shell程序实现文件的批量管理 (4)实验三、驱动下的螺旋矩阵程序 (7)实验四、哲学家进餐问题 (10)实验五、NCURSE程序框架 (14)实验一、螺旋矩阵一、实验任务用C语言编写一个螺旋矩阵程序,实现输入行数和列数即可形成A~Z的螺旋矩阵,并用Makefile完成编译。
二、实验环境和工具VMware Workstation红帽子 Linux-2.4.20-8三、关键代码1、螺旋矩阵实现代码(SpiralMatrix.c)#include <stdio.h>#define N 10int main(){int row,col,i,j,x,y,startNum;int dx[4]={0,1,0,-1};//方向int dy[4]={1,0,-1,0};int Matrix[N][N];printf("请输入行数和列数:");scanf("%d %d",&row,&col);for (i=0;i<row;i++){//初始化矩阵for(j=0;j<col;j++)Matrix[i][j]=-1;}startNum=0;x=0;y=0;j=0;for (i=0;startNum<row*col;i++){if (x>=0&&x<row&&y>=0&&y<col&&Matrix[x][y]==-1)Matrix[x][y]=startNum++;else{x-=dx[j];y-=dy[j];j=(j+1)%4;}x+=dx[j];y+=dy[j];}printf("螺旋矩阵为:\n");for (i=0;i<row;i++){for(j=0;j<col;j++)printf("%4c",Matrix[i][j]%26+'A');printf("\n");}return 0;}2、MakefileCC=gccEXEC=SpiralMatrixOBJS=SpiralMatrix.oall:$(EXEC)$(EXEC):$(OBJS)$(CC) -o $@ $(OBJS)clean:rm -rf $(EXEC) $(OBJS)四、实验结果实验二、用Shell程序实现文件的批量管理一、实验任务设计两个Shell程序,一个Shell程序实现给系统添加四个新组,每个组代表一个班级,每一个班级中添加30个用户,每个用户代表一个学生。
另一个Shell程序实现删除上一个Shell程序添加的用户和组。
二、实验环境和工具Linux-2.4.20-8 VMware Workstation三、关键代码1、创建用户addUsers#!/bin/shi=1while [ $i -le 4 ]doGROUPNAME=class${i}groupadd $GROUPNAMEi=$(($i+1))donei=0k=0while [ $i -lt 120 ]doif [ $(($i%30)) -eq 0 ]thenk=$(($k+1))fij=$((($i)%30))j=$(($j+1))if [ $j -le 9 ]thenUSERNAME=class${k}stu0${j} elseUSERNAME=class${k}stu${j}# fiGROUPNAME=class${k}useradd $USERNAMEchown -R $USERNAME /home/$USERNAMEchgrp -R $GROUPNAME /home/$USERNAME i=$(($i+1))Done2、删除用户delUsers#!/bin/shi=0k=0while [ $i -lt 120 ]doif [ $((($i)%30)) -eq 0 ]thenk=$(($k+1))fij=$(($i%30))j=$(($j+1))if [ $j -le 9 ]thenUSERNAME=class${k}stu0${j} elseUSERNAME=class${k}stu${j} fiuserdel $USERNAMErm -rf /home/$USERNAMEi=$(($i+1))donei=1while [ $i -le 4 ]doGROUPNAME=class${i}groupdel $GROUPNAMEi=$(($i+1))done四、实验结果1、编辑addUsers和delUsers2、添加用户3、删除用户实验三、驱动下的螺旋矩阵程序一、实验任务要求实现一个驱动程序的执行过程,设定驱动程序实现的字符设备,设备为111,此设备为0,实现功能:测试程序输入两个数字(行与列),在驱动程序下即可形成相应的字母螺旋矩阵,最后驱动程序会将举证返回给测试程序,Z之后循环至A二、实验环境软件环境:RedHat Linux2.4.20-8,VMware WorkStation三、关键代码接口函数定义在evan_fops结构体中:static struct file_operations evan_fops={owner: THIS_MODULE,//拥有者write: evan_write,//写操作read: evan_read,//读操作ioctl: evan_ioctl,//控制操作open: evan_open,//打开操作release: evan_release,//释放操作};测试程序中实现螺旋矩阵的代码:showbuf(char *buf){int H,L;char a[100][100];int count=65 ;int x,y,round,min;scanf("%d %d",&H,&L);if(H == 1&&L==1){a[0][0] = count;}else if(H!=1&&L==1){for(x=0;x<H;x++){a[x][0]=count;count++;if(count==91)count=count-26;}}else{if(H>L)min=L;else min=H;for(round=0; round<min/2; round++){ x = round;for(y=round;y<L-round;y++) {a[x][y]=count;count++;if(count==91)count=count-26;}//if(count>97)count=count-33;y = L - round - 1;for(x=round+1;x<H-round-1;x++){a[x][y]=count;count++;if(count==91)count=count-26;}x = H - round - 1;for(y=L-round-1;y>=round;y--){a[x][y]=count;count++;if(count==91)count=count-26;}y = round;for(x=H-round-1-1;x>round;x--){a[x][y]=count;count++;if(count==91)count=count-26;}}if(min%2==1){if(H==L)a[H/2][H/2]=count;else if(H<=L)for(x=min/2,y=round;y<=L-1-round;y++){a[x][y]=count;count++;if(count==91)count=count-26;}elsefor(y=min/2,x=round;x<=H-1-round;x++) {a[x][y]=count;count++;if(count==91)count=count-26;}}}//打印矩阵for(x=0;x<H;x++){for(y=0;y<L;y++){printf("%c ",a[x][y]);}printf("\n");}四实验结果实验四、哲学家进餐问题一、实验任务编程实现哲学家进餐模型,所谓的哲学家进餐模型,即有五个哲学家围坐在一圆桌旁,桌中央有一盘面条,每两人之间放一只筷子,即总共有五根筷子。
每个哲学家的行为是思考或者吃面条。
为了吃面条,每个哲学家必须只能直接从自己的左边或者右边取筷子,两根筷子都取到了才能吃面条。
而吃完一根面条之前,哲学家不会放掉手里的筷子。
设定盆中一共有68根面条,一次哲学家只能吃一根。
二、实验环境和工具VMware Workstation 10.0.2 build-1744117和Linux-2.4.20-8三、关键代码#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#define PHILO_NUM 5#define THINK_TIME 3#define EATING_TIME 2enum { THINKING, HUNGRY, EATING } state[PHILO_NUM];pthread_cond_t self[PHILO_NUM];int noodles_num = 68;pthread_mutex_t lock;void test(int i);void pickup(int i){if(noodles_num!=0){pthread_mutex_lock(&lock);state[i]=HUNGRY;test(i);if(state[i]!=EATING)pthread_cond_wait(&self[i],&lock);pthread_mutex_unlock(&lock);}else{printf("The noodles is empty!\n");exit(0);}}void putdown(int i){pthread_mutex_lock(&lock);state[i]=THINKING;test((i+PHILO_NUM-1)%PHILO_NUM);test((i+1)%PHILO_NUM);pthread_mutex_unlock(&lock);}void test(int i){if(state[(i+PHILO_NUM-1)%PHILO_NUM]!=EATING&&state[(i+1)%PHILO_NUM]!=EATING &&state[i]==HUNGRY){state[i]=EATING;pthread_cond_signal(&self[i]);}}void init(){int i=0;for(;i<PHILO_NUM;i++)state[i]=THINKING;}void think(int i){printf("philosopher %d :I am thinking!\n", i);sleep(THINK_TIME);}void eat(int i){printf("philosopher %d :I am eating!\n", i);noodles_num--;sleep(EATING_TIME);}void* philosopher(void* vargs){int i =*(int*)vargs;while (1){think(i);pickup(i);eat(i);putdown(i);}return NULL;}int main(void){pthread_t tid[5];int i=0;init();for(i=0;i<PHILO_NUM;i++)pthread_create(&tid[i],NULL,philosopher,(void*)&i); for(i=0;i<PHILO_NUM;i++)pthread_join(tid[i],NULL);return 0;}2、MakefileCC=gccEXEC=philosopherOBJS=philosopher.oall:$(EXEC)$(EXEC):$(OBJS)$(CC) -o $@ $(OBJS) -lpthreadclean:rm -f $(EXEC) $(OBJS) 四、实验结果实验五、NCURSE程序框架一、任务要求将以上的五个实验任务以ncurse汇总,以menu的方式实现界面显示。