Linux实验报告.docx
- 文档编号:3745486
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:18
- 大小:339.47KB
Linux实验报告.docx
《Linux实验报告.docx》由会员分享,可在线阅读,更多相关《Linux实验报告.docx(18页珍藏版)》请在冰点文库上搜索。
Linux实验报告
中南大学
Linux系统实验报告
实验一····································3~9
实验二···································10~16
实验三··································17~17
实验一Shell程序设计
[实验目的]
理解Shell程序的设计方法;熟悉Shell程序的编辑、运行、调试方法与过程。
[实验内容]考勤模拟Shell程序设计
用shell设计一个考勤模拟程序,实现如下功能选择界面:
1.上班签到
2.下班签出
3.缺勤信息查阅
4.退出
考勤程序运行后,提示用户输入上述功能选择,并验证用户输入的用户名和密码;用户信息保存在userinfo.dat中。
如果是上班签到,记录签到信息,如果签到时间大于上午8时,则提示用户迟到,并记录该迟到信息到check.dat。
如果是下班签出,记录签出信息,如果签出时间小于下午6时,则提示用户早退,并记录该早退信息到check.dat。
如果用户选择缺勤信息查询,则将check.dat中对应该用户的迟到早退信息查出并显示。
用户选择功能执行完,shell程序继续回到功能选择界面等待下一个用户进行操作。
1、实验分析
本实验是shell程序设计,主要目的是理解shell程序的设计方法以及熟悉shell程序的编辑、运行、调试方法与过程。
Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。
它接收用户输入的命令并把它送入内核去执行。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。
不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。
Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
本实验要求设计一个考情模拟的shell程序,按照题目要求,可将整个程序分为五个部分:
main函数以及四个功能函数,及一个功能对应一个函数。
1、上下班签到
将此函数定义为check_in();根据题目要求,运行程序后首先要求用户输入用户名和密码,当用户名密码正确时才可进入,这就要用到shell编程中的变量,shell中的变量和C语言或是JAVA中的变量都有所不同,shell中的变量不需要事先声明,给一个变量赋值实际上就定义了一个变量,并且shell程序中的变量是无类型的。
我们定义两个变量name和password,由题目要求,用户名和密码需要由用户输入,因此我们定义的变量应该从键盘获取输入值,使用如下语句:
readnamepassword;
我们在开发程序前应先创建一个文件userinfo.dat用于存放用户的用户名和密码,当用户输入用户名和密码后就要判断该用户是否合法。
方法为从userinfo.dat文件中逐行读取数据,并判断是否与用户输入的用户名相同,当遇到相同的用户名时就表明该用户是合法的,可以退出文件的读取,转入判断该用户输入的密码是否正确。
从文件中逐行读取数据方法:
iftest-e/home/poe/userinfo.dat
then
whilereadu_nameu_password
do
iftest"$name"="$u_name"
then
break;
else
continue;
fi
done
用户名和密码正确后用户进入系统,系统显示用户签到成功,此时还要判断此时的时间是否大于上午8时,则提示用户迟到,并记录该迟到信息到check.dat。
2、下班签出
将此函数定义为check_out(),前面部分和上一个函数check_in()相同,都为判断用户输入的用户名和密码。
不同之处在于记录签出信息,如果签出时间小于下午6时,则提示用户早退,并记录该早退信息到check.dat。
3、缺勤信息查阅
将此函数定义为look(),首先还是判断该用户输入的用户名和密码是否正确。
用户进入系统之后就要打印出该用户的签到信息,将check.dat中对应该用户的迟到早退信息查出并显示。
在这一步中,首先还是要从check.dat文件中逐行读取数据,不过并不直接打印,而是要等判断用户名后才能打印。
whilereadrecord
do
user=${record%%*};
iftest"$user"="$name"
then
echo"$record";
fi
done
其中user=${record%%*};语句表示截取record字符串从左边起第一个空格前的字符串,也就是用户名,然后检查和该用户的用户名是否匹配,若匹配则打印否则读取下一条。
2、实验源码
#!
/bin/bash
functionshow(){
echo"-----------------WelcometoAttandanceSystem--------------------";
echo"-----------------1.checkin--------------------";
echo"-----------------2.checkout--------------------";
echo"-----------------3.late--------------------";
echo"-----------------4.exit--------------------";
echo"Pleaseinputyourchoice:
";
}
functioncheck_in(){
echo"Pleaseinputyournameandpassword:
";
readnamepassword;
iftest-e/home/poe/userinfo.dat
then
whilereadu_nameu_password
do
iftest"$name"="$u_name"
then
break;
else
continue;
fi
done
iftest"$name"!
="$u_name"
then
echo"Sorry,yournameiswrong!
";
eliftest"$password"!
="$u_password"
then
echo"Sorry,yourpasswordiswrong!
";
else
echo"Congratulation!
Youarecheckedinat`date`";
iftest`date+%H`-gt8
then
echo"Youarelate!
";
echo"$nameCheckedinat"+`date`+".Late!
">>check.dat;
fi
fi
else
echo"Thereisnothisfile";
fi
}
functioncheck_out(){
echo"Pleaseinputyournameandpassword:
";
readnamepassword;
iftest-e/home/poe/userinfo.dat
then
whilereadu_nameu_password
do
iftest"$name"="$u_name"
then
break;
else
continue;
fi
done
iftest"$name"!
="$u_name"
then
echo"Sorry,yournameiswrong!
";
eliftest"$password"!
="$u_password"
then
echo"Sorry,yourpasswordiswrong!
";
else
echo"Congratulation!
Youarecheckedoutat"+`date`;
iftest`date+%H`-lt18
then
echo"Youareearlytoleave!
";
echo"$nameCheckedoutat"+`date`+".Early!
">>check.dat;
fi
fi
else
echo"Thereisnothisfile";
fi
}
functionlook(){
echo"Pleaseinputyournameandpassword:
";
readnamepassword;
iftest-e/home/poe/userinfo.dat
then
whilereadu_nameu_password
do
iftest"$name"="$u_name"
then
break;
else
continue;
fi
done
iftest"$name"!
="$u_name"
then
echo"Sorry,yournameiswrong!
";
eliftest"$password"!
="$u_password"
then
echo"Sorry,yourpasswordiswrong!
";
else
whilereadrecord
do
user=${record%%*};
iftest"$user"="$name"
then
echo"$record";
fi
done
fi
else
echo"Thereisnothisfile";
fi
}
functionmain(){
clear;
show;
readchoice;
case$choicein
1)check_in;;
2)check_out;;
3)look;;
4)exit;;
*)echo"Pleaseinput1~4";;
esac
}
main;
3、实验步骤及截图
进入终端,输入./attand.sh
实验2Linux高级程序设计-进程通信
1、实验目的
(1)了解Linux操作系统下应用程序开发流程
(2)掌握GNU工具链的使用
(3)了解Linux高级编程技巧(例如IPC机制、系统调用等)
2、实验内容
(1)编写一个简单的C语言程序,编写Makefile文件。
了解编译过程,并用gdb进行调试。
(2)以下任选其一:
1.编写一个多进程通信程序,采用MessageQueue或sharedMemory或者PipelineFile机制进行通信
2.编写一个实现读者-写者问题的程序,用信号量机制
备注:
读者-写者问题
设有一组共享数据DB和两组并发进程,一组进程只对此组数据执行读操作,另一组进程可对此组数据执行写操作(同时也可以执行读操作)。
将前面一组进程称为读者,后一组进程称为写者。
为了保证共享数据的完整性,要求:
(1)多个读者的操作可以同时进行
(2)多个写者的操作不可同时进行
(3)任何读者与写者的操作不可同时进行
3、实验要求
(1)写出源程序,并编译运行
(2)详细记录程序调试及运行结果
1、Makefile思路分析
在本实验中编写输入学生人数及分数,计算学生的总成绩以及平均成绩的程序,源程序如下:
/*main.c*/
#include
#include"chengji.h"
intmain(){
intn,i;
floatsum,avg;
printf("pleaseinputthenumberofstudents:
");
scanf("%d",&n);
floatscore[n];
for(i=0;i printf("pleaseinputthescoreofstudent[%d]",i); scanf("%d",&score[i]); } sum=fun_sum(score,n); avg=fun_avg(score,n); printf("thesumis%f,theavgis%f",sum,avg); } /*chengji.h*/ floatfun_sum(floatarray[],intn); floatfun_avg(floatarray[],intn); /*fun_sum.c*/ floatfun_sum(floatarray[],intn){ floatsum=0.0; for(inti=0;i sum+=array[i]; returnsum; } /*fun_avg.c*/ floatfun_avg(floatarray[],intn){ floatavg=0.0; for(inti=0;i avg+=array[i]; avg/=n; returnavg; } Makefile文件如下: main: main.ofun_sum.ofun_avg.o gccmain.ofun_sum.ofun_avg.o-omain main.o: main.cchengji.h gccmain.c-c fun_sum.o: fun_sum.c gccfun_sum.c-c fun_avg.o: fun_avg.c gccfun_avg.c-c 运行结果如下: 2、读者-写者思路分析 读写信号量的特点是: 1.同一时刻最多有一个写者(writer)获得锁; 2.同一时刻可以有多个读者(reader)获得锁; 3.同一时刻写者和读者不能同时获得锁; 由于读者可以同时获得锁,因此提高了系统的并发程度,进而提高了系统的性能。 源程序如下: #include #include #include //定义数据类 classdata { public: data(inti,floatf): I(i),F(f) {} intI; floatF; }; //读者写者读写的内容 data*p_data=NULL; pthread_rwlock_tlock; //写者数目 constintWRITER_NUMBER=2; void*reader(void*arg); void*writer(void*arg); intmain(intargc,char**argv) { pthread_treader_tid; pthread_twriter_tid[WRITER_NUMBER]; pthread_create(&reader_tid,NULL,reader,NULL); for(inti=0;i { pthread_create(&writer_tid[i],NULL,writer,(void*)i); } sleep (1); return0; } void*reader(void*arg) { longid=(long)arg; pthread_detach(pthread_self()); while(true) { pthread_rwlock_rdlock(&lock); printf("reader%disreadingthedata;",id); if(p_data==NULL) { printf("thedataisNULL\n"); } else { printf("thedatais(%d,%f)\n",p_data->I,p_data->F); } pthread_rwlock_unlock(&lock); } return(void*)0; } void*writer(void*arg) { pthread_detach(pthread_self()); while(true) { pthread_rwlock_wrlock(&lock); printf("writeriswritingthedata;"); if(p_data==NULL) { p_data=newdata(1,1.1f); printf("writercreatethedata(%d,%f)\n",p_data->I,p_data->F); } else { deletep_data; p_data=NULL; printf("writerfreethedata\n"); } pthread_rwlock_unlock(&lock); } return(void*)0; } 实验三: Proc文件系统 【实验目的】本实验作业将通过Proc文件系统观察整个系统的一些重要特征,并要求编写一个程序,利用Proc文件系统获得和修改系统的各种配置参数。 【实验内容】 1、以超级用户的身份登录Linux系统,并进入/proc目录,输入ls命令,查看该目录下的内容,同时查看每个文件的读、写权限。 并回答下列问题: ØCPU的类型和型号 1Intel(R)Core(TM)i3-2350MCPU@2.30GHz Ø所使用的Linux的版本 Linuxubuntu4.8.0-52-generic#55~16.04.1-UbuntuSMPFriApr2814: 36: 29UTC2017x86_64x86_64x86_64GNU/Linux Ø从启动到当前时刻经过的时间 Ø当前内存状态 2、编写一个程序,用来获得内核参数(任意的参数均可) 3、编写一个程序,用来修改内核参数(任意的参数均可)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 实验 报告