第五十七讲——linux shell下的函数 while循环: while :;do 循环体 done 死循环,可以用break在满足条件时跳出循环。 while read LINE;do 文档处理,$LINE done </PATH/to/somewhere 重定向文件到while循环。 一行一行的进行读取文件,并能对每一行进行相应处理。 bash -n *.sh 检查脚本中的语法错误 bash脚本编程之函数。 function:功能函数,与数学函数中的函数不是同一个概念,函数是结构化编程的重要思想,其主要目的是为了代码重用。 库:.so文件,共享库能够被多个进程所同时使用,这也是代码重用的思想。 函数不能作为程序的入口,必须被进程调用,这也是代码重用的思想。 函数就是一段封装的独立功能的代码,并为这段代码取了个名字。 而我们在需要这个功能的时候,用名字来调用这个函数,这整个我们称为函数和函数的使用机制。 函数需要使用function作为关键字,function_name(函数名)只能以字母、数字、下划线组成,并且不能以数字开头,因为有些系统调用是以数字命名的。 函数体需要使用一对花括号{}括起来。 function function_name{ command } 我们也可以使用一个关键字跟上一对小括号(无空格) function_name() { command } 函数不能够直接执行,只能被程序调用时才会执行。 在调用函数时,只需要使用函数名。 一个函数的执行结果和执行状态结果是如何建立联系的。 程序的执行结果使用反引号引用。 程序的执行状态结果:echo $?(最后一条语句的执行状态) 根据需要定义函数状态的返回值,使用关键字return定义状态返回值,使用exit #也可以定义程序执行状态的返回值,但是会退出脚本。 return # (0-255) 定义函数的返回值,表示这个函数是否执行正常,一个函数的执行过程中遇到了return,一定就结束了,函数可以返回一个执行的状态结果,我们在主程序中可以对这个状态返回值进行一个判定。 举一个例子: #!/bin/bash # #lm ADDUSER() { if ! id -U $USERNAME 2>&1 /dev/null; then useradd $USERNAME echo $USERNAME |passwd --stdin $USERNAME &>/dev/null return 0 else return 1 fi } read –p “please input user username:” username ADDUSER $username #向函数传递参数 if [ $? == 0 ];then echo “$username add finished” else echo “$username has exisis” fi 我们把所有功能做入函数中有一个缺陷,无法灵活使用,调用的可能性是非常少的。 给自己讲linux 2017-01-26 评论 1647 次浏览
第五十六讲——源码包安装 源码包安装分为三个步骤,和程咬金的三板斧差不多。 大致的流程为:源程序-->编译-->二进制格式 在进行编译的时候,有些特性是可以选定的,如果编译时未选定此项特性,安装成功后将无法使用。 我们需要知道的是,rpm包的版本会落后源码包,甚至会落后很多。我们可以自己定制,即手动编译安装。 编译环境(开发环境) 开发库,开发工具 c环境,C++,perl,java,python c、c++的编译器 c编译器:gcc GNU C computer c++编译器:g++ 三板斧: make: c或者c++的项目管理工具 这个工具可以将多个不同项目的文件做成一个项目,并将这个项目的编译过程通过配置文件来提供,这个配置配置文件叫做makefile。 makefile:定义了make(make会调用gcc、g++)按某种次序去编译源程序文件中的源程序。 我们使用make编译一个c项目的时候,这个c项目必须要有makefile文件,但是makefile文件并不属于程序自身的组成部分。 没有makefile文件,用户就无法进行编译的工作,那么问题来了,makefile文件时怎么生成的。 为了使程序员开发的程序能让其他不理解程序的人顺序编译,有人开发了一个叫做automake的工具,对源程序做一个简单的介绍。 automake--->makefile.in makefile.in只是一个半成品,并不是一个完整的makefile文件,尚不能进行编译工作。 makefile.in还可以进行完善,它还可以接收另一个工具(autoconf)所生成的脚本配置。 autoconf是为我们的项目生成脚本的。 autoconf---->configure(脚本) configure是配置我们当前这个程序如何编译,例如,我们开发完一个程序后有几十个特性,或者几十个可供用户选择的特性,更重要的是我们将要把程序安装到什么位置(编译完成后),makefile.in文件时指定不了的,makefile.in最多只能判定如何去编译,至于程序的安装位置我们需要安装额外的接口来指定。因此,makefile.in是无法跟用户交互的,我们需要借助configure脚本来实现。 configure脚本就是提供用户决定(选择/禁用)程序的那些特性,我们通过configure脚本指定后,结合makefile.in最终生成makefile文件。 将可选特性通过脚本输出,用户选择完程序特性之后通过makefile.in保存在makefile文件中,而后我们使用make命令结合makefile中指定的方式对源程序进行编译,编译完成之后就可以将编译好的二进制格式文件放到对应的目录。 make install 安装 在configure的时候我们就已经告诉了程序安装在什么位置,因此make install就是将编译好的程序配置文件、库文件以及帮助文件放到指定目录。 源码编译安装的三个步骤: 我们需要先对源码包进行解压缩,并且进入到解压后的目录。 在当前目录下执行./configure命令 ./configure --prefix=/path/to/somewhere(指定程序的帮助文档安装路径) --conf-path=/path/to/somewhere配置文件的安装目录 如果我们不指定配置文件的位置,配置文件会安装到默认的路径下,在安装路径的conf或者etc目录下。 我们需要知道的是,不同程序的configure脚本所支持的特性是不尽相同的。 我们可以使用./configure --help获取当前configure脚本的帮助文档(使用格式)。 如果configure文件执行结束,它会结合makefile.in生成makefile文件,生成makefile文件后我们就可以执行make命令了。 #make此步骤为执行make命令 #make install 执行安装命令 我们在指定安装位置时,/usr/local 安装到/usr/local/bin,/usr/local/sbin,我们可以单独为其指定安装目录,卸载的时候很方便,直接删除目录即可。 我们需要知道的是手动编译是不能够快捷卸载的。 configure的功能 一是让用户选定编译的特性 二是检查编译的环境 我们在编译的时候会遇到依赖关系,而这些依赖通常都是程序的devel包(程序的子包) 以安装Apache服务为例,安装在/usr/local/apache中,其/sur/bin/apache/sbin下的脚本是不能够在命令行直接执行的,因为没有加入到环境变量中,我们可以手动编辑/etc/profile文件在最后一行手动加入一行: PATH=$PATH:/usr/local/apache/sbin(不会立即生效),我们可以手动重新读取配置文件生效。 source /etc/profile 重读配置文件,但是不建议重新读取,重新登录即可。 在执行configure的时候,我们需要注意的是检查环境的结果,一定要注意有没有报错信息,其缺少依赖,一般都是依赖*.devel*.rpm的包,即依赖关系,在安装这个子包后解决,源码安装的时候缺什么就使用yum安装什么,一并解决依赖关系。 源码程序的安装到这个时候并没有结束,虽然我们解决了依赖关系和环境变量,最重要的库文件并没有加入到默认的搜索路径。 默认情况下,系统默认搜索库文件的路径为/lib,/usr/lib,我们增加额外的路径时,需要在/etc/ld.so.conf.d/中创建一个以.conf结尾的文件,而后把要添加的库文件路径写入文件中,重启后生效。 # ld config -v 通知系统重新搜寻库文件 -v 重新搜寻库文件(立即生效) PATH环境变量的修改 直接修改/etc/profile文件 echo‘PATH=$PATH:/path/to/somewhere’ 我们也可以直接在/etc/profile.d/目录下创建一个以.sh结尾的文件,在文件中声明一个全局变量PATH: #!/bin/bash export PATH=$PATH:/path/to/somewhere 任何一个源程序,如果要调用别人的库,就必须要将别人的库包含进来,才能使用(调用)别人的库。 库文件其实就是函数,函数能够接收参数,参数是有类型的,这些都需要进行声明,包含到当前系统中来。 所以任何一个程序要调用别人的库,要使用到#include(包含) 每一个输出了库文件的软件,头文件中包含了自己所提供的库文件函数,以及函数的调用参数,参数类型等相关属性,这些属性是被其他人依赖这个软件做二次开发的时候调用软件所提供的功能时所使用的规范式文件。 所以头文件也需要输出,否则二次开发后的程序将诶发运行。 导出头文件,输出给系统,我们自己的头文件路径系统是找不到的,系统默认路径为/usr/include,我们可以通过连接的方式增添头文件的搜寻路径。 我们可以将其他目录中的头文件链接到/usr/include下(诸逐个连接),也可以直接将一个目录连接到/usr/include下,改一个名字。 每个文件单独链接:ln –s /usr/local/tengine/include/* /usr/include 将目录链接至/usr/include下:ln –s /usr/local/tengine/include /usr/include/tengine 编译安装时,帮助文档安装在—prefix=/path/to/somewhere 指定的位置 指定位置下有一个*/man的目录 系统的帮助文档存放在/usr/share/man下,其下有man1,man2……分章节存放 所以系统中找到man文件的路径也是有限的。 我们可以在/etc/man.config中进行定义man帮助文档的路径(MANPATH),我们可以在此处加入对应程序帮助文档的路径 man –M /path/to/man_dir command 为命令指定帮助文档 给自己讲linux 2017-01-25 评论 1611 次浏览
第五十五讲——前端软件包管理工具:yum yum是C/S架构的应用,client/server yum有自己的客户端 配置文件:用于指定yum仓库的位置,位置可以使本地的,在ftp服务器上的,web上的。 我们使用yum安装的软件一定是在yum软件仓库中的,当我们安装时,yum客户端将我们需要安装的软件包取回本地(下载),调用rpm命令进行安装,但是在安装之前,yum会根据当前安装包的属性以及所有已安装的rpm包之间的依赖关系,到yum软件仓库自行获取依赖需要的软件包,下载到本地,进行安装。 yum依赖的是rpm的能力。yum仓库中详细的列出了每一个rpm包所提供的文件和能力。 只要我们执行了一次yum命令,yum软件库的数据信息就会被缓存到本地,以后关于yum的分析都在本地,rpm也会在安装前缓存下来,但是会被很快清理。yum软件库的数据因为要重复使用,所以会被保存下来,yum软件仓库其实就是rpm包存放的位置,但是还有yum处理的依赖关系信息。 yum仓库的信息文件: 使用creatrepo 创建yum仓库的元数据信息,存放于yum源的repodate目录下,是xml格式的文件:primary.xml.gz:包含了整个软件仓库中的软件列表、依赖关系、每个rpm包安装生成的文件列表。 filelists.xml.gz: 当前仓库所有rpm包的所有文件列表。 other.xml.gz: 额外的信息,rpm包的修改日志。 repomd.xml 记录以上三个文件的时间戳和校验和。 comps.xml: rpm包的分组信息。 yum相关命令: install:安装 update:升级 update-to:升级到某个版本 check-update:检查升级 remove:删除(卸载) list{rpm -qa} yum源列表 info{rpm -qi}: 查询指定包的相关信息。 provides{rpm -qf}: 查询指定文件由哪些rpm包构成 clean:清理缓存(yum缓存) makeache:创建缓存 groupinstall:安装组 groupupdate:升级组 grouplist:组列表 groupremove:卸载组 groupinfo:组信息 search:通过字符串查找某个软件包 localinstall:安装本地rpm包 localupdate:本地升级 reinstall:重新安装 downgrade:降级 repolist列出所有可用仓库 想要使用yum,前提是要安装yum包,一般来说在安装操作系统的时候就已经安装到位了,我们只是需要配置yum软件仓库。 /etc/yum.repos.d/目录下以repo结尾的文件为软件仓库的配置。 为了只让我们配置的yum源生效,需要将处Medeia的其他文件改名,*.bak,或者删除、移动。 我们查看*-Medeia.repo文件: cat /etc/yum.repos.d/*-Medeia.repo [Repo_id] repo的唯一标识符 name=描述信息description baseurl=ftp:// ftp仓库地址 http:// 网络仓库地址 file:// 本地仓库地址 enable={0,1} 当前仓库是否允许使用 gpgcheck={0,1} 是否使用gpg机制验证软件包的合法性及完整性 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 如果gepcheck=1,gepkey一定要有,可以在本地,也可以在ftp以及web上。 我们也可以在一个文件中定义多个yum仓库 yum list列表中的各列含义 包名,平台(附加方便识别) 版本号,平台号 属于哪个软件仓库 yum clean: 清理缓存 packages 清理rpm包缓存 headers 头部信息 metadate 元数据文件 dbache rpm包的数据缓存 all 所有 yum repolist[ all | enable |disabled ]:显示repo列表,默认为enable all:显示所有repo enabled:显示允许使用的 disabled:显示禁用的 yum list: 列表(支持glob,通配符) all:显示所有,默认 available:所有可用的(仓库中有,但是没有安装的) installed:已经安装的 updates:可用的升级 yum install 包名 -y 自动回答yes --nogpgcheck 解决网上下载包报错的情况 yum remove 卸载(慎用!!)卸载会卸载所有相关的依赖都会被卸载 yum provides/whatprovides 查看指定文件或特性是由哪个包安装生成的。 createrepo /mnt/yum(/mnt/yum下只有安装包时)为rpm创建依赖关系,使用这种方式创建的yum源没有组的定义。 creatrepo -g /root/comps.xml /mnt/yum comps.xml为组定义,从光盘中拷贝到/root中,可以为自己的软件包建立组,这是redhat公司定义的组。 给自己讲linux 2017-01-24 评论 1701 次浏览
第五十四讲——软件包管理 软件包管理器其实也是一个程序。 包管理器应当具有一下几个功能: 打包:二进制程序、库文件、配置文件、帮助文档(制作软件包)。 安装:按需展开软件包 生成数据库,追踪所安装的每一个文件 卸载 查询、升级、校验 市面上较主流的发行版:red hat,SUSE,Debian red hat、SUSE:RPM(包管理器) Debian:dpt(包管理器) RPM:redhat package manager RPM后改名为:RPM is package manager递归缩写 redhat 和SUSE的包管理器虽然一样,但是软件包不能混用,因为redhat与SUSE组织文件系统路径的方式不同。 软件包管理有一个很头疼的问题:包之间的依赖关系。 后端工具:RPM、DPT 前端工具:yum、apt-get yum是一个基于redhat的二次发行版yellowdog中带的功能。 yum:yellowdog update modifier yum能够解决rpm的依赖关系,但是不是说yum就能够脱离rpm,而是给rpm提供一个更高级的工具。 rpm包管理器 制作rpm包 安装、卸载、升级、查询、校验 在安装时会生成数据库,追踪所安装的每一个文件,生成的数据库在/var/lib/rpm。一般而言,数据库都是hash编码的形式,这样查找的速度会块得多。如果rpm管理器的数据库损坏,软件的查询、升级、卸载等功能会受到影响。因此,不仅仅是安装、查询、卸载、升级、校验、还包括数据库的重建,验证数据包。 我们在服务器上安装软件时,应当确定软件的来源,不要使用盗版软件,并且要确定没有被修改过。 我们在删除一个软件包时,不得不手动去解决一些依赖关系 rpm包管理 rpmbuild创建软件包 rpm也是一个软件,也需要进行安装。 rpm包的命名: 包的组成部分(以bind为例) 主包:bind-9.7.1-1.el5.i386.rpm 子包:bind-libs-9.7.1-1.el5.i386.rpm 包名的格式: name - version - release . arch . rpm 包名 -版本号(主.次.开发者的) - 释放号(发行号).平台架构.rpm后缀 major:主版本号,重大改变 minor:次版本号,某个子功能发生变化。 release:修改了BUG或者整合了一点功能,不影响全局。 rpm包为二进制的包(方便安装管理) 还有有源码格式的包,需要动手编译安装。 我们所下载的软件包需要与CPU(硬件平台)和操作系统(软件平台)相匹配。 平台架构为noarch时表示安装包与平台无关。 uname –r 查看平台的版本(系统的版本) -a 查看完整平台版本(系统和硬件) rpm –i(install) /path/to/package_file(指定包所在目录) -h 在安装的时候以‘#’, 50个“#”显示安装进度,每个“#”表示2%。 -v(version) 显示详细的信息 -vv 更详细的信息 rpm -ivh /path/to/package_file --nodeps:忽略依赖关系,这会导致软件可能无法安装 --force 强行安装(无论是重新安装,还是降级操作) --force包含一下三个命令: --replacepkg:重新安装,替换原有安装 --replacefiles 替换文件 --oldpackage 降级安装 --test 测试是否需要解决依赖关系,不安装。 rpm查询:已安装的包依赖数据库查询 rpm -q 包名 查询指定的包是否已经安装 rpm -qa 显示当前系统安装的所有包 rpm -qi package name 查询指定包的的相关信息 rpm -ql package name查询指定包安装后生成的文件列表。 rpm -qf /path/to/somefile 查询某个指定的文件是由哪个rpm包安装生成的。 rpm -qc package name 查询指定软件包的安装配置文件(已安装) rpm -qd package name 查询指定包安装的帮助文件 rpm -q --scripts packages name 查询指定包中包含的脚本。脚本有四类:安装前(准备工作)、安装后(收尾工作)、卸载前、卸载后 如果某个软件包尚未安装,我们需要查询其说明信息,安装后会生成的文件,查询命令如下: rpm -qpi 查询安装包的相关信息。 rpm -qpl 查询安装包安装后生成的文件列表 rpm -qpc 查询安装包安装后的配置文件 rpm -qpd 查询安装包的帮助文件 rpm -qp –scripts 查询安装包中包含的脚本 rpm包升级 rpm –Uvh 包全名(新版本)如果有老版本则安装升级,窦泽进行安装。 rpm –Pvh 包全名,如果装有老版本则升级,否则退出,升级后可能导致其它的软件不能够使用,否则只能降级。 -Uvh/-Pvh 通常与—ddpackage使用(降低) rpm包卸载,卸载的前提是安装了相应的安装包。 rpm -e 包名卸载时应确定没有其他软件依赖。 --nodeps强行卸载(其它依赖的软件无法正常使用) 校验: -V(大写) rpm –V 包名 有8个校验位: S:文件大小发生改变 M:权限发生改变,文件类型发生改变 5:MD5 sum发生改变 D:设备文件的主/次号不匹配 L:路径不匹配 U:属主不匹配 G:属组不匹配 T:最近一次修改时间发生改变。 校验来源合法性,及软件完整性 使用非对称加密算法:公钥、私钥,公钥隐含在私钥当中,可提取出来并公开出去。 单项加密:提取特征码,具有不可逆的特性。 我们先使用单项加密将软件的特征码提取出来,并用私钥加密(使用私钥加密过程很慢),当我们要验证的时候通过公钥解密并比对特征码。 /etc/pki/rpm-gpg/中存放了密钥文件。将文件导入密钥文件,rpm命令中就可以完成验证。 rpm -k 包全名 验证安装包是否合法。 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 导入密钥文件 rpm -K(大写) 包全名 验证安装包是否合法。 dsa,gpg验证来源的合法性,即验证签名。 sha1,md5验证软件包的完整性,也可以使用—nodigest略过此项 重建rpm数据库: rpm --rebuilddb:重建数据库 --initdb:初始化数据库(没有校验位就不建立) 给自己讲linux 2017-01-23 评论 1595 次浏览
第五十三讲——linux目录结构及其功能 linux目录结构: 1.操作系统自身启动需要用到的路径,这一套路径中没有任何目录能单独使用分区(挂载),必须在根上(根文件系统所在分区(根分区)): /etc 配置文件 /bin 普通用户命令存放位置(二进制程序) /sbin 管理员命令存放位置(二进制程序) /lib 库文件 2.操作系统的基本功能,基本服务: /usr/bin 普通用户命令存放位置(二进制程序) /usr/sbin管理员命令存放位置(二进制程序) /usr/lib 库文件 /usr目录可以单独分区,如果将来系统崩溃,其他安装的软件依然存在,应当单独分区,/usr上放的是操作系统的核心功能。 3.第三方软件的安装目录,也就是说,这个软件和操作系统没有关系,和核心功能也没有关系,只是我们为了向外提供一些服务附加进来的,因此他可以独立分区,且建议其独立分区,完全独立的,挂载到其他主机也能够使用: /usr/local/{bin,sbin,lib,etc,share...} 4./opt 以前的软件(三方软件)的安装目录。 5./sys 伪文件系统,系统启动后,给用户提供的一个调用接口,关机状态为空,不能单独分区。 6./proc 伪文件系统,系统启动后,给用户提供的调用接口,是内核实现自我管理使用的,关机状态为空,不能单独分区。 7./dev 设备文件目录,不能单独分区,CPU、内存是由内核直接驱动的,在2.4内核版本前,/dev下有成千上万的设备文件,不管用不用都要有,万一会用到呢?因此无法根据文件来识别设备但是在2.6版本后内核引入了另一套机制:udev udev机制: udev机制结合内核和用户之间的程序能够实现让内核通过驱动程序自动识别到硬件以后自动在/dev下创建设备文件。所以udev能够通过内核(靠驱动程序)对识别到的硬件动态创建设备文件,且能够给设备取一个别致的名字。 udev使得设备文件的创建是按需创建的,这是2.6内核版本的重要功能改变。 内核识别设备时靠驱动程序完成的,并将识别出的信息输出。udev可以通过这些信息判定这是一个什么样的硬件设备,按照事先定义好的数据库结合设备型号创建设备文件,而且创建设备文件时还可以按照用户定义的规则来创建一个具有特殊名称的设备文件。 8./home 应当单独分区,可能会存放很多数据,但是对服务器来讲,基本上用于编译软件,不会有娱乐操作。 9./root 一般来说,不应单独分区,一些操作系统上直接没有管理员家目录,意义不大,管理员四处为家。在Unix上,管理员是没有家目录的,我们一般不使用管理员直接登录。 10./var 存放经常发生变化 的数据文件,应当单独分区,随着主机的运行,会生成大量的日志信息和运行过程中的信息,除了日志之外,一些文件是可以删除的。 ache 应用程序缓存目录 lib 应用程序状态信息数据 local 专用于/usr/local下的应用程序存储可变数据。 lock 锁文件 log 日志目录及日志文件存放此目录 opt /opt下的应用程序存储的数据放在此目录下 run 与运行中的程序相关的数据,通常存放进程的PID文件。 spool 缓冲池 tmp 存储系统两次重启之间产生的数据 11./boot 内核文件(vmlinuz)、引导加载器(BootLoader、grub)等 内核文件在操作系统启动中就会使用到,在刚刚启动操作系统的时候文件系统是没有的,因为文件系统是建立在内核之上的,此时根问价系统也不存在,所以/boot也不存在,所以/boot只是我们启动操作系统后看到的目录而已,所以/boot目录和启动的过程没有关系。 我们来回顾一下计算机的启动过程: 加电自检 ↓ 根据BIOS中设置的启动顺序找启动盘 ↓ 加载MBR,通过MBR识别操作系统在哪个分区,MBR加载完成之后需要靠MBR中的boot loader实现引导操作系统,BootLoader会加载操作系统的内核。 bootloader能够看到磁盘的分区,但是看不到文件系统,因为文件系统时内核的功能,因此BootLoader是直接靠分区表来识别内核在哪个位置的,内核一定在某一分区上,这个分区可能已经格式化过了,bootloader应当能够识别相应的文件系统格式,虽然文件系统不存在,也就是说,这种文件系统的目录和结构是没有的,但是分区已经格式化过了,且格式化的信息为数据区和元数据区,这是另外一个层次的文件系统,跟内核的识别过程是没有关系的,跟内核中的驱动模块也是没有关系的,但是,bootloader必须要能够识别,才能进行数据的读取,所以bootloader也应当能够识别相应文件系统的结构,bootloader能够识别什么样格式的文件系统,内核就能够放到对应文件系统的分区上,bootloader直接访问该分区。加载内核文件到内存。 内核运行起来以后找到根文件系统,将根下的各种目录都启动起来。 内核和根没有必然的附属关系。 一般来说/boot单独分区,/(根)放在lvm上,因为LVM是内核的功能,要使用LVM得启动内核,而我们要加载的就是内核。 12./tmp 临时文件目录,一般来讲最小不能低于400MB。 13./srv 不单独分区。主要用来保存本机或本服务器提供的服务、数据。 给自己讲linux 2017-01-22 评论 1673 次浏览
第五十二讲——程序的组成 从这一讲开始变得开始比较有意思了,先来讲一讲程序的组成。 软件包其实就是应用程序,程序:architecture 例如:c语言:源代码-->编译成为二进制格式 脚本类语言(需要解释器):源代码-->编译-->连接—>运行,解释器本身是二进制程序。 程序运行时还会依赖库文件,库文件又分为动态库,静态库。 静态库是封装到程序中的,动态库为共享库,存在于运行环境的特定目录中。 程序运行时在内存中大体分为以下几个部分:程序的组成:指令+数据。 text代码段,所有的指令在这里存放 date+bss数据是紧跟着代码存放的,这些数据是初始化为零的变量,大多都是全局的。 heap堆—heap堆,不停地动态分配内存的空间 stak栈—stak栈处于最底端,是往上变化的,是本地变量和其他数据的存在,。 heap和stak合起来称为堆栈,他们的作用域不同,访问指令也不同,生命周期也不同,所以分别存放。 动态库可事先已经在内存当中了,当一个程序需要调用动态库时,只需要指向这么一个内存空间,如果这个共享库没有在内存中,那么操作系统就会帮忙将动态库载入内存,并分配给进程调用。 通常来说,指令和库是只读的,其他的数据是可变的,在编程中,我们需要指定的库称为共享库。 在linux操作系统中,共享库文件以.so结尾,share object 共享对象。 我们此前讲过,一个程序想要运行,为了定义这个程序运行的特征,程序还可以通过外部文件加载一些指令,属性信息,这些外部文件称为配置文件。 配置文件中定义的属性或变量会被程序在启动时加载,其实这些配置文件中定义的为变量,程序加载的是文件定义的变量。 程序的组成部分: 1. 二进制程序 2. 库文件(自身提供的库,共享库),自身提供的库就是讲程序自身的功能以接口的形式提供给其他程序。 glibc 通用的c语言库 kernel 内核,系统调用 glibc是几乎所有程序都要用到的最底层的核心库,可能这些库的功能不够完善。一些程序安装好之后,它可能会依赖glibc提供的库,但是也有可能有其他程序调用这个程序的功能,所以这个程序将自身的某些功能当做库来实现,所以这个程序既会生成二进制程序文件,也会生成库,生成的库放到/lib,/usr/lib,自身能够调用,其他的软件也能够调用,所以共享库是由各个软件的库和glibc共同组成的。 3. 配置文件 4. 帮助文件 给自己讲linux 2017-01-21 评论 1419 次浏览