首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
»
ARM
» Linux下C编程基础之:实验内容
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
Linux下C编程基础之:实验内容
发短消息
加为好友
苹果也疯狂
当前离线
UID
852722
帖子
10369
精华
0
积分
5185
阅读权限
90
在线时间
277 小时
注册时间
2011-8-30
最后登录
2016-7-18
论坛元老
UID
852722
1
#
打印
字体大小:
t
T
苹果也疯狂
发表于 2015-7-30 11:18
|
只看该作者
Linux下C编程基础之:实验内容
实验目的
,
Linux
,
读者
3.7 实验内容3.7.1 vi使用练习
1.实验目的 通过指定指令的vi操作练习,使读者能够熟练使用vi中的常见操作,并且熟悉vi的3种模式,如果读者能够熟练掌握实验内容中所要求的内容,则表明对vi的操作已经很熟练了。
2.实验内容 (1)在“/root”目录下建一个名为“vi”的目录。
(2)进入“vi”目录。
(3)将文件“/etc/inittab”复制到“vi”目录下。
(4)使用vi打开“vi”目录下的inittab。
(5)设定行号,指出设定initdefault(类似于“id:5:initdefault”)的所在行号。
(6)将光标移到该行。
(7)复制该行内容。
(8)将光标移到最后一行行首。
(9)粘贴复制行的内容。
(10)撤消第9步的动作。
(11)将光标移动到最后一行的行尾。
(12)粘贴复制行的内容。
(13)光标移到“si::sysinit:/etc/rc.d/rc.sysinit”。
(14)删除该行。
(15)存盘但不退出。
(16)将光标移到首行。
(17)插入模式下输入“Hello,this is vi world!”。
(18)返回命令行模式。
(19)向下查找字符串“0:wait”。
(20)再向上查找字符串“halt”。
(21)强制退出vi,不存盘。
分别指出每个命令处于何种模式下?
3.实验步骤 (1)mkdir /root/vi
(2)cd /root/vi
(3)cp /etc/inittab ./
(4)vi ./inittab
(5):set nu(底行模式)
(6)17<enter>(命令行模式)
(7)yy
(8)G
(9)p
(10)u
(11)$
(12)p
(13)21G
(14)dd
(15):w(底行模式)
(16)1G
(17)i 并输入“Hello,this is vi world!”(插入模式)
(18)Esc
(19)/0:wait(命令行模式)
(20)?halt
(21):q!(底行模式)
4.实验结果 该实验的最终结果是对“/root/inittab”增加了一行复制的内容:“id:5:initdefault”。
3.7.2 用gdb调试程序的bug 1.实验目的 通过调试一个有问题的程序,使读者进一步熟练使用vi操作,而且熟练掌握gcc编译命令及gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。这是一个很小的程序,只有35行,希望读者认真调试。
2.实验内容 (1)使用vi编辑器,将以下代码输入到名为greet.c的文件中。此代码的原意为输出倒序main函数中定义的字符串,但结果显示没有输出。代码如下所示:
#include <stdio.h>
int display1(char *string);
int display2(char *string);
int main ()
{
char string[] = "Embedded Linux";
display1 (string);
display2 (string);
}
int display1 (char *string)
{
printf ("The original string is %s \n", string);
}
int display2 (char *string1)
{
char *string2;
int size,i;
size = strlen (string1);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
{
string2[size - i] = string1[i];
}
string2[size+1] = ' ';
printf("The string afterward is %s\n",string2);
}
(2)使用gcc编译这段代码,注意要加上“-g”选项以方便之后的调试。
(3)运行生成的可执行文件,观察运行结果。
(4)使用gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。
(5)纠正错误,更改源程序并得到正确的结果。
3.实验步骤 (1)在工作目录上新建文件greet.c,并用vi启动:vi greet.c。
(2)在vi中输入以上代码。
(3)在vi中保存并退出,使用命令“:wq”。
(4)用gcc编译:gcc -g greet.c -o greet。
(5)运行greet,使用命令“./greet”,输出为:
The original string is Embedded Linux
The string afterward is
可见,该程序没有能够倒序输出。
(6)启动gdb调试:gdb greet。
(7)查看源代码,使用命令“l”。
(8)在30行(for循环处)设置断点,使用命令“b 30”。
(9)在33行(printf函数处)设置断点,使用命令“b 33”。
(10)查看断点设置情况,使用命令“info b”。
(11)运行代码,使用命令“r”。
(12)单步运行代码,使用命令“n”。
(13)查看暂停点变量值,使用命令“p string2[size - i]”。
(14)继续单步运行代码数次,并检查string2[size-1]的值是否正确。
(15)继续程序的运行,使用命令“c”。
(16)程序在printf前停止运行,此时依次查看string2[0]、string2[1]…,发现string[0]没有被正确赋值,而后面的赋值都是正确的,这时,定位程序第31行,发现程序运行结果错误的原因在于“size-1”。由于i只能增到“size-1”,这样string2[0]就永远不能被赋值而保持NULL,故不能输出任何结果。
(17)退出gdb,使用命令“q”。
(18)重新编辑greet.c,把其中的“string2[size - i] = string1[i]”改为“string2[size – i - 1] = string1[i];”即可。
(19)使用gcc重新编译:gcc -g greet.c -o greet。
(20)查看运行结果:./greet
The original string is Embedded Linux
The string afterward is xuniL deddedbmE
这时,输出结果正确。
4.实验结果
将原来有错的程序经过gdb调试,找出问题所在,并修改源代码,输出正确的倒序显示字符串的结果。
3.7.3 编写包含多文件的makefile 1.实验目的 通过对包含多文件的makefile的编写,熟悉各种形式的makefile,并且进一步加深对makefile中用户自定义变量、自动变量及预定义变量的理解。
2.实验过程 (1)用vi在同一目录下编辑两个简单的hello程序,如下所示:
#hello.c
#include "hello.h"
int main()
{
printf("Hello everyone!\n");
}
#hello.h
#include <stdio.h>
(2)仍在同一目录下用vi编辑makefile,且不使用变量替换,用一个目标体实现(即直接将hello.c和hello.h编译成hello目标体)。然后用make验证所编写的makefile是否正确。
(3)将上述makefile使用变量替换实现。同样用make验证所编写的makefile是否正确。
(4)编辑另一个makefile,取名为makefile1,不使用变量替换,但用两个目标体实现(也就是首先将hello.c和hello.h编译为hello.o,再将hello.o编译为hello),再用make的“-f”选项验证这个makefile1的正确性。
(5)将上述makefile1使用变量替换实现。
3.实验步骤 (1)用vi打开上述两个代码文件“hello.c”和“hello.h”。
(2)在shell命令行中用gcc尝试编译,使用命令:“gcc hello.c –o hello”,并运行hello可执行文件查看结果。
(3)删除此次编译的可执行文件:rm hello。
(4)用vi编辑makefile,如下所示:
hello:hello.c hello.h
gcc hello.c -o hello
(5)退出保存,在shell中键入:make,查看结果。
(6)再次用vi打开makefile,用变量进行替换,如下所示:
OBJS :=hello.o
CC :=gcc
hello
(OBJS)
$(CC) $^ -o $@
(7)退出保存,在shell中键入make,查看结果。
(8)用vi编辑makefile1,如下所示:
hello:hello.o
gcc hello.o -o hello
hello.o:hello.c hello.h
gcc -c hello.c -o hello.o
(9)退出保存,在shell中键入:make -f makefile1,查看结果。
(10)再次用vi编辑makefile1,如下所示:
OBJS1 :=hello.o
OBJS2 :=hello.c hello.h
CC :=gcc
hello
(OBJS1)
$(CC) $^ -o $@
$(OBJS1)
(OBJS2)
$(CC) -c $< -o $@
在这里请注意区别“$^”和“$<”。
(11)退出保存,在shell中键入make -f makefile1,查看结果。
4.实验结果 各种不同形式的makefile都能正确地完成其功能。
3.7.4 使用autotools生成包含多文件的makefile 1.实验目的 通过使用autotools生成包含多文件的makefile,进一步掌握autotools的使用方法。同时,掌握Linux下安装软件的常用方法。
2.实验过程 (1)在原目录下新建文件夹auto。
(2)将上例的两个代码文件“hello.c”和“hello.h”复制到该目录下。
(3)使用autoscan生成configure.scan。
(4)编辑configure.scan,修改相关内容,并将其重命名为configure.in。
(5)使用aclocal生成aclocal.m4。
(6)使用autoconf生成configure。
(7)使用autoheader生成config.h.in。
(8)编辑makefile.am。
(9)使用automake生成makefile.in。
(10)使用configure生成makefile。
(11)使用make生成hello可执行文件,并在当前目录下运行hello查看结果。
(12)使用make install将hello安装到系统目录下,并运行,查看结果。
(13)使用make dist生成hello压缩包。
(14)解压hello压缩包。
(15)进入解压目录。
(16)在该目录下安装hello软件。
3.实验步骤 (1)mkdir ./auto。
(2)cp hello.* ./auto(假定原先在“hello.c”文件目录下)。
(3)命令:autoscan。
(4)使用vi编辑configure.scan为:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(hello, 1.0)
AM_INIT_AUTOMAKE(hello,1.0)
AC_CONFIG_SRCDIR([hello.h])
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT(makefile)
(5)保存退出,并重命名为configure.in。
(6)运行:aclocal。
(7)运行:autoconf,并用ls查看是否生成了configure可执行文件。
(8)运行:autoheader。
(9)用vi编辑makefile.am文件为:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.c hello.h
(10)运行:automake,然后运行automake –a。
(11)运行:./configure。
(12)运行:make。
(13)运行:./hello,查看结果是否正确。
(14)运行:make install。
(15)运行:hello,查看结果是否正确。
(16)运行:make dist。
(17)在当前目录下解压hello-1.0.tar.gz:tar –zxvf hello-1.0.tar.gz。
(18)进入解压目录:cd ./hello-1.0。
(19)下面开始Linux下常见的安装软件步骤:./configure。
(20)运行:make。
(21)运行:./hello(在正常安装时这一步可省略)。
(22)运行:make install。
(23)运行:hello,查看结果是否正确。
4.实验结果 能够正确使用autotools生成makefile,并且能够成功安装短小的hello软件。
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议