欢迎访问有用文档网!

当前位置: 有用文档网 > 述职报告 >

Linux实验报告

| 浏览次数:

 中南大学

 Linux 系统实验报告

 目 目

 录

 实验一····································3~9

 实验二···································10~16

 实验三··································17~17

 实验一

 l Shell 程序设计

 [ 实验目的

 ] ]

 理解 Shell 程序的设计方法;熟悉 Shell 程序的编辑、运行、调试方法与过程。

 [ 实验内容

 ] 考勤模拟 Shell 程序设计 用 shell 设计一个考勤模拟程序,实现如下功能选择界面:

 1.上班签到 2.下班签出 3.缺勤信息查阅 4.退出 考勤程序运行后,提示用户输入上述功能选择,并验证用户输入的用户名和密码;用户信息保存在 userinfo.dat 中。

 如果是上班签到,记录签到信息,如果签到时间大于上午 8 时,则提示用户迟到,并记录该迟到信息到 check.dat。

 如果是下班签出,记录签出信息,如果签出时间小于下午 6 时,则提示用户早退,并记录该早退信息到 check.dat。

 如果用户选择缺勤信息查询,则将 check.dat 中对应该用户的迟到早退信息查出并显示。

 用户选择功能执行完,shell 程序继续回到功能选择界面等待下一个用户进行操作。

  一、 实验分析

 本实验是 shell 程序设计,主要目的是理解 shell 程序的设计方法以及熟悉 shell 程序的编辑、运行、调试方法与过程。

 Shell 是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。实际上 Shell 是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell 有自己的编程语言用于对命令的编辑,它允许用户编写由 shell 命令组成的程序。Shell 编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的 Shell 程序与其他应用程序具有同样的效果。

 本实验要求设计一个考情模拟的 shell 程序,按照题目要求,可将整个程序分为五个部分:main 函数以及四个功能函数,及一个功能对应一个函数。

 1、上下班签到

 将此函数定义为 check_in();根据题目要求,运行程序后首先要求用户输入用户名和密码,当用户名密码正确时才可进入,这就要用到 shell 编程中的变量,shell 中的变量和 C 语言或是 JAVA 中的变量都有所不同,shell 中的变量不需要事先声明,给一个变量赋值实际上就定义了一个变量,并且 shell 程序中的变量是无类型的。

 我们定义两个变量 name 和 password,由题目要求,用户名和密码需要由用户输入,因此我们定义的变量应该从键盘获取输入值,使用如下语句:

 read name password; 我们在开发程序前应先创建一个文件 userinfo.dat 用于存放用户的用户名和密码,当用户输入用户名和密码后就要判断该用户是否合法。方法为从 userinfo.dat 文件中逐行读取数据,并判断是否与用户输入的用户名相同,当遇到相同的用户名时就表明该用户是合法的,可以退出文件的读取,转入判断该用户输入的密码是否正确。

 从文件中逐行读取数据方法:

 if test -e /home/poe/userinfo.dat

 then

  while read u_name u_password

  do

 if test "$name" = "$u_name"

  then

 break;

 else

  continue;

 fi

  done < /home/poe/userinfo.dat

 用户名和密码正确后用户进入系统,系统显示用户签到成功,此时还要判断此时的时间是否大于上午 8 时,则提示用户迟到,并记录该迟到信息到 check.dat。

 2、下班签出

 将此函数定义为 check_out() ,前面部分和上一个函数 check_in()相同,都为判断用户输入的用户名和密码。不同之处在于记录签出信息,如果签出时间小于下午 6 时,则提示用户早退,并记录该早退信息到 check.dat。

  3、缺勤信息查阅

 将此函数定义为 look(),首先还是判断该用户输入的用户名和密码是否正确。用户进入系统之后就要打印出该用户的签到信息,将 check.dat 中对应该用户的迟到早退信息查出并显示。

 在这一步中,首先还是要从 check.dat 文件中逐行读取数据,不过并不直接打印,而是

 要等判断用户名后才能打印。

 while read record

 do

  user=${record%% *};

  if test "$user" = "$name"

  then

 echo "$record";

  fi

  done < /home/poe/check.dat

 其中 user=${record%% *};语句表示截取 record 字符串从左边起第一个空格前的字符串,也就是用户名,然后检查和该用户的用户名是否匹配,若匹配则打印否则读取下一条。

  二、 实验源码

 #! /bin/bash function show(){

 echo "-----------------Welcome to Attandance System--------------------";

 echo "-----------------

  1.check in

  --------------------";

 echo "-----------------

  2.check out

 --------------------";

 echo "-----------------

  3.late

  --------------------";

 echo "-----------------

  4.exit

  --------------------";

 echo "Please input your choice:"; }

 function check_in(){

 echo "Please input your name and password:";

 read name password;

 if test -e /home/poe/userinfo.dat

 then

  while read u_name u_password

  do

 if test "$name" = "$u_name"

  then

 break;

 else

  continue;

 fi

  done < /home/poe/userinfo.dat

  if test "$name" != "$u_name"

 then

 echo "Sorry,your name is wrong!";

  elif test "$password" != "$u_password"

  then

 echo "Sorry,your password is wrong!";

  else

 echo "Congratulation! You are checked in at `date`";

 if test `date +%H` -gt 8

 then

  echo "You are late!";

  echo "$name Checked in at "+`date`+".Late!">> check.dat;

 fi

  fi

 else

  echo "There is no this file";

 fi }

 function check_out(){

 echo "Please input your name and password:";

 read name password;

 if test -e /home/poe/userinfo.dat

 then

  while read u_name u_password

  do

 if test "$name" = "$u_name"

  then

 break;

 else

  continue;

 fi

  done < /home/poe/userinfo.dat

  if test "$name" != "$u_name"

  then

 echo "Sorry,your name is wrong!";

  elif test "$password" != "$u_password"

  then

 echo "Sorry,your password is wrong!";

  else

 echo "Congratulation! You are checked out at "+`date`;

 if test `date +%H` -lt 18

 then

  echo "You are early to leave!";

 echo "$name Checked out at "+`date`+".Early!">>check.dat;

 fi

  fi

 else

  echo "There is no this file";

 fi }

 function look(){

 echo "Please input your name and password:";

 read name password;

 if test -e /home/poe/userinfo.dat

 then

  while read u_name u_password

  do

 if test "$name" = "$u_name"

  then

 break;

 else

  continue;

 fi

  done < /home/poe/userinfo.dat

  if test "$name" != "$u_name"

  then

 echo "Sorry,your name is wrong!";

  elif test "$password" != "$u_password"

  then

 echo "Sorry,your password is wrong!";

  else

 while read record

 do

  user=${record%% *};

  if test "$user" = "$name"

  then

 echo "$record";

  fi

  done < /home/poe/check.dat

  fi

 else

  echo "There is no this file";

 fi }

  function main(){

 clear;

 show;

 read choice;

  case $choice in

  1) check_in;;

  2) check_out;;

  3) look;;

  4) exit;;

  *) echo "Please input 1~4";;

 esac

 }

 main;

 三、 实验步骤及截图

 进入终端,输入./attand.sh

 实验 2

 Linux 高级程序设计- - 进程通信

 1 、实验目的

 (1)了解 Linux 操作系统下应用程序开发流程 (2)掌握 GNU 工具链的使用

 (3)了解 Linux 高级编程技巧(例如 IPC 机制、系统调用等)

 2 、实验内容 (1)

 编写一个简单的 C 语言程序,编写 Makefile 文件。了解编译过程,并用 gdb 进行调试。

 (2)

 以下任选其一:

 1. 编写一个多进程通信程序,采用 Message Queue 或 shared Memory 或者Pipeline File 机制进行通信 2. 编写一个实现读者-写者问题的程序,用信号量机制

 备注:读者-写者问题

  设有一组共享数据 DB 和两组并发进程,一组进程只对此组数据执行读操作,另一组进程可对此组数据执行写操作(同时也可以执行读操作)。将前面一组进程称为读者,后一组进程称为写者。为了保证共享数据的完整性,要求:

 (1)多个读者的操作可以同时进行

 (2)多个写者的操作不可同时进行

 (3)任何读者与写者的操作不可同时进行

 3 、实验要求 (1)

 写出源程序,并编译运行 (2)

 详细记录程序调试及运行结果

 一、Makefile 思路分析 在本实验中编写输入学生人数及分数,计算学生的总成绩以及平均成绩的程序,源程序如下:

 /*main.c*/ #include <stdio.h> #include "chengji.h" int main(){

 int n,i;

 float sum,avg;

 printf("please input the number ofstudents:");

 scanf("%d",&n);

 float score[n];

 for(i=0;i<n;i++){

  printf("please input the score of student[%d]",i);

  scanf("%d",&score[i]);

 }

 sum=fun_sum(score,n);

 avg=fun_avg(score,n);

 printf("the sum is %f,the avg is %f",sum,avg);

 }

 /*chengji.h*/ float fun_sum(float array[],int n); float fun_avg(float array[],int n);

 /*fun_sum.c*/ float fun_sum(float array[],int n){

 float sum=0.0;

 for(int i=0;i<n;i++)

  sum+=array[i];

 return sum; }

 /*fun_avg.c*/ float fun_avg(float array[],int n){

 float avg=0.0;

 for(int i=0;i<n;i++)

  avg+=array[i];

 avg/=n;

 return avg; }

  Makefile 文件如下:

 main:main.o fun_sum.o fun_avg.o

 gcc main.o fun_sum.o fun_avg.o -o main main.o:main.c chengji.h

 gcc main.c -c fun_sum.o:fun_sum.c

 gcc fun_sum.c -c fun_avg.o:fun_avg.c

 gcc fun_avg.c -c

  运行结果如下:

 二、 读者- 写者思路分析 读写信号量的特点是:

 1. 同一时刻最多有一个写者(writer)获得锁; 2. 同一时刻可以有多个读者(reader)获得锁; 3. 同一时刻写者和读者不能同时获得锁; 由于读者可以同时获得锁,因此提高了系统的并发程度,进而提高了系统的性能。

 源程序如下:

  #include <pthread.h>

  #include <stdio.h>

  #include <unistd.h>

 // 定义数据类

  class data

  {

  public:

  data(int i, float f):

  I(i), F(f)

  {}

 int I;

  float F;

  };

 // 读者写者读写的内容

  data *p_data = NULL;

 pthread_rwlock_t lock;

 // 写者数目

  const int WRITER_NUMBER = 2;

 void *reader(void *arg);

  void *writer(void *arg);

 int main(int argc, char **argv)

  {

  pthread_t reader_tid;

  pthread_t writer_tid[WRITER_NUMBER];

 pthread_create(&reader_tid, NULL, reader, NULL);

  for (int i = 0; i < WRITER_NUMBER; ++i)

  {

 pthread_create(&writer_tid[i], NULL, writer, (void *)i);

  }

 sleep(1);

 return 0;

  }

 void *reader(void *arg)

  {

  long id = (long)arg;

 pthread_detach(pthread_self());

 while (true)

  {

  pthread_rwlock_rdlock(&lock);

  printf("reader %d is reading the data; ", id);

  if (p_data == NULL)

  {

  printf("the data is NULL\n");

  }

  else

  {

  printf("the data is (%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("writer is writing the data; ");

  if (p_data == NULL)

  {

  p_data = new data(1, 1.1f);

  printf("writer create the data (%d, %f)\n", p_data->I, p_data->F);

  }

 else

  {

  delete p_data;

  p_data = NULL;

  printf("writer free the data\n");

  }

  pthread_rwlock_unlock(&lock);

  }

  return (void *)0;

  }

 实验三:

 c Proc 文件系统

 【实验目的】本实验作业将通过 Proc 文件系统观察整个系统的一些重要特征,并要求编写一个程序,利用 Proc 文件系统获得和修改系统的各种配置参数。

 【实验内容】

 1、以超级用户的身份登录 Linux 系统,并进入/proc 目录,输入 ls 命令,查看该目录下的内容,同时查看每个文件的读、写权限。并 回答下列问题:

  CPU 的类型和型号

 1

 Intel(R) Core(TM) i3-2350M CPU @ 2.30GHz

   所使用的 Linux 的版本

 Linux ubuntu 4.8.0-52-generic #55~16.04.1-Ubuntu SMP Fri Apr 28 14:36:29 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

  从启动到当前时刻经过的时间

   当前内存状态

  2、 、 编写一个程序,用来获得内核参数(任意的参数均可)

  3 、编写一个程序,用来修改内核参数(任意的参数均可)

推荐访问:实验 报告 Linux

热门排行Top Ranking

弦振动实验报告

弦振动得研究 一、实验目得 1、观察固定均匀弦振动共振干涉形成驻波时得波形,加深驻波得认识。 2、了

宣传委员述职报告12020 幼儿园党支部宣传委员述职报告

下面是小编为大家精心整理的宣传委员述职报告12020幼儿园党支部宣传委员述职报告文章,供大家阅读参考。宣传委员述

党建工作现场述职会上讲话 公安局长在党建工作现场会上的讲话

下面是小编为大家精心整理的党建工作现场述职会上讲话公安局长在党建工作现场会上的讲话文章,供大家阅读参考。党建工作现场

支部宣传委员述职述廉报告范例 幼儿园党支部宣传委员述职报告

下面是小编为大家精心整理的支部宣传委员述职述廉报告范例幼儿园党支部宣传委员述职报告文章,供大家阅读参考。支部宣传

政治生态评估报告5篇

可能会捆绑住经办人员的手脚,不利于业务工作的开展。致使个别中层干部主体责任压力传导出现能量损耗;个别

2021年领导述职报告合集2020 县领导述职报告

下面是小编为大家精心整理的2021年领导述职报告合集2020县领导述职报告文章,供大家阅读参考。2

工商局监察室主任述职述廉报告

工商局监察室主任述职述廉报告 第一篇:工商局监察室主任述职述廉报告 我叫haoword,中共党员,现

党支部书记个人述职报告 对村党支部书记述职报告的点评

下面是小编为大家精心整理的党支部书记个人述职报告对村党支部书记述职报告的点评文章,供大家阅读参考。党支部书记个人

财务分析课程报告4篇

财务分析课程报告4篇财务分析课程报告篇1一年来,在领导和同事们的的支持帮助和指导下,加上自身的不断努

结合乡村振兴战略人才工作述职报告 乡村振兴工作员年度述职

下面是小编为大家精心整理的结合乡村振兴战略人才工作述职报告乡村振兴工作员年度述职文章,供大家阅读参考。结合

个人安全生产履职报告[安全生产述职报告] 党委书记安全生产履职报告

下面是小编为大家精心整理的个人安全生产履职报告[安全生产述职报告]党委书记安全生产履职报告文章,供大家阅读参

企业年度工作总结报告范文13篇

企业年度工作总结报告范文13篇企业年度工作总结报告范文篇1时光飞逝,转眼已经毕业一年了,我顺利地完成