linux基础实验报告含代码.docx

上传人:b****1 文档编号:12467114 上传时间:2023-04-19 格式:DOCX 页数:20 大小:350.71KB
下载 相关 举报
linux基础实验报告含代码.docx_第1页
第1页 / 共20页
linux基础实验报告含代码.docx_第2页
第2页 / 共20页
linux基础实验报告含代码.docx_第3页
第3页 / 共20页
linux基础实验报告含代码.docx_第4页
第4页 / 共20页
linux基础实验报告含代码.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

linux基础实验报告含代码.docx

《linux基础实验报告含代码.docx》由会员分享,可在线阅读,更多相关《linux基础实验报告含代码.docx(20页珍藏版)》请在冰豆网上搜索。

linux基础实验报告含代码.docx

linux基础实验报告含代码

 

Linux基础实验

 

实验一3

实验二4

实验三6

实验四9

实验五11

实验六14

实验七16

 

实验一螺旋矩阵

一、实验目的

1.熟悉linux下c程序编写。

2.掌握Makefile编写方法。

二、实验环境和工具

RedHatLinux

三、实验流程

1.编写螺旋矩阵程序

2.编写Makefile文件

四、实验结果

五、实验心得

通过这次实验,我熟悉了linux下c语言程序的编写,掌握了vi的一些常用操作,学会了使用gcc命令和makefile文件两种方法编译程序。

同时也使我熟悉了linux里常用命令的使用,还有,学会了挂载U盘的方法,可以很方便的往linux里传送文件。

六、关键代码

Makefile文件

CC=gcc

EXEC=juzhen

OBJS=juzhen.o

all:

$(EXEC)

$(EXEC):

$(OBJS)

$(CC)-o$@$(OBJS)

clean:

-rm-f$(EXEC)$(OBJS)

 

实验二添加、删除用户

一、实验目的

1.设计一个shell程序,分组批量添加用户。

2.再设计一个批量删除用户的shell程序。

二、实验环境和工具

RedHatLinux

三、实验流程

1.编写shell程序

2.修改文件权限

chmod+xaddusers

3.运行脚本

四、实验结果

添加用户:

删除用户:

五、实验心得

通过本次实验,我了解了shell脚本编程的方法和其语法规则。

掌握了使用shell脚本程序添加、删除用户的方法。

需要注意的是:

shell脚本直接用vi编写,要特别注意空格。

六、关键代码

添加用户:

 

删除用户:

 

实验三驱动螺旋矩阵

一、实验目的

1.掌握驱动模块的建立、插入和删除。

2.利用驱动模块实现测试程序输入矩阵的行和列,驱动程序生成相应的字母螺旋矩阵。

二、实验环境和工具

RedHatLinux

三、实验流程

1.编写驱动程序。

2.编写测试程序。

3.编写Makefile文件。

4.编译程序,插入驱动模块,运行驱动程序,观察运行结果,删除驱动模块,再次运行测试程序,观察运行结果。

四、实验结果

1.插入驱动模块后测试程序运行结果:

2.删除驱动模块后测试程序运行结果:

五、实验心得

通过这次实验,我对linux下驱动程序的工作原理有了一定的了解,认识了内核态和用户态的区别。

Linux以文件的形式定义系统的驱动程序,驱动程序不仅仅是内核的一部分,也是连接用户态和内核态之间的桥梁。

我学会了简单的驱动程序的开发和测试方法。

本次实验我遇到的难点有以下几点:

1.实验要求输出一个字母螺旋矩阵,测试程序应当定义一位数组还是二维数组。

解决方法:

使用一维数组,编程简单,在输出是将一维数组以二维形式输出即可。

2.驱动程序中如何实现螺旋矩阵。

解决方法:

在驱动程序中另写一个螺旋矩阵函数,在ssize_t_evan_write函数里调用。

六、关键代码

1.驱动程序:

staticchardrv_buf[1024];

staticssize_tevan_write(structfile*filp,char*buffer,size_tcount)

{

introw;

intcol;

copy_from_user(drv_buf,buffer,count);

row=(int)(drv_buf[0]);

col=(int)(drv_buf[1]);

printk("userwritedatatodrivers!

\n");

solve(row,col);

3.测试程序:

intmain(){

……

printf("pleaseinputtwointeger:

\n");

scanf("%d%d",&row,&col);

buf[0]=(char)(row);

buf[1]=(char)(col);

write(fd,buf,2);

printf("Read%dbytesdatafrom/dev/evan\n",row*col);

read(fd,buf,row*col);

showbuf(buf,row,col);

ioctl(fd,1,NULL);

close(fd);

return0;

}

voidshowbuf(char*buf,introw,intcol)

{

inti;

for(i=0;i

{

if(i!

=0&&i%col==0){

printf("\n");}

printf("%4c",buf[i]);

}

printf("\n");

}

 

实验四哲学家进餐问题

一、实验目的

1.理解linux多线程机制。

2.使用多线程机制编程实现哲学家进餐模型,诠释死锁和避免死锁的办法。

二、实验环境和工具

RedHatLinux

三、实验流程

1.明确哲学家进餐问题。

2.编程实现。

3.编写Makefile文件。

4.运行调试。

四、实验结果

五、实验心得

通过本次实验,我了解了Linux下多线程机制,线程是系统能够独立调度和分配的最基本单位,可以理解为是进程基础上的进一步细化。

一个程序中同时运行多个线程来完成不同的任务,称之为多线程。

哲学家进餐问题是经典的同步问题,我先是去网上查找相关资料,找到了程序源码,一开始编译不通过,报告“段错误”,是因为代码中有些字符不规范,修改后编译通过。

经运行测试,程序中缺少延时机制,无法得出程序运行结果,我在程序里加了sleep语句后程序结果可读性大大改善。

从这个实验我也认识到培养在网上检索资料的能力的重要性。

六、关键代码

注:

加粗部分为修改部分

sem_tchopsticks[PEOPLE_NUM];

pthread_mutex_tmutex;

void*philosopher(void*arg){

intstate=THINKING;

intright=(id+1)%PEOPLE_NUM;

intleft=(id+PEOPLE_NUM-1)%PEOPLE_NUM;

while

(1){

switch(state){

caseTHINKING:

sleep

(1);

……

break;

caseHUNGRY:

sleep

(2);

strcpy(ptrState,"Hungry");

pthread_mutex_lock(&mutex);

if(sem_wait(&chopsticks[left])==0){//非阻塞状态

if(sem_wait(&chopsticks[right])==0){//非阻塞

pthread_mutex_unlock(&mutex);

state=EATING;

}else{

state=THINKING;

sem_post(&chopsticks[left]);//释放请求的得到的left筷子

}

}

break;

caseEATING:

sleep(3);

sem_post(&chopsticks[left]);

sem_post(&chopsticks[right]);

……

break;

}

}

pthread_exit((void*)0);

}

intmain(){

pthread_ttid[PEOPLE_NUM];

pthread_mutex_init(&mutex,NULL);

for(i=0;i

sem_init(&chopsticks[i],0,1);

}

for(i=0;i

pthread_create(&tid[i],NULL,philosopher,(void*)i);;创建五个哲学家线程

}

for(i=0;i

pthread_join(tid[i],NULL);;等待线程执行结束

}

return0;

}

 

实验五shell模拟程序的设计与实现

一、实验目的

1.理解shell的概念及其执行过程。

2.实现一个交互式shell,具备的功能至少有:

打印提示符,获取用户输入指令;解析指令;寻找命令文件,执行指令。

二、实验环境和工具

RedHatLinux

三、实验流程

1.明确程序的功能要求。

2.逐步实现程序功能:

打印提示符、获取用户输入命令、解析命令、寻找命令文件、执行命令。

代码见关键代码部分。

四、实验结果

五、实验心得

本次实验,让我学会了简单的shell模拟器的编程实现,理解了shell模拟器的工作原理和工作过程。

Shell是操作系统的用户界面,提供了用户与内核进行交互操作的接口,负责接收用户命令并把其送入内核去执行。

通过shell,用户可以方便的管理计算机资源。

Shell模拟器不断的接收用户指令并解析执行,直到用户关闭它,所以程序中要有一个while

(1)循环。

实验中我只实现了对几个常用指令的解释执行,基本模拟了shell的实现。

我感觉本次试验的难点是:

如何将用户输入的指令与系统中的指令正确对应;字符串操作不熟悉,一些函数不知道。

C语言提供了strncasecmp函数进行字符串比对,然后根据返回值进行相应的指令处理即可。

六、关键代码

while

(1){

path=get_current_dir_name();

memset(cmd,0,1024);

printf("@zhangyu%s>$",path);

fgets(cmd,1000,stdin);/*接受用户输入,命令最长1000个字符*/

cmd[strlen(cmd)-1]=0;/*去掉输入的回车符*/

b=transcmd(cmd);/*分析取得用户命令字*/

switch(b){

case9:

/*如果是Bye*/

printf("Seeyoulater!

\n");

break;

case1:

/*切换工作目录*/

if(chdir(cmd+3)!

=0){

printf("chdir(%s)error!

%s\n",cmd+3,strerror(errno));

}

break;

case2:

/*ls命令*/

case7:

/*cp命令*/

case8:

/*pwd命令*/

system(cmd);

break;

case3:

/*pid命令*/

printf("%d\n",getpid());

break;

case4:

/*rm命令*/

remove(cmd+3);

break;

case5:

/*mkdir命令*/

mkdir(cmd+6,0755);

break;

case6:

/*mv命令*/

p=strchr(cmd+3,'');

*p=0;

rename(cmd+3,p+1);

break;

case0:

/*不能识别的命令*/

printf("Badcommand,tryagain!

Allaviablecommandsare:

\nlogoutcdlspwdpidrmmkdirmvcp\n",getpid());

break;

}

}

}

chartranscmd(char*s)

{

if(!

strncasecmp(s,"cd",2))return1;

elseif(!

strncasecmp(s,"ls",2))return2;

elseif(!

strncasecmp(s,"pid",3))return3;

elseif(!

strncasecmp(s,"rm",2))return4;

elseif(!

strncasecmp(s,"mkdir",5))return5;

elseif(!

strncasecmp(s,"mv",2))return6;

elseif(!

strncasecmp(s,"cp",2))return7;

elseif(!

strncasecmp(s,"pwd",3))return8;

elseif(!

strncasecmp(s,"bye",3))return9;

elsereturn0;

}

 

实验六系统调用

一、实验目的

1.理解系统调用过程

2.学会自己添加系统调用

二、实验环境和工具

RedHatLinux

三、实验流程

1.决定系统调用名字,本实验中叫__NR_print_info,内核中系统调用实现程序的名字:

sys_print_info。

之后在头文件unistd.h添加系统调用号,该文件所在目录是/usr/include/asm/unistd.h,如下:

2.在系统调用表中添加相应表项,系统调用表所在目录:

/usr/src/linux-2.4/arch/i386/kernel/entry.S

3.添加实现程序,目录:

/usr/src/linux2.4/kernel/sys.c

4.修改Makefile文件,将版本号改为-17(用来区别之前的系统)。

5.编译内核:

进入内核所在目录,依次输入如下命令:

makemrproper;makeclean;makemenuconfig;makedep;makebzImage;makemodules;makemodules_install

6.将生成的新内核移动到boot下并改名,操作如下:

cp/usr/src/linux-2.4/arch/i386/boot/bzImage/boot/vmlinuz-2.4.20-17;cp/usr/src/linux-2.4/System.map/boot/System.map-2.4.20-17;cd/boot;mkinitrdinitrd-2.4.20-17.img2.4.20-17

7.修改grup文件,添加新启动项

8.重启系统,进入新内核,编写测试程序,运行调试。

四、实验结果

五、实验心得

系统调用是内核提供的、功能十分强大的一系列函数,是用户程序与内核交互的一个接口。

通过本次实验,我理解了系统调用的实现过程,应用程序执行系统调用后,从用户态切换到内核态,之后在内核空间调用内核函数,执行完毕后从内核态切换回用户态。

实验中不好理解的一点是如何根据系统调用号259在系统调用表中找到相应表项。

系统调用表中有一句代码:

.reptNR_syscalls-(.-sys_call_table)/4.开始的“.”代表当前地址,sys_call_table代表数组首地址,所以两个变量相减,得到差值表示这个系统调用表的大小(字节数),之后再除以4(每个系统调用占四个字节),得到系统调用个数。

一开始我总是做不成功,是因为在添加系统调用号的时候添错了地方,我加在了/usr/src/linux-2.4/include/asm-i386/unistd.h,改正后便实现了。

六、关键代码

实验七FloppyLinux的实现

一、实验目的

1.了解linux的引导过程。

2.实现一款FloppyLinux。

二、实验环境和工具

RedHatLinux

工具:

busybox

三、实验流程

1.软盘安装引导器

a.对软盘建立ex2文件系统

#mke2fs/dev/fd0

b.将系统中grub目录下的引导文件stage1,stage2复制到软盘中

c.配置grub信息

2.配置busybox相关选项

Makemenuconfig

前三个选项中只选择第一项,其他默认。

3.编译并安装busybox

4.建立临时目录,该目录为软盘的文件系统

5.建立设备列表

6.建立启动配置文件(重点步骤)

7.制作镜像文件initrd.img

8.检查,用loop设备把镜像文件重新挂装到文件系统里,之后压缩镜像文件。

9.编译linux内核

注意makemenuconfig步骤,按照书上的要求来,最后我编译的内核大小为810k。

10.整合启动盘

11.测试

四、实验结果

五、实验心得

通过本次实验,我了解了linux系统的启动过程,进一步熟悉了linux内核编译过程。

学会了floppylinux的制作方法,做成之后非常有成就感。

我认为本实验并不难,考验的是细心。

实验步骤很多,每个步骤出现错误,都有可能导致实验失败。

所以要力求每个步骤准确无误,特别是建立启动配置文件的时候,要仔细核对每一个单词,特别注意空格。

第一遍没有成功,原因就出在这里。

总之,面对一个步骤复杂的事情,要细心。

六、关键代码

Inittab:

:

:

sysinit:

/etc/init.d/rcS

:

:

askfirst:

/bin/sh

rcS:

#!

/bin/sh

mount–a

#chmod755rc.sysinit

fstab:

proc/procprocdefaults00

grub.conf

timeout0

default10

titleFloppyLinux

root(fd0)

kernel/boot/bzImage

initrd/initrd.img.gz

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 国外设计风格

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1