Linux_实验指导书4版

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

嵌入式操作系统





目录
实验一常用命令的使用
实验二 vi编辑器
实验三 shell编程(一)
实验四 shell编程(二)
实验五常用开发工具
实验六 Linux环境编程(一)
实验七 Linux环境编程(二)
实验八系统及网络管理
实验一常用命令的使用
班级:姓名:学号:上机时间:
任课教师:实验教师:实验成绩:
一、实验目的
1.掌握Linux的一般命令格式。

2.掌握有关文件和目录操作的常用命令。

3.掌握有关进程操作的常用命令。

4.熟练使用man命令。

二、实验任务
1.正确登录和退出系统。

2.熟悉data,cal,who,echo,clear命令。

3.在用户主目录下对文件进行操作:复制一个文件、显示文件内容、查找指定内容、排序、文件比较、文件删除等。

4.对目录进行管理:创建和删除子目录、改变和显示工作目录、列出和更改文件权限、链接文件等。

5.利用man显示date,echo等命令的手册页。

三、实验注意事项
实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。

要求每个同学登录后系统后,要在主目录(/home/student)下创建一个属于自己的子目录(以自己(拼音)名字或学号)。

以后所有工作都要在自己的目录内进行。

建议以后的实验都在同台计算机上做,这样可以保持连续性。

四、实验内容:
1.登录进入系统。

开机,选择 VMware Workstation 进入,再选择 Ubuntu 登陆窗口,输入用户名: student ,输入密码: 111111 ,进入Ubuntu图形桌面环境。

2.使用简单命令:date,cal,who,echo,clear等,了解Linux命令格式。

要启动一个终端,可以选择在窗口左侧点击终端按钮。

在终端提示符下输入:date↲显示: 2015年 10月 15日星期四 08:31:50 CST 。

在终端提示符下输入:who ↲显示: student pst/1 2015-10-15 08:22(:0) 。

在终端提示符下输入:who am I ↲显示: student pst/1 2015-10-15 08:22(:0) 。

在终端下显示Hello! 命令: echo Hello!。

在终端提示符下输入:clear ↲显示:屏幕清空。

在终端提示符下输入:cal ↲显示:本月日历。

3.浏览文件系统:
(1)运行pwd 命令,确定当前工作目录,记录之: /home/student 。

(2)运行ls命令,查看当前目录下有哪些文件和子目录,简略记录。

Examples.desktop h.c 公共的模板视频图片文档下载音乐桌面
(3)运行ls -l命令,理解文件各字段的含义,找一个文件标注。

(4)运行ls -ai命令,理解各字段的含义。

(5)使用cd /命令,将当前目录改变为根目录(/)。

运行ls -l命令,结合书中给出的Linux树状目录结构,了解各目录的作用。

命令: cd / ↲回到: /
命令: pwd ↲显示: /
命令: ls -l ↲显示:(简略记之)
(6)直接使用cd,回到了那里?用pwd验证之。

命令: cd ↲回到: /home/student
命令: pwd ↲显示: /home/student
(7)用 mkdir建立一个子目录subdir。

命令: mkdir subdir ↲
(8)将当前目录改到subdir。

命令: cd subdir ↲
4.文件操作:
(1)验证当前目录在subdir。

命令: pwd ↲显示: /home/student/subdir (2)运行date>file1,然后运行cat file1,看到什么信息?
命令: date>filel ↲,命令: cat filel
显示: 2015年 10月 15日星期四 09:10:44 CST
“ >”是什么符号?写入
解释“date>file1 ”的含义:把日期放入到文件filel中
(3)运行cat subdir,会有什么结果?为什么?
结果:显示没有那个文件或目录
为什么?当前在subdir目录中。

(4)分别用cat和more查看文件内容(提示:/etc/manpath.config)。

比较cat和more这两个命令的
异同。

都是用来显示文件内容的命令,但是more命令是分屏输出。

(5)利用man 命令显示date命令的使用说明。

命令: man date ↲
显示:(简略记之)
Name synopsis description examples date spring author reporting bugs copyright see also 。

如何从man命令状态退回到终端窗口?按Q 。

(6)运行man date>>file1,再运行cat file1 ,看到什么?
命令:命令:
显示:。

man date>>file1含义:。

(7)利用ls -l file1,了解链接计数是多少?运行 ln file1 ../fa,再运行ls -l file1,看链接计数有无变化?用cat命令显示fa文件内容。

命令:ls -l file1↲显示的链接计数:
命令:ln file1 ../fa↲
命令:ls -l file1↲显示的链接计数: ,有无变化?。

命令:cat fa↲显示:。

(8)使用head和tail命令分别显示file1文件的前十行和后十行的内容。

命令:↲
命令:↲
(9)运行cp file1 file2,然后ls -l,看到什么?
命令:cp file1 file2 ↲
ls -l↲
解释显示结果:
运行mv file2 file3, 然后ls -l,看到什么?
命令:mv file2 file3↲
ls –l ↲
解释显示结果:
运行cat f*,结果怎样?
命令:cat f* ↲
解释显示结果:
(10)运行rm file3,然后ls -l,看到什么?
命令:rm file3 ↲
命令:ls -l ↲
解释显示结果:
(11)在/etc/passwd文件中查找适合你的注册名的行。

命令:
(12)运行ls -l理解各文件的权限是什么?(选择两个不同文件标注)
(13)用两种方式改变file1的权限(实例)。

①以符号模式改变权限:
②以绝对方式改变权限:
(14)统计file1文件的行数、字数、字节数。

命令:↲
显示:
解释各参数的含义:
(15)运行命令man ls |more
“man ls |more”的含义:
运行cat file1|head -20|tee file5,结果如何?
显示结果:
“cat file1|head -20|tee file5”的含义:
运行cat file5|wc,结果如何?
显示结果:
“cat file5|wc”的含义:
(16)运行cd,回到主目录,运行mkdir mydir,建立mydir 子目录,运行ls -l查看目录,再运行rmdir mydir,看到什么结果?如果要删除mydir目录,该如何操作?
运行命令:cd <回车键> 回到:
运行命令:mkdir mydir 建立:
运行命令:查看所建目录内容
运行命令:cp /etc/profile /home/student/mydir
解释该命令:
查看mydir内容命令:
运行命令: rmdir mydir ↲
看到什么结果:
如何处理?
注意:在这个实验中没有特别的难点,但是要注意的是,rm命令删除文件的时候,不给任何提示,因此一定要谨慎,不然很容易删除不应该删除的文件。

五、实验报告
1.按实验步骤写出实验命令及运行结果,回答所提问题。

2.总结上机过程中所遇到的问题和解决方法及感想。

实验二使用vi编辑器
班级:姓名:学号:上机时间:
任课教师:实验教师:实验成绩:
一、实验目的
学习使用vi编辑器建立、编辑、显示以及加工处理文本文件。

二、实验任务
1.进入和退出vi。

2.利用文本插入方式建立一个文件,查找错误,并修改。

3.在新建的文本文件上移动光标。

4.对文本文件执行删除、复原、修改、替换操作。

三、实验注意事项
实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。

要求每个同学登录后系统后,要在自己的家目录下创建一个属于自己的子目录(以自己(拼音)名字或学号)。

以后所有工作都要在自己的目录内进行。

建议以后的实验都在同台计算机上做,这样可以保持连续性。

四、实验内容
1.进入和退出vi
(1)进入vi,创建一个file.c文件。

命令:。

(2)进入插入方式,输入如下C程序,将该文件存盘,回到shell状态下。

#include<stdio.h>
int main()
{
float a,b,x;
printf("Please input a,b:");
scanf("%,%",a,b);
x=a%b;
printf("x=%\n",x);
return 0;
}
进入插入方式命令:,文件存盘回到shell状态命令:。

(3)运行gcc file.c -o myfile,编译该文件,会发现错误提示,理解其含义。

编译命令:gcc file.c -o myfile <回车>
警告:。

警告:。

错误:。

(4)重新进入vi,对该文件进行修改,然后存盘,退出vi。

重新编译该文件,如果编译通过,运行该程
序。

运行程序命令:./myfile
注意:在错误程序行旁边注释正确程序。

(5)运行man date>file10,然后用vi打开file10文件,使用x,dd命令删除某些文本行,使用u命令复原此前的情况,使用c,r,s等命令修改文本内容,使用检索命令进行给定模式的检索。

删除光标所在的字符命令:。

删除光标前面那个字符命令:。

从光标位置删至到行尾命令:。

从光标位置删至到行首命令:。

复原命令:。

修改命令举例:
c:
r:
s:
搜索命令:
向前字符串检索举例:解释:
向后字符串检索举例:解释:
查找字符命令举例:解释:
解释:
全局替换命令举例:解释:
解释:
解释:
2.新建文件
(1)请在主目录(/home/student)下建立一个名为 vitest 的目录;
命令:
(2)进入 vitest 这个目录当中;
命令:
(3)将 /etc/manpath.config 拷贝到本目录下;
命令:
(4)使用 vi 开启本目录下的 manpath.config 这个文件;
命令:
(5)在 vi 中设定一下行号;
设置行号命令:。

(取消行号命令: :set nonu 。


(6)移动到第67 行,向右移动 26 个字符,请问您看到的是什么目录?
移动到第67 行的命令:向右移动 26 个字符的命令:
看到:
(7)再向左移动16个字符的命令:看到:
(8)回到当前行第一个字符处命令:移动到当前行的行尾命令:
(9)移动到第5行(包含当前行)词尾命令:。

再回到当前行的第一个字符处。

(10)光标向前移至下一个词的开头命令:。

(11)光标后退到前一个词的开头命令:。

(12)移动到第一行,并且向下搜寻一下『 modify 』这个字符串,请问他在第几行?
移动到第一行:,向下搜寻一下“modify ”它在行。

(13)接着下来,我要将 50 到 70 行之间的 man 改为 MAN ,并且一个一个挑选是否需要修改,如何下达指令?
命令:
(14)修改完之后,突然反悔了,要全部复原,有哪些方法?
(15)我要复制51到60行这十行的内容,并且贴到最后一行之后;
(16)删除11到30行之间的20行;
(17)将这个文件另存成一个 man.test.config 文件;
(18)到第29行,并且删除 15 个字符;
(19) 请问目前的文件有多少行与多少字符?用什么命令统计?
命令:
(20)储存后离开吧。

五、实验报告
1.按实验步骤写出实验命令及运行结果,回答所提问题。

2.总结上机过程中所遇到的问题和解决方法及感想。

实验三 shell编程(一)
一、实验目的
1.了解shell的作用和主要分类。

2.掌握bash的建立和执行方式。

3.掌握bash的基本语法。

4.学会编写简单的shell 脚本。

二、实验内容
1.利用vi 建立一个脚本文件,该文件在用户输入年、月之后,自动打印数出该年该月的日历。

然后以3种不同方式执行该脚本,如有不能执行情况,请说明原因。

2.编程提示用户输入两个单词,并将其读入,然后比较这两个单词,如果两个单词相同则显示“Match”,并显示“End of program”,如果不同则显示“End of program”。

3.修改上述程序,编程提示用户输入两个单词,并将其读入,然后比较这两个单词,如果两个单词相同显示“Match”,不同则显示“Not match”,最后显示“End of program”。

<编程提示>请使用if…then…else控制结构。

4.编程使用case结构创建一个简单的菜单,屏幕显示菜单:
a. Current date and time
b. User currently logged in
c. Name of the working directory
d. Contents of the working directory
Enter a,b,c or d:
根据用户输入选项做相应操作。

5.修改上题,使用户可以连续选择直到想退出时才退出。

6. 设计一个程序,从命令行接收数值参数,并计算这些参数的和。

四、实验注意事项
实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。

要求每个同学登录后系统后,要在自己的家目录下创建一个属于自己的子目录(以自己(拼音)名字或学号)。

以后所有工作都要在自己的目录内进行。

建议以后的实验都在同台计算机上做,这样可以保持连续性。

五、实验报告
1.列出调试通过程序的清单,并加注释。

2. 写出程序运行步骤及结果。

3.总结上机调试过程中所遇到的问题和解决方法及感想。

实验四 shell编程(二)
一、实验目的
继续学习shell 脚本编写。

二、实验注意事项
实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。

要求每个同学登录后系统后,要在自己的家目录下创建一个属于自己的子目录(以自己(拼音)名字或学号)。

以后所有工作都要在自己的目录内进行。

建议以后的实验都在同台计算机上做,这样可以保持连续性。

三、实验内容及步骤:
1. 编写一个脚本,求斐波那契数列的前10项及总和。

2.编写一个脚本,求一个数的逆序。

3.设计一个Shell程序,在用户主目录下建立一个userdata目录,在此目录下再建立10个目录,即
user1~user10,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。

4.用Shell编程,判断一文件是不是普通文件,如果是将其拷贝到/home/student/test 目录下,用命令查看test目录内容,最后再删除test目录。

5.编写脚本,统计指定目录下普通文件及目录文件的数目,要求不能使用wc统计命令。

6.编程实现简单计算器。

要求用户输入一个表达式并输入结果,程序会判断用户输入的结果是否正
确,并给出提示。

直到用户输入‘q’时,才退出执行。

参考程序:
#!/bin/bash
#fileName:first
#note:This is the first title
#function:input an expretion and the answer, I will tell you right or wrong # You can try it as many times as you like.
echo Hello! @_@
echo Welcom to the calculate testing!
echo You can input an expretion such as 2*2 or 3+1, and input the answer echo I will tell you whether you are right or wrong.
echo You can input 'q' to exit.
echo "Now let's begin!"
number1=0;
while [ "$number1" != "q" ]
do
echo Input the first number:
read number1
echo Input the operator type:
read type
echo Input the second number:
read number2
echo Input the answer:
read yourAnswer
case $type in
+) myAnswer=`expr $number1 + $number2`;;
-) myAnswer=`expr $number1 - $number2`;;
\*)myAnswer=`expr $number1 \* $number2`;;
/)
if [ $number2 -eq 0 ]
then
echo "Sorry! :-("
echo "0 cannot be the divisor"
continue
else
myAnswer=`expr $number1 / $number2`
fi
;;
*) echo Error!;;
esac
if [ $myAnswer -eq $yourAnswer ]
then
echo ":-)" Congratulations!
echo Your are right!
echo Input 'q' to exit or try again!
else
echo ":-(" Sorry!
echo You are wrong!
echo "The right answer is:"
echo "$number1 $type $number2 = $myAnswer"
echo Input 'q' to exit or try again!
fi
# echo Input the first number:
# read number1
done
要求:请同学仔细分析该程序,理解其中的语句及用法,写出程序分析及总结。

五、实验报告
1.列出调试通过程序的清单,并加注释。

2. 写出程序运行步骤及结果。

3.总结上机调试过程中所遇到的问题和解决方法及感想。

实验五常用开发工具
一、实验目的
1.掌握C语言编译的基本方法。

2.掌握gdb调试工具的基本用法。

3.理解make工具的功能,学会编制makefile的方法。

二、实验内容
1. 用gcc带不同参数编译下列C程序。

#include <stdio.h>
main()
{
printf(”Hello World!\n”);
}
2.实例教你如何编译和用 gdb 调试程序。

被调试的程序相当的简单, 但它展示了 gdb 的典型应用。

这个程序被称为 greeting , 它显示一个简单的问候, 再用反序将它列出。

3.利用gcc 编译下列C 语言程序,查看运行结果,如果有错用gdb调试之。

#include
static char buff[256];
static char* string;
int main ()
{
printf ( "Please input a string: ");
gets (string);
printf ( "\nYour string is: %s\n ", string);
}
4.多模块组合开发与编译、静态库的构造与使用。

设有C语言文件f1.c,内容为:
#include <stdio.h>
f1(int arg)
{
printf("F1: you passed %d\n",arg);
}
设有C语言文件f2.c,内容为:
#include <stdio.h>
f2(char *arg)
{
printf("F2: you passed %s\n",arg);
}
主函数所的模块为m.c,内容为:
#include <stdio.h>
main()
{
f1(16);
f2("Hello World!");
}
5.假设我们有一个程序由5个文件组成,源代码如下所示,编制一个简单的makefile程序。

/*main.c*/
#include "mytool1.h"
#include "mytool2.h"
int main()
{
mytool1_print("hello mytool1!");
mytool2_print("hello mytool2!");
return 0;
}
/*mytool1.c*/
#include "mytool1.h"
#include <stdio.h>
void mytool1_print(char *print_str)
{
printf("This is mytool1 print : %s ",print_str);
}
/*mytool1.h*/
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
/*mytool2.c*/
#include "mytool2.h"
#include <stdio.h>
void mytool2_print(char *print_str)
{
printf("This is mytool2 print : %s ",print_str);
}
/*mytool2.h*/
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
三、实验注意事项
实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。

要求每个同学登录后系统后,要在自己的家目录下创建一个属于自己的子目录(以自己(拼音)名字或学号)。

以后所有工作都要在自己的目录内进行。

建议以后的实验都在同台计算机上做,这样可以保持连续性。

用户要按通常实验要认真书写实验报告。

四、实验步骤
1.实验内容1编译及运行方法如下所示:
gcc –o hello hello.c #生成可执行程序hello
gcc –o hello_st hello.c -static #生成可执行程序hello_st
gcc –o hello_sh hello.c -shared #生成可执行程序hello_sh
gcc –o hello_rd hello.c -rdynamic #生成可执行程序hello_rd
注意观察各编译参数的意义及作用,最后通过命令ls –l a.out hello*来观察所生成文件的不同,为什么会这样?
2. 下面列出了实验内容2将被调试的程序:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void my_print (char *string)
{
printf ("The string is %s\n", string);
}
void my_print2 (char *string)
{
char *string2;
int size, i;
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size - i] = string[i];
string2[size+1] = `\0';
printf ("The string printed backward is %s\n", string2);
}
int main ()
{
char my_string[] = "hello there";
my_print (my_string);
my_print2 (my_string);
}
用下面的命令编译它:
gcc –g greeting.c -o greeting
这个程序执行时显示如下结果:
The string is hello there
The string printed backward is
输出的第一行是正确的, 但第二行打印出的东西并不是我们所期望的。

我们所设想的输出应该是: The string printed backward is ereht olleh
由于某些原因, my_print2 函数没有正常工作。

让我们用 gdb 看看问题究竟出在哪儿,先键入如下命令:
gdb greeting
注意: 记得在编译 greeting 程序时把调试选项打开。

如果你在输入命令时忘了把要调试的程序作为参数传给 gdb , 你可以在 gdb 提示符下用 file 命令来载入它:
(gdb) file greeting
这个命令将载入 greeting 可执行文件就象你在 gdb 命令行里装入它一样。

这时你能用 gdb 的 run 命令来运行 greeting 了。

当它在 gdb 里被运行后结果大约会象这样: (gdb) run
Starting program: /home/student/greeting
The string is hello there
The string printed backward is
Program exited normally.
这个输出和在 gdb 外面运行的结果一样。

问题是, 为什么反序打印没有工作? 为了找出症结所在, 我们可以在 my_print2 函数的 for 语句后设一个断点, 具体的做法是在 gdb 提示符下键入 list 命令三次, 列出源代码.
技巧: 在 gdb 提示符下按回车健将重复上一个命令.
第一次键入 list 命令的输出如下:
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 void my_print (char *string)
5 {
6 printf ("The string is %s\n", string);
7 }
8 void my_print2 (char *string)
9 {
char *string2;
如果按下回车,gdb将再次执行一次list命令,给出下列输出;
11 int size, i;
12 size = strlen (string);
13 string2 = (char *) malloc (size + 1);
14 for (i = 0; i < size; i++)
15 string2[size - i] = string[i];
16 string2[size+1] = ‘\0';
17 printf ("The string printed backward is %s\n", string2);
18 }
19 int main ()
20 {
再按一次回车将列出 greeting 程序的剩余部分:
21 char my_string[] = "hello there";
22 my_print (my_string);
23 my_print2 (my_string);
24 return 0;
25 }
根据列出的源程序, 你能看到要设断点的地方在第15行, 在 gdb 命令行提示符下键入如下命令设置断点:
(gdb) break 15
gdb 将作出如下的响应:
Breakpoint 1 at 0x139: file greeting.c, line 15
(gdb)
现在再键入 run 命令, 将产生如下的输出:
Starting program: /home/student/greeting
The string is hello there
Breakpoint 1, my_print2 (string = 0xbfffdc4 "hello there") at greeting.c :15
15 string2[size-i]=string[i]
这时可通过设置一个观察点,观察 string2[size - i] 变量的值来看错误是怎样产生的, 做法是键入:
(gdb) watch string2[size - i]
gdb 将作出如下回应:
Watchpoint 2: string2[size - i]
现在可以用 next 命令来一步步的执行 for 循环了:
(gdb) next
经过第一次循环后, gdb 告诉我们 string2[size - i] 的值是 `h`. gdb 用如下的显示来告诉你这个信息:
Watchpoint 2, string2[size - i]
Old value = 0 `\000'
New value = 104 `h'
my_print2(string = 0xbfffdc4 "hello there") at greeting.c:14
14 for (i=0; i<size; i++)
这个值正是期望的. 后来的数次循环的结果都是正确的. 当 i=10 时, 表达式 string2[size - i] 的值等于 `e`, size - i 的值等于 1, 最后一个字符已经拷到新串里了.
如果你再把循环执行下去, 你会看到已经没有值分配给 string2[0] 了, 而它是新串的第一个字符, 因为 malloc 函数在分配内存时把它们初始化为空(null)字符. 所以 string2 的第一个字符是空字符. 这解释了为什么在打印 string2 时没有任何输出了.
现在找出了问题出在哪里, 修正这个错误是很容易的,你得把代码里写入 string2 的第一个字符的的偏移量改为 size - 1 而不是 size. 这是因为 string2 的大小为 12, 但起始偏移量是 0, 串内的字符从偏移量 0 到偏移量 10, 偏移量 11 为空字符保留。

修改后程序:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void my_print(char *string)
{
printf("The string is %s\n",string);
}
void my_print2(char *string)
{
char *string2;
int size,i;
size=strlen(string);
string2=(char*)malloc(size + 1);
for(i=0;i<size;i++)
string2[size-1-i]=string[i];
string2[size]='\0';
printf("The string printed backward is %s\n",string2);
}
int main()
{
char my_string[]="hello there";
my_print(my_string);
my_print2(my_string);
return 0;
}
为了使代码正常工作有很多种修改办法,请尝试其他方法。

操作:请总结调试过程。

3.
#include<stdio.h>
static char buff[256];
static char* string;
int main()
{
printf("Please input a string: ");
gets(string);
printf("\nYour string is: %s\n ",string);
return 0;
}
编译该程序:
$ gcc -o bugging -g bugging.c
机子作出如下响应:
/tmp/cccDcdcH.o: In function `main':
/home/student/bugging.c:7: warning: the `gets' function is dangerous and should not be used.
运行该程序:
$ ./bugging
机子作出如下响应:
Please input a string: asdf
段错误
为了查找该程序中出现的问题,我们利用gdb,并按如下的步骤进行:
(1)运行 gdb bugging 命令,装入bugging 可执行文件;
(2)执行装入的bugging 命令 run;
(3)使用where 命令查看程序出错的地方;
(4)利用list 命令查看调用gets 函数附近的代码;
(5)唯一能够导致 gets 函数出错的因素就是变量 string。

用print命令查看 string 的值;
(6)在gdb中,我们可以直接修改变量的值,只要将 string 取一个合法的指针值就可以了,为此,我们在第6行处设置断点break 6;
(7)程序重新运行到第6行处停止,这时,我们可以set variable 命令修改string的取值;
(8)然后继续运行,将看到正确的程序运行结果。

4. 编译和连接过程:
gcc –c f1.c f2.c // 生成 f1.o 和
gcc –o mp m.c f1.c f2.c //生成mp
构造自己的静态库
ranlib libmyl.a //为子函数建立内容表
使用自己的库
gcc –o mp1 m
gcc –o mp2 m
gcc –o mp3 m.c -L. –lmyl // 在当前目录以默认方法使用库myl
5.根据实验内容5的要求写出第一个Makefile如下:
gcc -o main main.o mytool1.o mytool2.o
gcc -c mytool2.c
clean:
rm -f *.o main
在shell提示符下输入make,执行显示:
gcc -c mytool1.c
执行结果如下:
[armlinux@lqm makefile-easy]$ ./main
This is mytool1 print : hello mytool1!
This is mytool2 print : hello mytool2!
这只是最为初级的Makefile,现在来对这个Makefile进行改进。

改进一:使用变量
一般在书写Makefile时,各部分变量引用的格式如下:
1. make变量(Makefile中定义的或者是make的环境变量)的引用使用“$(VAR)”格式,无论“VAR”是单字符变量名还是多字符变量名。

2. 出现在规则命令行中shell变量(一般为执行命令过程中的临时变量,它不属于Makefile变量,而是一个shell变量)引用使用shell的“$tmp”格式。

3. 对出现在命令行中的make变量同样使用“$(CMDVAR)” 格式来引用。

main:$(OBJ)
gcc -o main $(OBJ)
mytool1.o:mytool1.c mytool1.h
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
clean:
rm -f main $(OBJ)
改进二:使用自动推导
让make自动推导,只要make看到一个.o文件,它就会自动的把对应的.c文件加到依赖文件中,并且gcc -c .c也会被推导出来,所以Makefile就简化了。

CC = gcc
main: $(OBJ)
$(CC) -o main $(OBJ)
main.o: mytool1.h mytool2.h
.PHONY: clean
clean:
rm -f main $(OBJ)
改进三:自动变量($^ $
CC = gcc
main: $(OBJ)
$(CC) -o $@ $^
$(CC) -c $
$(CC) -c $
$(CC) -c $
.PHONY: clean
clean:
rm -f main $(OBJ)
这些是最为初级的知识,现在至少可以减少编译时的工作量。

细节方面的东西还需要在以后的学习中不断的总结,不断的深化理解。

可以参考GNU Make手册,那里讲解的比较全面。

五、实验报告
1.以书面形式记录下你操作的每一步过程,包括编译及调试过程。

2. 回答所提出的问题。

3.总结上机调试过程中所遇到的问题和解决方法及感想。

一、实验目的
1.理解系统调用和库函数的异同。

2.学会用系统调用和库函数进行编程。

3.掌握一些常用的系统调用和库函数的功能及应用。

二、实验内容
1.使用系统调用对进程进行控制。

父进程首先用fork()创建一个子进程,若成功,再创建另一个子进程,之后3个进程并发运行。

父进程调用wait(0)等待子进程结束,当两个子进程都结束时,父进程调用exit(0)终止自己。

观察父子进程之间的同步过程。

2.使用管道机制进行进程通信。

使用无名管道pipe(),进行父子进程之间的通信。

父进程先使用pipe()系统调用打开一个无名管道,之后创建一个子进程,为了正确通信,父进程关闭读通道,子进程关闭写通道。

父进程向管道写一句话,子进程从管道读出这句话。

完成一次通信后,父子进程分别关闭自己的读写通道,管道文件消失。

3.使用信号机制进行进程通信。

编写一个程序,它创建一个子进程。

父进程向子进程发送一个信号,然后等待子进程终止;子进程接收信号,输出自己的状态信息,最后终止自己。

三、实验注意事项
实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。

要求每个同学登录后系统后,要在自己的家目录下创建一个属于自己的子目录(以自己(拼音)名字或学号)。

以后所有工作都要在自己的目录内进行。

建议以后的实验都在同台计算机上做,这样可以保持连续性。

用户要按通常实验要认真书写实验报告。

四、实验步骤
由学生自己完成。

五、实验报告
1.写出调试通过的程序清单,并加上注释。

2.写出运行结果及分析。

3.写出上机调试过程中遇到的问题及解决的办法、感想或总结。

一、实验目的
1.理解系统调用和库函数的异同。

2.学会用系统调用和库函数进行编程。

3.掌握一些常用的系统调用和库函数的功能及应用。

二、实验内容
1.使用消息队列进行进程通信。

要求:分析程序,给程序加上注释。

调试运行程序,写出运行结果并分析之。

2.在父进程中创建一个消息队列,然后用fork()创建一个子进程,在子进程中将一条消息传送至消息队列,父进程接受队列的消息,并将消息送屏幕显示。

3.使用系统调用对文件进行操作。

编写一个程序,把一个文件的内容复制到另一个文件上,即实现简单的copy功能。

要求:只用open(),read(),write(),close()系统调用,程序要求带参数运行,第一个参数是源文件,第二个参数是目标文件。

三、实验注意事项
实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。

要求每个同学登录后系统后,要在自己的家目录下创建一个属于自己的子目录(以自己(拼音)名字或学号)。

以后所有工作都要在自己的目录内进行。

建议以后的实验都在同台计算机上做,这样可以保持连续性。

用户要按通常实验要认真书写实验报告。

四、实验步骤
由学生自己完成。

五、实验报告
1.写出调试通过的程序清单,并加上注释。

2.写出运行结果及分析。

3.写出上机调试过程中遇到的问题及解决的办法、感想或总结。

相关文档
最新文档