资源描述
第五章:Linux下的C语言编程姓名:学号:520913080429专业:信息安全09-04实验内容:1.c语言编程2.vi编辑器3.gcc编辑器4.gdb编辑器5. gdb中运行Linux的shell程序6.make7.env系统变量1. c语言编程一般模式编辑模式rootlocalhost home# cd /home/rootlocalhost home# vi hl.cYou have new mail in /var/spool/mail/rootrootlocalhost home# lshl.c student vmware-tools-distribrootlocalhost home#在调用C语言编译器的时候,可以通过给出“ -I”编译命令标志来引用保存在下级子目录或者非标准位置的头文件,类似命令如下:davidlocalhost linux$ gcc -I /usr/openwin/include hello.c先进入/usr/include子目录,然后在grep命令里给出该名字的几个字母,如下所示:davidlocalhost linux$ grep KEYSPAN *.hpci_ids.h:#define PCI_SUBVENDOR_ID_KEYSPAN 0x11a9pci_ids.h:#define PCI_SUBDEVICE_ID_KEYSPAN_SX2 0x53342. vi编辑器编辑模式Esc:命令模式一般模式q!wq保存退出不保存退出rootlocalhost # cd /homerootlocalhost home# vi cl.crootlocalhost home# 3.gcc编辑器gcc的版本可以使用如下gcc v命令查看:davidDAVID david$ gcc -vReading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specsConfigured with: ./configure -prefix=/usr -mandir=/usr/share/man -infodir=/sr/share/info -enable-shared -enable-threads=posix -disable-checking -with-ystem-zlib -enable-_cxa_atexit -host=i386-redhat-linuxThread model: posixgcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)以上显示的就是Redhat linux 9.0里自带的gcc的版本3.2.2。下面将以一个实例来说明如何使用gcc编译器。例3-1能够帮助大家迅速理解gcc的工作原理,并将其立即运用到实际的项目开发中去。实例3-1 hello.c#include int main (int argc,char *argv) printf(Hello Linuxn); rootlocalhost home# lscl.c student test.c vmware-tools-distribrootlocalhost home# gcc test.c/usr/lib/gcc/i386-redhat-linux/4.1.1/./././crt1.o: In function _start:(.text+0x18): undefined reference to maincollect2: ld 返回 1rootlocalhost home# . /a.outbash: /a.out: 没有那个文件或目录rootlocalhost home# gcc test.c -o test.i/usr/lib/gcc/i386-redhat-linux/4.1.1/./././crt1.o: In function _start:(.text+0x18): undefined reference to maincollect2: ld 返回 1rootlocalhost home#Gcc的警告提示功能 gcc包含完整的出错检查和警告提示功能,它们可以帮助Linux程序员尽快找到错误代码,从而写出更加专业和优美的代码。先来读读例3-2所示的程序,这段代码写得很糟糕,仔细检查一下不难挑出如下毛病:main函数的返回值被声明为void,但实际上应该是int; 使用了GNU语法扩展,即使用long long来声明64位整数,仍不符合ANSI/ISO C语言标准; main函数在终止前没有调用return语句。 实例3-2 bad.c#include void main(void) long long int var = 1; printf(It is not standard C code!n);4.gdb编辑器test.c#include int func(int n) int sum=0,i; for(i=0; in; i+) sum+=i; return sum; main() int i; long result = 0; for(i=1; i=100; i+) result += i; printf(result1-100 = %d n, result ); printf(result1-250 = %d n, func(250) ); 5. shell程序 在gdb环境中,可以执行Linux的shell命令:shell 调用Linux的shell来执行,环境变量SHELL中定义的Linux的shell将会用来执行。如果SHELL没有定义,那就使用Linux的标准shell:/bin/sh(在Windows中使用Command.com或cmd.exe)。还有一个gdb命令是make:make 可以在gdb中执行make命令来重新build自己的程序。这个命令等价于shell make 。 在gdb中运行程序当以gdb 方式启动gdb后,gdb会在PATH路径和当前目录中搜索的源文件。如要确认gdb是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。在gdb中,运行程序使用r或是run命令。程序的运行,有可能需要设置下面四方面的事。程序运行参数set args 可指定运行时参数。如:set args 10 20 30 40 50show args 命令可以查看设置好的运行参数。运行环境path 可设定程序的运行路径。show paths 查看程序的运行路径。set environment varname =value 设置环境变量。如:set env USER=hchenshow environment varname 查看环境变量。工作目录cd 相当于shell的cd命令。pwd 显示当前的所在目录。程序的输入输出info terminal 显示程序用到的终端的模式。使用重定向控制程序输出。如:run outfiletty命令可以指写输入输出的终端设备。如:tty /dev/ttybshell命令解析器定义别名将lm定义为ls -al6.makeMake冒烟命令make是一个解释makefile文件中的指令的命令工具Make file 写法只要makefile文件写得足够好,所有的这一切,只用一个make命令就可以完成,make命令会自动智能地根据当前文件的修改情况来确定哪些文件需要重新编译,从而自动编译所需要的文件并连接目标程序。在讲述这个makefile文件之前,还是先来粗略地看一看下面的代码 Main.o :main.c add.h Gcc c main.c o main.o在makefile文件中使用变量在上面的例子中,先通过实例5-2来看看edit的规则。实例5-2edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o gcc -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o可以看到,.o文件的字符串被重复了两次。如果这个工程需要加入一个新的.o文件,需要在两个位置插入(实际是个位置,还有一个位置在clean中)。当然,这个makefile文件并不复杂,所以在两个位置加就可以了。但如果makefile文件变得复杂,就要在第3个位置插入,该位置容易被忘掉,从而会导致编译失败。所以,为了makefile文件的易维护,在makefile文件中可以使用变量。makefile文件的变量也就是一个字符串,可以理解成C语言中的宏。比如,声明一个变量objects,在makefile文件一开始可以这样定义定义变量rootlocalhost home# name=zhangshanrootlocalhost home# name1=zhang sanrootlocalhost home# name2=zhang sanrootlocalhost home# echo $namezhangshanrootlocalhost home# echo $name1zhang sanrootlocalhost home# echo $name2zhang sanrootlocalhost home#7.env系统变量管理模式1显示passwd中的第一列 | 命令rootlocalhost home# cat /etc/passwd |cut -d : -f1rootbindaemonadmlpsyncshutdownhaltmailnewsuucpoperatorgamesgopherftpnobodyrpmdbusavahimailnullsmmspnscdvcsahaldaemonrpcrpcusernfsnobodysshdpcapntpgdmapachedistcachepostgresmysqldovecotwebalizersquidxfsnamedsabayonpostfixamandacyrusmailmanradiusdeximprivoxyquaggaradvdldaptomcatpegasusstudentrootlocalhost home#
展开阅读全文