好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

下的C语言编程基础课件.ppt

61页
  • 卖家[上传人]:我***
  • 文档编号:141112443
  • 上传时间:2020-08-04
  • 文档格式:PPT
  • 文档大小:369.50KB
  • / 61 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1,LINUX下C语言编程基础,RE.ER嵌入式学院 2008年3月,2,内容大纲,LINUX下编程标准及基本概念 常用的编程工具 进程及线程的概念 系统调用的基本概念 内存布局及库管理 C程序运行的基本环境 如何调试程序 有用的工具 如何获取帮助 LINUX下编程内容及相互之间的关系,3,LINUX可爱的小企鹅,,4,,,5,相关名词,GNU = GNUs Not Unix GPL: General Public License(公共许可协议) LGPL: Library General Public License (GNU程序库公共许可协议),6,GNU,GNU =“GNUs Not Unix”) Richard Stallman于1984年发起GNU计划, GNU计划是要实现一个新的操作系统,它类似于Unix的操作系统,但是完全开放当时Unix已不是免费软件) 刚开始时只包含几个基本的软件:C编译器(gcc)、编译软件make、文本编辑软件Emacs、C语言库(glibc)以及其他一些核心应用程序(ls,cp等) 到了1991年,GNU计划依然缺乏一个操作系统”内核”.直到LINUX出现 各种使用 Linux 作为内核的 GNU 操作系统正被广泛地使用着;虽然这些系统通常被称作为“Linux”,但是它们应该更精确地被称为 GNU/Linux 系统 。

      7,GPL,GPL 许可证用来保护自由软件在被修改后,依然是自由软件 GPL的特点: GPL软件的提供者可以免费或者付费的向用户提供该软件 在用户获取该软件时,必须可以同时得到源代码 得到该软件后,用户可以: 执行该软件 修改源代码,然后重新发布 利用部分未修改的源代码,编写自己的程序,然后发布 动态或者静态链接该GPL软件的二进制形式,编写和发布自己的程序 被发布的程序(上述2,3,4),必须也是GPL软件8,LGPL,LGPL 许可证用来保护自由软件在被修改后,依然是自由软件 LGPL的特点 LGPL软件的提供者可以免费或者付费的向用户提供该软件 在用户获取该软件时,必须可以同时得到源代码 得到该软件后,用户可以: 执行该软件 修改源代码,然后重新发布 利用部分未修改的源代码,编写自己的程序,然后发布 动态或者静态连接该GPL软件的二进制形式,编写和发布自己的程序 只有在修改源代码的情况下(上述2),被发布的新程序才必须是LGPL软件,9,LINUX编程标准 -- ANSI,历史:ANSI(美国国家标准局)于1989年制定的C语言标准,后来被ISO(国际化标准组织)接受为标准,因此也成为ISO C 目标:为各种操作系统上的C程序提供可移植性保证,而不仅仅限于类UNIX系统。

      内容:该标准不仅定义了C语言的语法和语义,而且还定义了一个标准库,这个库可以根据头文件划分10,LINUX编程标准 -- POSIX,历史: POSIX是Portable Operating System Interface for UNIX的首字母缩写词,最初由IEEE开发的标准族,部分已经被ISO接受为国际标准 目标:保证程序的可移植性只要保证他们的程序设计的符合POSIX标准,开发人员就能确信他们的程序可以和支持POSIX的操作系统互联 内容:这个标准定义了应用程序和操作系统之间的一个接口11,库与系统调用,12,系统调用,系统调用: 操作系统提供给外部程序的接口 在linux系统中,系统调用函数定义在glibc中 系统调用说明 系统调用函数通常在成功时返回0值,不成功时返回非零值如果要检查失败的原因,则要判断全局变量errno的值,errno中包含错误代码 许多系统调用的返回数据通常通过引用参数传递这时,需要在函数参数中传递缓冲区地址,而返回的数据就保存在该缓冲区中 不能认为系统调用函数就要比其它函数的执行效率高要注意,系统调用是一个非常耗时的过程,13,内容大纲,LINUX下编程标准及基本概念 常用的编程工具 进程及线程的概念 系统调用的基本概念 内存布局及库管理 C程序运行的基本环境 如何调试程序 有用的工具 如何获取帮助 LINUX下编程内容及相互之间的关系,14,LINUX下的常用编程工具,编辑工具(vi,emacs) 编译工具(gcc/g++) 二进制文件工具() 项目组织工具(make) 版本控制工具(cvs,bugzilla),15,二进制文件工具,nm: 列出目标文件序列”object-file.”中的符号,这样可以帮助程序员定位和分析执行程序和目标文件中的符号信息和它的属性。

      objdump: 显示一个或多个目标文件的信息,由其选项来控制显示哪些特定的信息通过使用这个工具可以方便的查看执行文件或库文件的信息,如我们可以通过objdump软件反汇编执行程序,看到执行程序的汇编格式 objcopy: 将一种格式的文件内容进行转换,并输出为另一种格式的目标文件16,,LINUX下编程标准及基本概念 常用的编程工具 进程的概念 系统调用的基本概念 内存布局及库管理 C程序运行的基本环境 LINUX文件系统及I/O 如何调试程序 有用的工具 如何获取帮助 LINUX下编程内容及相互之间的关系,17,程序与进程,程序:是一个包含可以执行代码的文件,是一个静态的文件 进程:是一个开始执行但是还没有结束的程序的实例.就是可执行文件的具体实现.,18,进程的特征,动态性 并发性 独立性 异步性 占用资源(结构特性),19,进程状态,新建状态:进程正在被创建 就绪状态:系统正在等待CPU来执行命令 执行状态:进程正在运行 阻塞状态:进程正在等待某一个事件发生 终止状态:进程已经结束了系统正在回收资源,20,进程状态的转换,21,常用的进程调度方法,时间片 优先级 先来先服务 短作业优先,22,LINUX中进程的表示方法,为了管理进程,操作系统必须对每个进程所做的事情进行清楚地描述,为此,操作系统使用数据结构来代表处理不同的实体,这个数据结构就是通常所说的进程描述符或进程控制块, 在linux系统中,这就是task_struct结构,在includelinuxsched.h文件中定义。

      每个进程都会被分配一个task_struct结构,它包含了这个进程的所有信息,在任何时候操作系统都能跟踪这个结构的信息,这个结构是linux内核中最重要的数据结构,23,task_struct,相关说明,见includelinuxsched.h文件. 系统还有一个当前进程指针CURRENT,用来指向正在运行的进程24,task_struct结构分析,进程的task_struct结构分为以下几个字段: 状态: 进程在运行时总是在不停地改变它的状态在Linux系统中,有以下几个状态: 调度信息 调度算法需要此信息来决定系统中的那一个进程需要执行 标识符 系统中的每一个进程都有一个进程标识符进程标识符并不 指向进程向量的索引每个进程同时还包括用户标识符和工作组标识符25,task_struct结构分析,内部进程通讯 Linux系统支持信号、管道、信号量等内部进程通讯机制 链接 在Linux系统中,每个进程都和其他的进程有所联系除了初始化进程,其他的进程都有父进程一个新的进程一般都是由其他的进程复制而来的task_struct结构中包括指向父进程,兄弟进程和子进程的指针 时间和计时器 内核需要记录进程的创建时间和进程运行所占用的CPU的时间。

      进程可以使用系统调用设置计时器,并当计时器失效时给进程一个信号计时器可以是一次性的或周期性的26,task_struct结构分析,文件系统 进程在运行时可以打开和关闭文件task_struct结构中包括指向每个打开文件的文件描述符的指针,并且包括两个指向VFS索引节点的指针VFS的索引节点用来在文件系统内唯一地描述一个文件或目录,并且提供文件系统操作的统一的接口第一个索引节点是进程的根目录,第二个节点是当前的工作目录两个VFS索引节点都有一个计数字段用来表明指向节点的进程数 虚拟内存 大多数的进程都需要虚拟内存Linux系统必须了解如何将虚拟内存映射到系统的物理内存 处理器的内容 一个进程可以说是系统当前状态的总和每当一个进程正在运行时,它都要使用处理器的寄存器及堆栈等资源当一个进程挂起时,所有有关处理器的内容都要保存到进程的task_struct中当进程恢复运行时,所有保存的内容再装入到处理器中27,LINUX中进程的控制,启动运行程序 前台执行:需要终端 后台执行:不需要终端 进程结束,28,程序的执行环境,每个程序都接收到一张环境表与参数表一样,环境表也是一个字符指针数组,其中每个指针包含一个以null结束的字符串的地址。

      全局变量environ则包含了该指针数组的地址 extern char **environ; 我们称environ为环境指针,指针数组为环境表,其中各指针指向的字符串为环境字符串29,程序的执行环境,----------------------------------------------------------------------------- #include int putenv(const char *str) ; int setenv(const char *name, const char *value, int rewrite); 两个函数返回:若成功则为0,若出错则为非0 void unsetenv(const char * name); ----------------------------------------------------------------------------- 实例分析:env.c,30,重要的环境变量,PATH 可执行程序的搜索路径 LD_LIBRARY_PATH: 将其它目录加入到库搜索路径它的内容应该是由冒号分隔的目录列表 设置方法: 1、rcS, profile文件 2、export 命令,31,C程序的执行与结束,C程序总是从main函数开始执行。

      main函数的原型是:int main(int argc, char *argv); 有五种方式使进程终止: 正常终止: 从main返回 调用exit 调用_exit 异常终止: 调用abort 由一个信号终止,32,exit和_exit,exit和_exit函数用于正常终止一个程序 exit和_exit函数区别: _exit立即进入内核 exit则先执行一些清除处理(包括调用执行各终止处理程序,关闭所有标准I/O流等),然后进入内核 函数原型: #include void exit(int status); #include void _exit (int status);,33,,34,获取错误信息,在调用库函数或者系统调用函数后,绝大多数情况下:执行成功返回0;如果执行失败则返回-1,并对外部局部变量error赋值,以指示具体的错误情况 所有的错误代码都在errno.h中定义为打印出具体的error值所对应的错误提示信息,一般使用perror函数35,perror()函数的用法,函数原型: #include void perror(const char *s); 函数说明 perror()用来将上一个函数发生错误的原因输出到标准错误(stderr)。

      参数 s 所指的字符串会先打印出,后面再加上错误原因字符串此错误原因依照全局变量 errno 的值来决定要输出的字符串使用 #include int main(void) FILE *fp ; fp = fopen( /root/noexitfile, r+ ); if ( NULL == fp ) perror(/root/noexitfile); return 0; ,36,,内存及库管理,37,C语言的存储空间布局。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.