《操作系统课程设.计报告.doc》由会员分享,可在线阅读,更多相关《操作系统课程设.计报告.doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 中国石油大学(华东)操作系统课程设计报告姓名: 学号: 成绩: 螺旋矩阵Makefile批量用户管理驱动程序线程实现进程实现NCURSE程序框架附加题评语:目录实验一、螺旋矩阵3实验二、用Shell程序实现文件的批量管理4实验三、驱动下的螺旋矩阵程序7实验四、哲学家进餐问题.10实验五、程序框架14实验一、螺旋矩阵一、 实验任务用C语言编写一个螺旋矩阵程序,实现输入行数和列数即可形成AZ的螺旋矩阵,并用Makefile完成编译。二、实验环境和工具VMware Workstatio红帽子 Linux-2.4.20-8三、关键代码1、 螺旋矩阵实现代码(SpiralMatrix.c)#inclu
2、de #define N 10int main()int row,col,i,j,x,y,startNum;int dx4=0,1,0,-1;/方向int dy4=1,0,-1,0;int MatrixNN;printf(请输入行数和列数:);scanf(%d %d,&row,&col);for (i=0;irow;i+)/初始化矩阵for(j=0;jcol;j+)Matrixij=-1;startNum=0;x=0;y=0;j=0;for (i=0;startNum=0&x=0&ycol&Matrixxy=-1)Matrixxy=startNum+;elsex-=dxj;y-=dyj;j=(
3、j+1)%4;x+=dxj;y+=dyj;printf(螺旋矩阵为:n);for (i=0;irow;i+)for(j=0;jcol;j+)printf(%4c,Matrixij%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程序实现给系统添
4、加四个新组,每个组代表一个班级,每一个班级中添加30个用户,每个用户代表一个学生。另一个Shell程序实现删除上一个Shell程序添加的用户和组。二、 实验环境和工具Linux-2.4.20-8VMware Workstation三、关键代码1、创建用户addUsers#!/bin/shi=1while $i -le 4 doGROUPNAME=class$igroupadd $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
5、 9 thenUSERNAME=class$kstu0$jelseUSERNAME=class$kstu$j#fiGROUPNAME=class$kuseradd $USERNAMEchown -R $USERNAME /home/$USERNAMEchgrp -R $GROUPNAME /home/$USERNAMEi=$($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=
6、class$kstu0$jelseUSERNAME=class$kstu$jfiuserdel $USERNAMErm -rf /home/$USERNAMEi=$($i+1)donei=1while $i -le 4 doGROUPNAME=class$igroupdel $GROUPNAMEi=$($i+1)done四、 实验结果1、 编辑addUsers和delUsers2、 添加用户3、 删除用户实验三、驱动下的螺旋矩阵程序一、 实验任务要求实现一个驱动程序的执行过程,设定驱动程序实现的字符设备,设备为,此设备为,实现功能:测试程序输入两个数字(行与列),在驱动程序下即可形成相应的字母
7、螺旋矩阵,最后驱动程序会将举证返回给测试程序,之后循环至二、 实验环境软件环境: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(
8、char *buf) int H,L; char a100100; int count=65 ; int x,y,round,min; scanf(%d %d,&H,&L); if(H = 1&L=1) a00 = count;else if(H!=1&L=1)for(x=0;xL) min=L; else min=H; for(round=0; roundmin/2; round+) x = round; for(y=round;y97)count=count-33; y = L - round - 1; for(x=round+1;x=round;y-) axy=count; count+
9、; if(count=91) count=count-26; y = round; for(x=H-round-1-1;xround;x-) axy=count; count+;if(count=91) count=count-26; if(min%2=1)if(H=L)aH/2H/2=count;else if(H=L)for(x=min/2,y=round;y=L-1-round;y+)axy=count;count+;if(count=91) count=count-26;elsefor(y=min/2,x=round;x=H-1-round;x+) axy=count; count+;
10、if(count=91) count=count-26;/打印矩阵 for(x=0;xH;x+) for(y=0;yL;y+) printf(%c ,axy); printf(n);四 实验结果实验四、哲学家进餐问题一、 实验任务编程实现哲学家进餐模型,所谓的哲学家进餐模型,即有五个哲学家围坐在一圆桌旁,桌中央有一盘面条,每两人之间放一只筷子,即总共有五根筷子。每个哲学家的行为是思考或者吃面条。为了吃面条,每个哲学家必须只能直接从自己的左边或者右边取筷子,两根筷子都取到了才能吃面条。而吃完一根面条之前,哲学家不会放掉手里的筷子。设定盆中一共有68根面条,一次哲学家只能吃一根。二、 实验环境和工
11、具VMware Workstation 10.0.2 build-1744117和Linux-2.4.20-8三、关键代码#include #include #include #include #define PHILO_NUM 5#define THINK_TIME 3#define EATING_TIME 2enum THINKING, HUNGRY, EATING statePHILO_NUM;pthread_cond_t selfPHILO_NUM;int noodles_num = 68;pthread_mutex_t lock;void test(int i);void picku
12、p(int i)if(noodles_num!=0)pthread_mutex_lock(&lock);statei=HUNGRY;test(i);if(statei!=EATING)pthread_cond_wait(&selfi,&lock);pthread_mutex_unlock(&lock);elseprintf(The noodles is empty!n);exit(0);void putdown(int i)pthread_mutex_lock(&lock);statei=THINKING;test(i+PHILO_NUM-1)%PHILO_NUM);test(i+1)%PHI
13、LO_NUM);pthread_mutex_unlock(&lock);void test(int i)if(state(i+PHILO_NUM-1)%PHILO_NUM!=EATING&state(i+1)%PHILO_NUM!=EATING&statei=HUNGRY)statei=EATING;pthread_cond_signal(&selfi);void init()int i=0;for(;iPHILO_NUM;i+)statei=THINKING;void think(int i) printf(philosopher %d :I am thinking!n, i); sleep
14、(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 tid5;int i=0;init();for(i=0;iPHILO_NUM;i+)pthread_create(&
15、tidi,NULL,philosopher,(void*)&i);for(i=0;iPHILO_NUM;i+)pthread_join(tidi,NULL);return 0;2、MakefileCC=gccEXEC=philosopherOBJS=philosopher.oall:$(EXEC)$(EXEC):$(OBJS)$(CC) -o $ $(OBJS) -lpthreadclean:rm -f $(EXEC) $(OBJS)四、实验结果实验五、程序框架一、任务要求将以上的五个实验任务以ncurse汇总,以menu的方式实现界面显示。二、实验环境软件环境:RedHat Linux2.4
16、.20-8,VMware WorkStation三、关键代码1.Menu界面的代码:#include #include #define StartX 20#define StartY 6void initial();main() int x=StartX,y=StartY,ch; initial(); box(stdscr,0,0); attron(A_REVERSE); mvaddstr(2,20,Ncurse Test); attroff(A_REVERSE); mvaddstr(6,19,* jingcha); mvaddstr(8,19,* addusers); mvaddstr(10
17、,19,* del); mvaddstr(12,19,* driversnake); mvaddstr(14,19,* Exit); move(y,x); do ch=getch(); switch(ch) case KEY_UP : if(y=7) y=y-2; else y=y; break; case KEY_DOWN : if(y=6 & y=33 & y9) x=x-1; else x=x; break; case KEY_RIGHT : if(x=46 & y=33) mvaddch(y,-x, ); break; default : if(y=6) if(x=32 & x=32
18、&x=32 &x=70) wordsm=addch(ch); x+;m+; else y=12;x=32; break; move(y,x); while(1);void initial() initscr(); cbreak(); nonl(); noecho(); intrflush(stdscr,FALSE); keypad(stdscr,TRUE); refresh();2.ncurse代码:#include #include #define StartX 20#define StartY 6void initial();main() int x=StartX,y=StartY,ch;
19、 initial(); box(stdscr,0,0); attron(A_REVERSE); mvaddstr(0,20,TCS NAS Server v1.13 by CyberAct); attroff(A_REVERSE); mvaddstr(6,19,* Config IP address and netmask); mvaddstr(8,19,* Change Administrators Password); mvaddstr(10,19,* Config users -); mvaddstr(12,19,* Publish users in network); mvaddstr
20、(14,19,* Restart the Server); mvaddstr(16,19,* Shutdown the Server); mvaddstr(18,19,* Exit); move(y,x); do ch=getch(); switch(ch) case KEY_UP : if(y=7) y=y-2; else y=y; break; case KEY_DOWN : if(y=6 & y=33 & y9) x=x-1; else x=x; break; case KEY_RIGHT : if(x=46 & y=33) mvaddch(y,-x, ); break; case 27
21、 : endwin(); clear(); main(); break; default : if(x=32 & x=48 & ch=57) addch(ch); x+; break; move(y,x); while(1);ConfigUser() int x=StartX,y=StartY,ch; initial(); box(stdscr,0,0); attron(A_REVERSE); mvaddstr(0,20,Add/Remove User(s); attroff(A_REVERSE); mvaddstr(6,19,* User List); mvaddstr(8,19,-); m
22、vaddstr(10,19,* Add a Unix User); mvaddstr(12,19,* Remove a Unix User); mvaddstr(14,19,-); mvaddstr(16,19,* Add a Windows User); mvaddstr(18,19, Remove a Windows User); mvaddstr(20,19,-); mvaddstr(22,19,* Exit); move(y,x); do ch=getch(); switch(ch) case KEY_UP : if(y=22) y=18; else if(y=18) y=16; el
23、se if(y=16) y=12; else if(y=12) y=10; else if(y=10) y=6; else y=y; break; case KEY_DOWN : if(y=6) y=10; else if(y=10) y=12; else if(y=12) y=16; else if(y=16) y=18; else if(y=18) y=22; else y=y; break; case r : if(y=22) endwin();clear();main(); if(y=6) endwin();clear();UserList(); if(y=10) endwin();clear();AddUnixUser(); if(y=12) endwin();clear();RemoveUnixUser(); if(y=16) endwin();clear();AddWindowsUser(); break; case t : if(y=6) y=10; else if(y=10) y=12; else if(y=12) y=16; else if(y=16) y=18; else if(y=18) y=22; else if(y=22) y=6; break; case 27 : endwin();clear(