linux系统及编程基础课后答案(4)

2019-01-19 15:52

gdb greeting

-------------------------------------------------------------------------------- 注意: 记得在编译 greeting 程序时把调试选项打开. -------------------------------------------------------------------------------- 用gdb的run命令运行greeting。 (gdb) run

Starting program: /root/greeting The string is hello there The string printed backward is Program exited with code 040

这个输出和在 gdb 外面运行的结果一样。 问题是,为什么反序打印没有工作? 为了找出症结所在, 在 my_print2 函数的 for 语句后设一个断点, 具体的做法是在 gdb 提示符下键入 list 命令三次, 列出源代码: (gdb) list (gdb) list (gdb) list

第一次键入 list 命令的输出如下:

如果按下回车, gdb 将再执行一次 list 命令, 给出下列输出:

再按一次回车将列出 greeting 程序的剩余部分:

根据列出的源程序, 你能看到要设断点的地方在第21行, 在 gdb 命令行提示符下键入如下命令设置断点: (gdb) break 21

gdb 将作出如下的响应:

现在再键入 run 命令, 将产生如下的输出:

你能通过设置一个观察 string2[size - i] 变量的值的观察点来看出错误是怎样产生的, 做法是:

现在可以用 next 命令来一步步的执行 for 循环了: (gdb) next

经过第一次循环后, gdb 告诉我们 string2[size - i] 的值是 `h`. gdb 用如下的显示来告诉你这个信息:

这个值正是期望的,后来的数次循环的结果都是正确的。当 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 为空字符保留。

为了使代码正常工作有很多种修改办法。 一种是另设一个比串的实际大小小 1 的变量。 这是这种解决办法的代码:

#include #include #include main() {

char my_string[]=\ my_print(my_string); my_print2(my_string); }

my_print(char *string) {

printf(\}

my_print2(char *string) {

char *string2;

int size,size2,i; size=strlen(string); size2=size-1;

string2=(char*)malloc(size + 1); for (i=0;i

string2[size2-i]=string[i]; string2[size+1]='\\0';

printf(\}

4.简述GNU make的工作过程。

答:make的主要功能是执行生成新版本的目标程序所需的各个步骤,即自动检测一个大型程序的哪一部分需要重新编译,然后发出命令重新编译。GNC的make的工作过程如下: (1)依次读入每个makefile文件; (2)初始化文件中的变量;

(3)推导隐式规则,并分析所有规则; (4)为所有目标文件创建依赖关系链;

(5)根据依赖关系和时间数据,确定哪些文件需要重新生成; (6)执行相应生成命令。

5.makefile文件的作用是什么?其书写规则是怎样的?

答:要用make维护一个程序,必须创建一个makefile文件,makefile文件告诉make以何种方式编译源代码和链接程序。makefile有自己的书写格式、关键字、函数,像C语言有自己的格式、关键字和函数一样,makefile描述规则组成如下所示。 目标 : 依赖文件 [TAB]命令

6.设某个程序由四个C语言源文件组成,分别是a.c、b.c、c.c、d.c,其中b.c和d.c都使用了defs.h中的声明,最后生成的可执行文件名为pgm。试为该程序编写相应的makefile文件。 答:

pgm : a.o b.o c.o d.o

gcc -o pgm a.o b.o c.o d.o a.o : a.c

gcc -c a.c b.o : b.c defs.h

gcc -c b.c c.o :c.c

gcc -c c.c d.o : d.c defs.h

gcc -c d.c

7.编写程序,用系统调用fork()创建两子进程。父进程显示50次字符串“father”,子进程1显示50次字符串“son”,子进程2显示50次字符串“daughter”。观察并记录屏幕上显示结果,分析原因。(提示:可在各进程中加入sleep,观察结果分析原因。) 答:

#include

main() {

int p1,p2,i,j,k;

while ((p1=fork())==-1); if(p1==0) {

for(i=0;i<50;i++) { printf(\ } else {

while ((p2=fork())==-1); if (p2==0) {

for (j=0;j<50;j++)

{ printf(\ } else {

for(k=0;k<50;k++){printf(\

} } }

编译运行结果如下:


linux系统及编程基础课后答案(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:生产与运营管理A卷

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: