一、目的(本次实验所涉及并要求掌握的知识点)
1、掌握和学会Linux的用户管理
2、掌握和学会Linux的进程管理
二、实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析、电路图)
实验内容
1)创建1个用户登录脚本的模板,命名为/etc/skel-net,在skel-net中创建一文件名为“网络用户须知”,创建用户net09用skel-net的模板,创建完毕到这该用户家目录中检查是否有“网络用户须知”文件。
2)先设置当前日期为20##年11月14日,用命令修改net09用户,设置最小口令时间为2天,最长口令时间为7天,口令失效前3天警告,20##年11月16日帐号被禁用。
3)用命令修改用户的默认属性,设置家目录为/home/ttt,默认shell为csh。查看useradd文件是否生效了,然后改回原来的状态。
4)设置用户net09默认创建文件的权限为600,创建一个空文件,检查权限是否正确。
5)实现ftp后台自动下载的方式下载ftp://210.34.148.138/常用软件/光盘映象/VC++.iso(即:注销用户后,系统仍然继续下载指定文件)
6)填写实验报告单,下周实验课(11月28日)前传到服务器上,实验报告单的文件名格式为“11.14-11.21-xxx实验报告”,xxx为自己的名字
三、实验使用环境(本次实验所使用的平台和相关软件)
VMware、Red Hat Enterprise Linux 5
四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)
1、创建1个用户登录脚本的模板,命名为/etc/skel-net,在skel-net中创建一文件名为“网络用户须知”,创建用户net09用skel-net的模板,创建完毕到这该用户家目录中检查是否有“网络用户须知”文件。
2、先设置当前日期为20##年11月14日,用命令修改net09用户,设置最小口令时间为2天,最长口令时间为7天,口令失效前3天警告,20##年11月16日帐号被禁用。
用命令more /etc/shadow 查看
3、用命令修改用户的默认属性,设置家目录为/home/ttt,默认shell为csh。查看useradd文件是否生效了,然后改回原来的状态。
首先,查看原来用户的默认属性
然后,用useradd命令设置家目录为/home/ttt,默认shell为csh,并查看
最后,改回原来的状态并查看
4、设置用户net09默认创建文件的权限为600,创建一个空文件,检查权限是否正确。
从控制台登录用户net09,用umask命令设置文件的权限,创建空文件zay,检查权限是否正确
超级用户root 创建的文件的权限没有改变
5、实现ftp后台自动下载的方式下载ftp://210.34.148.138/常用软件/光盘映象/VC++.iso(即:注销用户后,系统仍然继续下载指定文件)
用命令nohup command &从ftp后台自动下载的方式下载ftp://210.34.148.138/常用软件/光盘映象/VC++.iso
用ps –ef 查看所有进程
注销root用户后重新登录,查后进程
进程号6105已完成,用ls命令查看VC++.iso,已下载完成
五、实验小结(实验中遇到的问题及解决过程、实验中产生的错误及原因分析、实验体会和收获)
1、用useradd命令增加用户时,要指定用户模板目录用命令“useradd –k skel_dir 用户名”是不可行,后来上网查看useradd所有选项的具体用法知道命令“useradd [-m [-k skeleton_dir] 用户名”才可以;因为创建新用户时用户家目录不存在,用选项[-m]会在用户家目录不在则自动创建。
2、设置用户创建文件的权限时,用户可以用户环境文件重新设置,但我试过还是没成功,望老师可以在讲解一下。
六、附录(参考文献和相关资料)
第二篇:进程管理实验报告昆工
昆明理工大学信息工程与自动化学院学生实验报告
( 20## —2012 学年第二 学期)
课程名称:操作系统 开课实验室:444 2012 年 4 月 10 日
一、实验目的
通过编写进程管理的算法,要求学生掌握整个进程管理的各个环节,进程的数据结构描述,进程的各种状态之间的转换,以及进程的调度算法。以加深对进程的概念及进程调度算法的理解,并且提高链表的应用能力,达到提高编程能力的目的。
二、实验原理及基本技术路线图(方框原理图)
用C语言或C++语言开发。需要定义PCB的数据结构,用链表的形式管理进程,采用多级反馈队列调度的算法模拟进程的控制。要求有创建、撤销、调度、阻塞、唤醒进程等功能。
状态转换图:
各原语的功能说明:
#include<stdio.h>标准输入输出头文件
#include<stdlib.h> stdlib.h里面定义了五种类型、一些宏和通用工具函数。 类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t; 宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等; 常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。
多级反馈队列调度算法的描述:
void zhingxing()
{
for(int i=0;i<=链表的数目;)
{
p=rq(i),front;
while(p!=NULL)
{
执行调度算法,将在时间片内不能完成的进程,插入到下一队列的尾部,并以此循环执行。
p=p->next;
}
}
}
程序功能结构图:
流程图:
creat()流程图:
数据结构定义主要变量的说明:
xuhao进程的序号
daoda进程到达时间
pid[10] 进程名字
youxian 进程优先级
yunxingsuoxu 运行所需时间
yunxing运行已用时间
zhuangtai R表示执行,W表示动态就绪 ,F表示完成
函数的说明:
void creat();//创建链表
void diaodu();//执行调度的过程
void display();//显示执行结果
三、所用仪器、材料(设备名称、型号、规格等)。
计算机一台
四、实验方法、步骤
#include<stdio.h>
#include<stdlib.h>
#define NULL 0
int shumu;
void creat();//创建链表
void diaodu();//执行调度
void display();//显示执行结果
//进程PCB结构体
struct jincheng
{
int xuhao;
int daoda;
char pid[10]; //进程名字
int youxian; //进程优先级
int yunxingsuoxu; //占用cpu时间
int yunxing;
char zhuangtai; //R表示执行,W表示动态就绪 ,F表示完成
struct jincheng *next;
};
//链表结构体
typedef struct node
{
jincheng *front;
}pcbqueue;
pcbqueue rq[3];//定义三个等待队列
struct jincheng *p,*q;
//创建进程……
void creat()
{
printf("创建进程数目;(不大于20):");
scanf("%d",&shumu);
if(shumu>20)
{
printf("内存已满!\n");
printf("输入错误,请重新创建进程!\n");
creat();
}
else
{
for(int j=0;j<shumu;j++)
{ p=(jincheng*)malloc(sizeof(jincheng));
p->youxian=(int)(rand()%(4-1)+1);
if(rq[p->youxian-1].front==NULL)//建立队列2,1,0
{
printf("请输入新进程的序号(数字):\n");
scanf("%d",&p->xuhao);
printf("请输入新进程的名字:\n");
scanf("%s",&p->pid);
p->daoda=(int)(rand()%(5-1)+1);
p->yunxingsuoxu=(int)(rand()%(5-1)+1);
p->yunxing=0;
p->zhuangtai='W'; //新建进程的状态设置为“就绪”
rq[p->youxian-1].front=p;
p->next=NULL;
}
else //如果就绪队列不是空队列
{
p=rq[p->youxian-1].front;
while(p->next!=NULL)
{
p=p->next; //p一直指向就绪队列的队尾
}
q=(jincheng*)malloc(sizeof(jincheng));
q->next=p->next;
p->next=q; //在就绪队列的队尾加入新建的进程
printf("请输入新进程的序号(数字):\n");
scanf("%d",&q->xuhao);
printf("请输入新进程的名字:\n");
scanf("%s",&q->pid);
q->daoda=(int)(rand()%(5-1)+1);
q->yunxing=0;
q->yunxingsuoxu=(int)(rand()%(5-1)+1);
q->zhuangtai='W';
}
}
}
if(shumu>0&&shumu<=20)
{
printf("\t\t\t进程创建成功!\n");
printf("\t***********************************************\n");
printf("\t*********************执行程序******************\n");
printf("\t***********************************************\n");
}
}
void diaodu()//执行部分
{
display();
printf("正在执行进程运行情况:\n");
printf("序号 名字 运行时间 已运行时间 到达时间 状态\n");
int i=2;//从第二个队列开始……
for(i=2;i>=0;i--)
{
p=rq[i].front;
while(p!=NULL)
{
for(int j=1;j<=2*(3-i);j++)
{
p->yunxing=p->yunxing+1;
p->yunxingsuoxu=p->yunxingsuoxu-1;
if(p->yunxingsuoxu<0)
{
printf("进程已完成运行……\n");
exit(0);
}
p->zhuangtai='R';//执行过程中状态改变
if(p->yunxingsuoxu==0)
{
p->zhuangtai='F'; //执行结束状态改变
printf("%d %s %d %d %d %c\n",p->xuhao,p->pid,p->yunxingsuoxu,p->yunxing,p->daoda,p->zhuangtai);
break;
}
getchar();
printf("%d %s %d %d %d %c\n",p->xuhao,p->pid,p->yunxingsuoxu,p->yunxing,p->daoda,p->zhuangtai);
}
if(p->yunxingsuoxu>0)
{
p->zhuangtai='W';
getchar();
printf("%d %s %d %d %d %c\n",p->xuhao,p->pid,p->yunxingsuoxu,p->yunxing,p->daoda,p->zhuangtai);
if(i-1<=0) /*将用玩时间片的插入相应队列,以下作此操作*/
{
q=rq[0].front;
while(q->next!=NULL)
{
q=q->next;
}
q->next=p;
rq[i].front=p->next;
p->next=NULL;
diaodu();
}
else
{
q=rq[i-1].front;
while(q->next!=NULL)
{
q=q->next;
}
q->next=p;
rq[i].front=p->next;
p->next=NULL;
diaodu();
}
diaodu();
getchar();
printf("%d %s %d %d %d %c\n",p->xuhao,p->pid,p->yunxingsuoxu,p->yunxing,p->daoda,p->zhuangtai);
}
p=p->next;
}
}
}
void display()//输出部分
{
printf("所有进程运行情况:\n");
printf("序号 名字 运行时间 已运行时间 到达时间 状态\n");
for(int a=0;a<3;a++)
{
p=rq[a].front;
while(p!=NULL)
{
printf("%d %s %d %d %d %c\n",p->xuhao,p->pid,p->yunxingsuoxu,p->yunxing,p->daoda,p->zhuangtai);
p=p->next;
}
}
}
void main()
{
creat();
diaodu();
display();
}
五、实验过程原始记录:
输入数据:
序号 名称
1 a
2 b
3 d
4 e
5 f
运行截图:
输入进程:
未完成进程插入下一进程:
过程及结果:
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线图时必须用计算纸)
这次操作系统进程管理课程设计,在编写过程中,遇到很多难题,特别是在操作系统实验中不曾注意到的问题,也有许多新的问题,在实际反复调试运行中,不断加深了对操作系统的理解,也很大地程度上提高了编程的能力,由于对重要概念的把握程度还不够深入,在实际理解编写时遇到很多不该发生的问题。不过,都很好的解决并牢牢地掌握住了。尤其是链表的插入,哪里插到哪里,要在草稿纸上理清思路,不然会出错,就像那天一个字母大写了,整了半天才检查出来,做程序要非常的细心。做多了你就会发现其实都是大同小异,稍微感动一点就可以了,计算机方面的知识,永不懈怠。有什么问题就问老师,要把它搞清楚来龙气脉,这样才会有提高。
通过这次进程管理课程设计,不仅让我了解了多级反馈队列的进程管理系统,更重要的还让我学会了、或者说是验证了“做事一定要有次序和对事物的总体把握”这句话。这次操作系统实习,不仅让我对操作系统这门课程有了更深入的研究、对很多重要的概念有了巩固和掌握,还给了我今后做事的启示。做事要塌实,不能想着一步登天,要有计划,有目的的进行做事。盲目真的不应该再在我们身上出现了,我们应该认真找到自己的缺点并且及时改正。在这里,我和赵安君很感谢杨老师的指导,多亏她的指导我和赵安君才能完成,
她耐心的指导才有我们的进步,杨老师真的是一位好老师。
If you put your heart into it,nothing is difficult !!!!!!!!!!!!