中南大學
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同志們:今天這個大會,是市委全面落實黨要管黨、從嚴治黨要求的一項重大舉措,也是對縣市區委書記履行基層黨建工作第一責任人情況的一次集中檢閱,同時是對全市基層黨建工作的一次再部署、再落實的會議。前面,**
***年,我認真履行領班子、帶隊伍、抓黨員、保穩定的基層黨建工作思路,以學習貫徹習近平新時代中國特色社會主義思想和黨的十九大歷次全會精神為主線,以市局基層黨建工作考核細則為落腳點,落實全面從嚴治黨主體
根據會議安排,現將2022年履行抓基層黨建工作職責情況報告如下:一、履職工作特色和亮點1 突出政治建設,著力在思想認識上提高。牢固樹立抓黨建就是抓政績的理念,以“黨建工作抓引領、社區治理求突破,為民服
2022年以來,在**黨委的正確領導下,堅持以習近平新時代中國特色社會主義思想為指導,深入學習宣傳貫徹黨的二十大精神,以黨建工作為統領,扎實開展夯實“三個基本”活動,以“四化四力”行動為抓手,聚力創建
各位領導,同志們:根據會議安排,現就2022年度抓基層黨建工作情況匯報如下:一、主要做法及成效(一)強化政治引領。一是不斷強化理論武裝。堅持通過黨組會、中心組學習會和“三會一課”,第一時間、第一議題學
2022年度抓基層黨建工作述職報告按照黨委工作部署,現將本人2022年度抓基層黨建工作情況報告如下:一、2022年度抓基層黨建工作情況(一)旗幟鮮明講政治將旗幟鮮明講政治放在全局發展首要位置,積極開展
2022年,是我在數計系黨總支書記這個新崗位上度過的第一個完整的工作年度。回首一年來在校黨委的正確領導下,與數計系領導班子和全體師生共同走過的日子,艱辛歷歷在目,收獲溫潤心田。作為黨總支書記,我始終牢
按照考核要求,現將本人一年來,作為統戰部長履行職責、廉潔自律等方面情況報告如下:一、著眼增強政治素質,不斷深化理論學習堅持把旗幟鮮明講政治作為履職從政的第一位要求,帶領統戰系統干部堅決擁護“兩個確立”
**年,緊緊圍繞黨工委、管委會的決策部署,全體人員團結協作、凝心聚力,緊扣黨工委“**”基本工作思路,全力開拓進取,認真履職盡責,圓滿完成各項工作任務。一、個人思想政治狀況檸檬文苑www bgzjy
按照縣委關于開展抓基層黨建述職評議會議的有關要求,經請示縣委組織部同意,今天,我們在此召開2022年度基層黨組織書記抓基層黨建述職評議會議。1 首先,請**黨委書記,**同志述職。**黨委能夠主動研究