case ―$color‖ in [Bb]l??)
echo I feel $color
echo The sky is $color;; [Gg]ree*)
echo $color is for trees echo $color is for seasick;; red | orange)
echo $color is very warm!;; *)
echo no such color as $color;; esac
echo ―out of case‖
验证该脚本执行结果。
9.设计一个shell脚本:求命令行上所有整数和。
答: sum=0
while [ $# != 0 ] do
let sum=sum+$1 shift done
echo ―the sum of arguments is $sum‖
10.设计一个shell脚本:判断当前工作目录下所有的文件类型,如果是目录显示目录名,如果是文件查看文件内容,如果都不是,显示提示信息。
for file in ./* do
if [ -d ―$file‖ ] then
ls ―$file‖
elif [ -f ―file‖ ] then
more ―$file‖ else
echo ―$fiel is not a directory or a regular file.s‖ done
第7章 Linux下编程
1.gcc编译过程一般分为哪几个阶段?各阶段的主要工作是什么?
gcc编译过程一般分为预处理、编译、汇编、链接四个阶段,各阶段的主要工作如下:
(1)预处理阶段:在该阶段,编译器将上述代码中的stdio.h编译进来。GCC首先调用cpp进行预处理,根据以字符#开头的命令修改原始的C程序。如hello.c中#include
$gcc -E hello.c -o hello.i
(2)编译阶段:GCC调用cc1检查代码的规范性,是否有语法错误等,以确定代码实际要做的工作,在检查无误后,把代码翻译成汇编语言,生成汇编处理后的汇编代码hello.s。这个阶段对应的GCC命令如下所示。
$gcc -S hello.i -o hello.s
汇编语言是非常有用的,它为不同高级语言不同编译器提供了通用的语言。如:C编译器和Fortran编译器产生的输出文件用的都是一样的汇编语言。
(3)汇编阶段:GCC调用as把编译阶段生成的hello.s文件转成编译后的目标文件hello.o,但hello.c中所引用的其他文件中函数(如printf)的内存位置尚未定义。这个阶段对应的GCC命令如下所示:
$gcc -c hello.s -o hello.o
(4)链接阶段:GCC调用ld将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。如GCC找到hello.c所调用的函数printf函数库所在位置/user/lib,把函数的实现链接进来,生成最终的可执行文件hello。可以利用下面的示例命令完成。
$gcc hello.o -o hello
如果我们不想生成中间的各类型文件,可用如下命令由源文件直接编译链接成可执行文件。
$gcc hello.c -o hello
2.简述GNU gdb的功能。
gdb是Linux系统中一个功能强大的GNU调试程序,它可以调试C和C++程序,使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。gdb提供如下功能:
(1)运行程序,设置所有的能影响程序运行的参数和环境; (2)控制程序在指定的条件下停止运行; (3)当程序停止时,可以检查程序的状态; (4)修改程序的错误,并重新运行程序; (5)动态监视程序中变量的值;
(6)可以单步逐行执行代码,观察程序的运行状态; (7)分析崩溃程序产生的core文件。
3.用gdb调试下面的程序。 #include
char my_string[] = \ my_print (my_string); my_print2 (my_string); }
my_print (char *string) {
printf (\}
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 (\}
gcc -g -o greeting greeting.c
这个程序执行时显示结果: The string is hello there
The string printed backward is
输出的第一行是正确的, 但第二行打印出的东西并不是我们所期望的。我们所设想的输出应该是: The string printed backward is ereht olleh。
由于某些原因, my_print2 函数没有正常工作。用gdb 看调试程序, 先键入如下命令: 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
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 int p1,p2,i,j,k; while ((p1=fork())==-1); if(p1==0) { 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Linux系统及编程基础习题答案(3)在线全文阅读。
相关推荐: