UnixProgramming第四章UNIX下的C语言开发环境UnixProgramming6.1程序设计环境学习程序设计从程序语言开始,但还应了解程序执行和程序与外界的交互问题。1.理想态的程序运行环境程序计算机磁盘显示器键盘打印机用户程序直接控制和使用各种设备,完成各种操作。UnixProgramming针对一个简单程序:main(){intc;while((c=getchar())!=EOF)putchar(c);}程序计算机显示器键盘Putchar()getchar()认为执行过程为:在单用户单任务环境中基本符合。UnixProgramming2.多任务环境下程序执行多任务中每一时刻都会有多个用户程序提出访问请求,因此会有:程序程序程序程序程序计算机磁盘打印机显示器键盘显示器键盘显示器键盘如此混乱的情况,程序将无法运行。UnixProgramming为使多道环境中的程序正确执行,需要OS管理。程序程序程序程序程序计算机磁盘打印机显示器键盘显示器键盘显示器键盘用户程序空间系统核心空间UNIX内核磁盘??绘图仪用户程序需要系统核心区程序的管理,达到各自任务的执行。UnixProgramming6.2基于系统支持的程序设计1.建立系统编程的思想•理解多道环境程序执行状况,转换用户程序是执行主体的认识。•了解OS可提供的服务及服务方式。•充分利用OS提供服务功能解决实际问题。•尽量使编写的程序最大限度的满足系统平台的支持能力。UnixoperatingsystemUnixoperatingsystem1.gcc与gdb•1.1UNIX和C语言–C是一种在UNIX操作系统的早期就被广泛使用的通用编程语言,它最早是由贝尔实验室的DennisRitchie为了UNIX的辅助开发而写的。–C是所有版本的UNIX上的系统语言。–几乎任何一种计算机上都有至少一种能用的C编译器;并且它的语法和函数库在不同的平台上都是统一的。–80年代末期美国国家标准协会(AmericanNationalStandardsInstitute)发布了一个被称为ANSIC的C语言标准,这保证了在不同平台上的C的一致性。7UnixoperatingsystemUnixoperatingsystem1.gcc与gdb•1.2GNUC编译器–GNUC编译器(gcc)是一个全功能的ANSIC兼容编译器,它是所有UNIX系统可用的C编译器。–gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。8UnixoperatingsystemUnixoperatingsystem3.1LINUX下C语言编程概述UnixoperatingsystemUnixoperatingsystem1.gcc与gdb•gcc编译过程:–预处理,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。–编译,就是把C/C++代码“翻译”成汇编代码。–汇编,将第二步输出的汇编代码翻译成符合一定格式的机器代码,生成以.o为后缀的目标文件。–链接,将上步生成的目标文件和系统库的目标文件和库文件链接起来,最终生成了可以在特定平台运行的可执行文件。10UnixoperatingsystemUnixoperatingsystem1.Gcc编译流程解析如本章开头提到的,Gcc的编译流程分为了4个步骤,分别为:·预处理(Pre-Processing);·编译(Compiling);·汇编(Assembling);·链接(Linking)。下面就具体来查看一下Gcc是如何完成4个步骤的。首先,有以下hello.c源代码:#includeintmain(){printf("Hello!Thisisourembeddedworld!\n");return0;}3.3Gcc编译器UnixoperatingsystemUnixoperatingsystem(1)预处理阶段在该阶段,编译器将上述代码中的stdio.h编译进来,并且用户可以使用Gcc的选项“-E”进行查看,该选项的作用是让Gcc在预处理结束后停止编译过程。[root@localhostGcc]#GccEhello.cohello.i––在此处,选项“-o”是指目标文件,由上表可知,“.i”文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容:typedefint(*__gconv_trans_fct)(struct__gconv_step*,struct__gconv_step_data*,void*,__constunsignedchar*,__constunsignedchar**,__constunsignedchar*,unsignedchar**,size_t*);…UnixoperatingsystemUnixoperatingsystem•#2"hello.c"2•intmain()•{•printf("Hello!Thisisourembeddedworld!\n");•return0;•}•由此可见,Gcc确实进行了预处理,它把“stdio.h”的内容插入到hello.i文件中。UnixoperatingsystemUnixoperatingsystem(2)编译阶段接下来进...