Linux实验指导 2010

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《Linux内核与程序设计》实验指导
实验一实验名称:常用命令和编辑器的使用
一、实验目的
1、掌握Linux一般命令格式
2、掌握有关文件和目录操作的常用命令
3、掌握有关进程操作的常用命令
4、熟悉使用man命令
5、学习使用vi编辑器的建立、编辑、显示及加工处理文本文件
二、实验内容
1、熟悉date、cal、who、echo、clear、passwd命令
2、在用户主目录下对文件进行操作:复制一个文件、显示文件内容、查找指定
内容、排序、文件比较、文件删除等
3、对目录进行管理:创建和删除子目录、改变和现实工作目录、列出和更改文
件权限、链接文件等
4、利用man显示date、echo等命令的手册页
5、利用文本插入方式建立一个文件
6、对该文件执行删除、复原、修改、替换等操作
三、主要实验步骤
1、使用简单命令date、cal、who、echo、clear、passwd等,了解linux命令格

2、浏览文件系统:
(1)运行pwd命令,确定当前工作目录
(2)运行ls –l命令,理解各字段含义
(3)运行ls –ai命令,理解各字段含义
(4)使用cd命令,将工作目录改为根(/)上,运行ls –l命令,结合书中图2.2,
了解个目录的作用
(5)直接使用cd,回到哪里了?用pwd验证
(6)用mkdir建立一个子目录subdir
(7)将工作目录改到subdir
3、工作操作
(1)验证当前工作目录在subdir
(2)运行date>file1,然后运行cat file1,看到什么信息?
(3)运行cat subdir,会有什么结果?为什么?
(4)利用man命令显示date命令的使用说明
4、运行man date>>file1,看到什么?
运行cat file1,看到什么?
5.文件操作
(1)显示file1的前10行,后10行
(2)运行cp file file2,然后ls –l,看到什么
(3)运行cat f*,结果怎样
(4)运行rm file3,然后ls –l,结果如何
(5)统计file1文件的行数、字数
6.vi编辑器
(1)进入vi
(2)建立一个文件,如file.c.进入插入方式,输入一个C语言程序的各行内容,故意制造几处错误.最后,将该文件存盘.回到shell状态下.
(3)运行gcc file.c –o myfile,编译文件,会发现错误提示.理解其含义
(4)重新进入vi,对该文件进行修改.然后存盘,退出vi.重新编译该文件.如果编译通过了,可以用./myfile运行该程序
(5)运行man date>file10,然后vi file10。

使用x,dd等命令删除某些文本行。

使用u命令复原此前的情况。

使用c、r、s等命令修改文本内容。

使用检索命令进行给定模式的检索。

实验二实验名称:shell脚本的设计和执行
一、实验目的
1.了解shell的作用和主要分类
2.掌握shell脚本的建立和执行方式
3.掌握编写shell脚本的基本语法
4.学会编写并执行shell脚本
二、实验内容
1.历史命令和别名定义
2.shell脚本的建立和执行
3.shell变量和位置参数、环境变量
4.shell特殊字符在脚本中的使用
5.一般控制结构的使用
6.算数运算和函数的使用
三、主要实验步骤
1.利用vi编辑器建立一个简单的shell脚本,其中包括date,pwd,ls等常
用命令。

然后以至少两种不同的方式执行该脚本(参考书上P84,4.1.3
节内容)。

2.运行history命令,查看历史命令环境;
3.体会命令补齐功能(参见
4.3节内容);
4.编辑并运行书上P91页4.
5.2节引号的相关脚本和命令;
5.编辑并运行书上P108页例4.9,体会位置参数的相关用法;
6.编辑并运行书上P125页,例4.13,体会shell脚本中条件表达式、算
数表达式、逻辑运算的使用方法,同时需要注意实验室linux环境与书
本中linux版本的不一致;
7.编辑并运行书上P130页,例4.15,体会值表方式的for循环与位置参
数相结合的使用方法;
8.编辑并运行书上P131页,例4.16,体会算数表达式方式的for循环用
法;
9.编辑并运行书上P134页,例4.19,体会shell脚本中函数的使用;
10.自己编写shell脚本,实现以下功能:
11.Shell脚本文件名为sq,执行时接受2-10范围内的一个整数作为输入参
数,在屏幕上用+号、@号和 &号画出以给定参数为边长的正方形。

12.例如:输入命令$ sq 4并回车,则屏幕上会绘制如下的正方形,(注:
其中第2、3行上的&符号之间有两个空格)
@+ +@
& &
& &
@++@
实验报告要求:在实验步骤中写出主要的脚本代码,并且最后要写实验小结
实验三实验名称: Linux环境下程序的编译、调试和维护
一、实验目的
1、掌握gcc编译器在预处理、编译、汇编和连接各个阶段的用法
2、掌握gdb调试工具的常用命令
二、实验内容
1.使用gcc编译器中的预处理选项
2.使用gcc编译器中的编译程序选项
3.使用gdb调试工具查看源程序和数据
4.使用gdb调试工具查看运行时的数据
5.使用gdb调试工具控制程序的执行
三、实验步骤
1.编写并验证书本P180页例题6.1
2.编写并验证书本P181页例题6.2
3.编写并验证书本P193页6.2.6应用示例
实验四实验名称:Linux环境编程
一、实验目的
1、理解系统调用和库函数的使用方法和格式
2、掌握文件操作相关的系统调用函数的使用和编程
3、掌握进程控制相关的系统调用函数的原理、语法和编程应用
二、实验内容
1.使用文件操作系统调用函数open,read,write进行程序设计
2.创建子进程的系统调用fork()设计程序,观察程序的执行结果
3.比较子进程等待函数wait和waitpid的异同
三、实验步骤
1.下列代码说明,如何对普通文件、设备文件,通过系统调用进行读写和打开操作。

其中用到的三个文件:
fileexp.c:普通文件
/dev/null: 设备文件
/tmp/m1.c 普通文件
对文件的打开标志:
O_CREAT 如果被打开的文件不存在,则创建它
O_RDONLY 只读方式打开
O_WRONLY 只写方式打开
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int fd1,fd2,fd3,nbytes;
char buf[10];
if((fd1=open(“fileexp.c",O_RDONLY))<0){ perror("open fileexp.c");
exit(EXIT_FAILURE);
}
if((fd2=open("/dev/null",O_WRONLY))<0){
perror("open /dev/null");
exit(EXIT_FAILURE);
}
if((fd3=open("/tmp/m1.c",O_CREAT|O_WRONLY))<0){
perror("open /tmp/m1.c");
close(fd1);
close(fd2);
exit(EXIT_FAILURE);
}
while((nbytes=read(fd1,buf,10))>0){
if(write(fd2,buf,10)<0)
perror("write /dev/null");
if(write(fd3,buf,nbytes)<0)
perror(“write /tmp/m1.c");
write(STDOUT_FILENO,buf,10);
}
close(fd1);
close(fd2);
close(fd3);
exit(EXIT_SUCCESS);
}
2.编辑并运行下列代码,理解fork函数的执行原理int main()
{ int i;
int pid;
pid=fork();
if (pid<0) printf(“error”)
else if (pid == 0)
{ for (i = 1; i < 3; i++)
printf("This is child process\n");
}
else
{ for (i = 1; i < 3; i++)
printf("This is parent process\n");
}
}
3.编辑并执行下列程序,观察并分析程序执行结果int com=0;
main()
{
pid_t pid;
pid=fork();
if(pid<0)
then printf("error");
else if(pid==0)
then
{com=1};
else
{com=com+1};
printf{"com=%d\n",com};
}
4.编辑并执行下列程序,观察并分析进程ID获取函数的用法
#include <unistd.h>
#include <sys/types.h>
main()
{
pid_t pid;
pid=fork();
if(pid<0) printf("fork error!\t");
else if(pid==0)
printf("child process now! pid=%d ppid=%d\t",getpid(),getppid()); else
printf("parent process now! pid=%d child_pid=%d\t",getpid(),pid); }
5. 编写程序验证书本P213页的例题7.3
6.编写程序验证PPT中的相关例题,思考运行结果。

实验五实验名称:Linux进程通信的程序设计和实现
一、实验目的
1、掌握进程通信相关的系统调用的语法格式
2、掌握pipe,kill和消息队列函数在父子进程通信时的具体用法
3、能够读、写系统调用程序,理解程序的输出结果。

二、实验内容
1.在程序设计中使用pipe函数进行基于管道的进程通信
2.在程序设计中使用kill函数进行基于信号量的进行通信
3.在程序设计中使用消息队列机制实现进行通信
三、实验步骤
1.参考下列伪码,编辑并执行pipe函数的程序
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
int main(int argc,char **argv)
{
static const char mesg[]="Happy New Year";
char buf[BUFSIZ];
size_t rcount,wcount;
int p_fd[2];
size_t n;
if(pipe(p_fd)<0){
printf(“pipe error”);
exit(EXIT_FAILURE);
}
printf("Read end=fd %d,write end=fd %d\n",p_fd[0],p_fd[1]); n=strlen(mesg);
if((wcount=write(p_fd[1],mesg,n))!=n){
printf(“write error”);
exit(EXIT_FAILURE);
}
if((rcount=read(p_fd[0],buf,BUFSIZ))!=wcount){
printf(“read error”);
exit(EXIT_FAILURE);
}
printf("Read <%s> from pipe\n",buf);
close(p_fd[0]);
close(p_fd[1]);
return 0;
}
2.在下列伪码中加入头文件,编辑运行,理解kill函数
int main()
{ pid_t child;
int status, retval;
if((child=fork())<0) { perror(“fork”); exit(EXIT_FAILURE); }
else if (child==0) {
printf(“Child’s ID:%d\n”, child);
sleep(20);
exit(0); }
else {
if((waitpid(child,&status,WNOHANG))==0){
retval=kill(child,SIGKILL);
if (retval){
perror(“kill”);
waitpid(child,&status,0);
}
else printf(“%d is killed”,child);
}
}
3.编辑并运行书本P218页进程使用消息队列进行通信的例题。

思考消息队列的使用机制和运作机制。

4.编辑并运行书本P220页例题7.7,思考和验证运行结果。

5.编写程序验证PPT中的相关例题,思考运行结果。

相关文档
最新文档