Linux应用编程基础知识学习.doc
《Linux应用编程基础知识学习.doc》由会员分享,可在线阅读,更多相关《Linux应用编程基础知识学习.doc(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-Linux下开发基础知识touch命令:可用于新建文件,如; touch /tmp/zhangxian.txt关于volatile的介绍 (类型修饰符,指令关键字)1.编译器优化介绍由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器;调整指令顺序充分利用CPU指
2、令流水线,常见的是重新排序读写指令。对常规内存进行优化的时候,这些优化是透明的,而且效率很好。由编译器优化或者硬件重新排序引起的问题的解决办法是在从硬件(或者其他处理器)的角度看必须以特定顺序执行的操作之间设置内存屏障(memory barrier),linux 提供了一个宏解决编译器的执行顺序问题。2. void Barrier(void)这个函数通知编译器插入一个内存屏障,但对硬件无效,编译后的代码会把当前CPU寄存器中的所有修改过的数值存入内存,需要这些数据的时候再重新从内存中读出。3. volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使
3、用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以消除一些代码。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化。gcc and g+分别是GNU的c & c+编译器。gcc/g+在执行编译的时候一般有下面4步:预处理,生成.i的文件预处理器cpp;将预处理后的文件转换成汇编语言,生成文件.s编译器egcs;由汇编变为目标代码(机器代码)生成.o的文件汇编器as;连接目标代码,生成可执行程序链接器ld;gcc编译流程分为4个步骤,分别为:预处理(Pre-Processing)编译(compiling)汇编(Assembling)链接(Linkin
4、g)g+ -o -c -g功能-o:指定生成可执行文件的名称。使用方法为:g+ -o afile file.cpp file.h . (可执行文件不可与待编译或链接文件同名,否则会生成相应可执行文件且覆盖原编译或链接文件),如果不使用-o选项,则会生成默认可执行文件a.out。-c:只编译不链接,只生成目标文件。-g:添加gdb调试选项。Linux下C语言应用编程1. 文件I/O编程2. 多进程编程的基本知识,核心是fork、exec、wait三大系统的调用;(可能需要补充操作系统进程并发运行的基本知识)3. 进程间通信的几种方法:信号,管道,共享内存,信号量,消息队列。(最重要的是信号和管道
5、)4. 多线程编程的基础知识;5. 网络编程:socket编程, TCP socket编程和UDP socket编程;6. 开发工具(包括:编辑器vim、编译器gcc、调试器gdb、工程管理工具autoconf、程序库的制作等);编译器vim的三种模式:1. 切换到编辑模式的四种方式,编辑模式可以输入任意内容a 光标向后移动一位i 当前位置o 另起新行s 删除光标所在字符r 替换光标所在字符2. 尾行模式,用于保存内容、查找替换、设置行号等等功能性操作:q /quit退出vi编辑器:w /write保存修改的内容:wq/保存并退出:q!/强制退出,当对文本内容作了修改而不想要保存时:w!/强制
6、保存,当没有文本的写权限时make和makefile文件:makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作(因为makefile就像一个Shell脚本一样,可以执行操作系统的命令)。makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译。makefile文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,要求定义源文件之间的依赖关系。make工具最主要也最基本的功能就是根据makefile文件中描述的源程序之间的相互关系来完成自动编译、
7、维护多源文件工程。Linux下的常用命令Linux 删除文件夹和文件的命令 -r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思删除文件夹实例:rm -rf /var/log/httpd/access将会删除/var/log/httpd/access目录以及其下所有文件、文件夹删除文件使用实例:rm -f /var/log/httpd/access.log将会强制删除/var/log/httpd/access.log这个文件文件I/O编程:系统调用、API与系统命令之间的关系Linux系统调用是指操作系统提供给用户程序的一组“特殊”接口,用户程序可以通过这组
8、“特殊”接口来获得操作系统内核提供的特殊服务。比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置系统时间等。为了更好的保护内核空间,将程序的运行空间分为内核空间和用户空间,它们运行在不同的级别上,在逻辑上是相互隔离的。在Linux中,用户程序不能直接访问内核提供的服务,必须通过系统调用来使用内核提供的服务。用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间函数。Linux中的用户编程接口(API)遵循了UNIX中最流行的应用编程界面标准-POSIX标准。(这些系统调用编程接口
9、主要是通过C库(libc)实现的。)这套标准定义了一系列API。在Linux中(Unix也如此)这些API主要是通过C库(libc)实现的,它除了定义的一些标准的C函数外,一个很重要的任务就是提供了一套封装例程(wrapper routine)将系统调用在用户空间包装后供用户编程使用。可用的文件I/O函数很多,包括:打开文件、读文件、写文件等。大多数Linux文件I/O只需要用到5个函数:open、read、write、lseek以及close。这5个函数是不带缓存的I/O函数,它们是POSIX标准的组成部分。在C语言中也有文件I/O函数,例如:fread、fwrite、fprintf、fsc
10、anf等。这些函数是带缓存的I/O函数,它们属于ANSI C的组成部分。Linux下系统调用、API、系统命令、内核函数的区别与联系1. 系统调用:应用程序和内核间的桥梁,是应用程序访问内核的入口点;但通常情况下,应用程序通过操作系统提供的API进行编程而不是使用系统调用直接编程; linux的全部系统调用加起来大约只有250个左右。这些系统调用按照功能逻辑大致可分为“进程控制”、“文件系统控制”、“系统控制”、“存管管理”、“网络管理”、“socket控制”、“用户管理”、“进程间通信”几类;可以使用man 2 syscalls 命令查看系统调用的说明,或者到 /include/asm-i3
11、86/unistd.h源文件种找到它们的原本。1.系统调用在内核里的主要用途:控制硬件;设置系统状态或读取内核数据;进程管理2.什么的服务应该存在于内核,或者说什么功能应该在内核而不是在用户空间;(如服务是否必须获得内核数据;安全的角度;效率的角度等)2. API:API常以C库(libc)的形式提供,C库提供了绝大部分API,每个系统调用在C库中都有对应的封装函数(通常封装函数与系统调用的名称相同)。系统调用与C库函数并不是一一对应的,有些C库函数可能使用多个系统调用来实现,也有可能多个C库函数使用同一个系统调用来实现,也有些C库函数不使用任何系统调用来实现。3. 系统命令:系统命令是使用L
12、inux提供的C库函数实现的可执行程序,可用strace查看命令执行时所使用的系统调用。4. 内核函数:系统调用是用户进入内核的接口,它本身不是内核函数,进入内核后每个系统调用会找到自己对应的内核函数(即系统调用服务例程)从用户的角度看,从底层往上看分别是:内核函数,系统调用,API,系统命令内核函数和系统调用的关系:内核函数和普通函数很像,只不过在内核中实现,因此要满足一些内核编程的要求。系统调用是一层用户进入内核的接口,它本身并非内核函数,进入内核后,不同的系统调用会找到对应到各自的内核函数即,系统调用服务例程。实际对请求服务的是内核函数而非调用接口(系统调用)。比如系统调用getpid实
13、际就是调用内核函数sys_getpid。Linux下不带缓存的I/O和带缓存的I/O:概念:不带缓存的I/O:UNIX的文件I/O read、write是不带缓存的,不带缓存是指每个read、write都调用内核的一个系统调用,它们是POSIX.1的组成部分。不是内核不提供缓存,而是对于用户层来说,没有提供缓存,而对内核来说还是有缓存的数据:数据流-内核缓存-磁盘带缓存的I/O:是指在用户层上再建立了一层缓存区(流缓存区),目的是为了减少read,write等系统调用的使用次数,降低系统开销。带缓存的I/O是指标准I/O库,它由ANSI C标准说明,标准I/O库代替用户处理很多细节,比如缓存分
14、配、以优化长度执行I/O等,提供缓存的目的是为了尽量减少read和write的调用次数; 数据:数据流-流缓存区-内核缓存-磁盘例如:当用fwrite函数向磁盘写数据时,先把数据写入流缓冲区中,当达到一定条件,比如流缓冲区满了,或刷新流缓冲,这时候才会把数据一次送往内核提供的块缓冲,再经块缓冲写入磁盘。(双重缓冲)用数据流来形容两者的差异:无缓存I/O操作的数据流:数据-内核缓存区-磁盘标准I/O操作的数据流:数据-流缓存区-内核缓存区-磁盘文件描述符对内核而言,所有打开文件都由文件描述符应用。文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当读、
15、写一个文件时,用open或create返回的文件描述符标识该文件,将其作为参数传送给read或write。在windows环境下,文件描述符大体上相当于文件句柄。在POSIX.1应用程序中,整数0、1、2应被代换成符号常数:STDIN_FILENO 代表标准输入(默认是键盘)、标准输出(默认是屏幕)、标准错误输出(默认是屏幕),这些常数都定义在头文件中。多进程编程进程是一个具有一定独立功能的程序对某个数据集合的一次运行活动。进程的实体结构:1. 进程控制块(PCB);2. 程序段;3. 数据段;PCB位于内核的内存里面的一块区域,是操作系统中最重要的记录型数据结构。PCB中记录了操作系统所需的
16、,用于描述进程进展情况及控制进程所需的全部信息。进程块主要包括下述4方面的信息:1. 进程描述信息2. 处理机状态信息3. 进程调度信息:进程状态、进程优先级(用于描述进程使用处理机的优先级别的一个整数,优先级别高的进程先获得处理机)、进程调度所需的其他信息(如进程已等待CPU的时间总和、进程已执行的时间总和等)、事件(指进程被阻塞的原因)。4. 进程控制信息:程序和数据的地址(指出该进程的程序和数据所在的内存或外存地址,以便再调度到该进程执行时,能从中找到其程序和数据);进程同步和通信机制(指实现进程同步和进程通信时所必须的机制,如消息队列指针、信号量等。这些数据应全部或部分存放在PCB中)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 应用 利用 运用 编程 基础知识 学习
限制150内