Unix/Linux操作系统-环境介绍

一、Unix操作系统

丹尼斯.里奇、肯.汤普森于1971年左右在美国贝尔实验室,使用C语言开发了这款操作系统。
系统的特点是多用户、多任务,支持多种处理器架构,高安全性、高可靠性、高稳定性。
既可以构建大型关键业务系统商用服务器,也可以构建苹果手机的服务器。

三大衍生版本

  • System V:银行、电信使用的服务器系统
  • Berkley:MacOS、iOS带界面的
  • Hybrid:Minix、Linux

二、Linux操作系统

类Unix系统
免费开源,它指的是系统的内核,凡是使用这种内核的操作系统都叫做Linux系统(发行版)。严格意义上讲Linux指的的内核,隶属于GNU工程。Linux之父:林纳斯.托瓦兹
手机,平板电脑、路由器、视频游戏控制台、PC、大型计算机、超级计算机,台式计算机。
Linux操作系统图片标志
Minix操作系统
是一个微型的类UNIX系统、免费开源,而Linux之父就是在参照这款操作系统的基础上写了第一个版本的Linux内核代码。
GNU工程
是自由软件基金会所创立的一个开源组织,基本原则是公享,主旨是发展出一个有别于商业UNIX的免费且完整的类UNIX系统----GNU Not UNIX。目前Linux内核由它进行维护,所以Linux也叫做GUN Linux
GPL通用公共许可证。
允许对某些成功及派生成果重用、修改、复制,对所有人都是自由的,但不能声明做了原始工作,或声明由他人所做。
POSIX标准
Portable Operating System Interface of UNIX,缩写为 POSIX,它规范了操作系统以接口形式提供的功能的名字、参数、返回值,它保障了应用程序源码级的可移植性。
版本管理

早期版本:0.01、0.02、…、0.09、1.0(0.01-1.0)
旧计划:A.B.C.(A.主版本号 B.次版本号 C.补丁序号)(1.0-2.6)
新计划:A.B.C.D.E (D.构建次数 E.描述信息)(2.6)

特点

多用户、多任务
遵循GNU/GPL具有开发性
设备独立性
丰富的网络功能
可靠的系统安全
良好的可移植性

发行版

Debian
Ubuntu
Fedora
Redhat
CentOS

三、GNU编译器

  1. 支持众多编程语言、平台
  2. 构建过程(C代码是如何变成可执行文件的)

预处理:把程序员所编译的c代码翻译成标准的C代码
编译:把预处理结果处理后翻译成汇编代码
汇编:把汇编代码翻译成二进制指令
链接:把若干个目标文件合并成一个可执行文件

  1. gcc -V 查看版本
  2. 文件后缀

.h 头文件
.gch 头文件的编译结构,一般不用保留
.c 源文件
.i 预处理文件
.s 汇编文件
.o 目标文件
.a 静态库文件
.so 共享库文件

5.参数

-E 预处理
-S 汇编
-c 编译(只生成目标文件)
-o 指定编译结果的名字
-Wall 产生尽可能多的警告
-Werror 把警告当作错误处理
-x 指定编译的语言
-g 生成调试信息
-0n 优化等级
-D 编译时定义宏
-L(小写) 链接时添加库
-i(大写) 指定头文件的查找路径,配置环境变量
1、打开 vim ~/.bashrc
2、在文件末尾,添加一行 export C_INCLUDE_PATH = $C_INCLUDE_PATH:NEW_PATH

3、重新加载配置文件 source ~/.bashrc
注意:如果要删除环境变量需要在 ~/.bashrc文件中删除环境变量后,退出终端重新打开

考题1:#include<> / #include " " 区别?
考题2:头文件中可以编写哪些内容?

考题3:头文件的作用?
1、说明对应的.c文件的内容有哪些(声明函数,全局变量)
2、定义结构、联合、枚举、宏。
3、类型重定义
虽然函数可以隐式声明,但不一定准确

6.预处理指令

#include 文件包含 区分“ ” 和 <> 的区别
#define 定义宏常量或宏函数
#undef 删除宏
#line 指定当前行的行号
#:把标志符转换成字符串
##:把两个宏合并成一个宏
#error 在编译期间产生错误
#warning 在编译期间产生警告
#pragma GCC dependency “文件名” ——用来监控文件,防止所依赖的文件,修改后而不知道
#pragma GCC poison 文件名 ——用于禁用某些标志符
#pragma pack() 设置联合补齐对齐的字节数
n的值必须是比默认的值要小
对齐边界必须是2的较小次方

四、库

目标文件的集合,我们把不需要升级更新维护的代码打包合并在一起合并在一起方便使用。合久必分,分久必合。也可以对源代码进行保密。

静态库

静态库在使用时是把被调用的代码复制到调用模块中,在执行程序时无需静态库存在。
执行速度快,但占用空间大,不方便更新。

共享库

在调用模块中嵌入调用代码的在库的相对位置的地址,在执行程序时,共享库会和程序一起加载到内存中,当执行到调用模块的指令时跳转到共享库中执行,执行完毕后跳转回来。
占用空间小,方便更新,不需要再次编译,相对于静态库,执行效率较低。

静态库的扩展名为.a
共享库(动态库)-的扩展名为.so

五、静态库

  1. 创建静态库

编写源代码:vi .c/ .h
编译源代码:gcc -c xxx.c -> xxx.o
打包生成静态库:ar -r libxxx.a x1.o x2.o x3.o …

  1. ar命令的一些参数

-r 把目标文件添加到静态库中,已经存在的更新
-q 将目标文件追加到静态库的末尾——ar -q 库名 目标文件名
-d 从静态库中删除目标文件——ar -d 库名 目标文件名
-t 显示静态库中有哪些目标文件——ar -t 库名
-x 把静态库拆分成目标文件——ar -x 库名

  1. 调用静态库

直接调用:调用者要在同一目录下 gcc main.c libxxx.c
设置编译参数:-L路径 gcc main.c -L路径
设置环境变量:设置方法与C_INCLUDE_PATH 类似
1、打开 vim ~/.bashrc 文件
2、在文件末尾,添加一行
export C_INCLUDE_PATH = $C_INCLUDE_PATH:NEW_PATH
3、重新加载配置文件 source ~/.bashrc
4、编译时要指定库名 gcc main.c -lmath

  1. 运行

在编译时已经把被调用的函数的二进制复制到可执行文件中了,再执行时不需要静态库文件了。

六、共享库

  1. 创建共享库

编写源代码:vi .c/.h
编译出位置无关目标文件:gcc -c -fpic xxx.c -> xxx.o
链接成共享库:gcc -shared x1.o x2.o x3.o … -o libxxx.so

  1. 调用共享库

直接调用:调用者要在同一目录下 gcc main.c libxxx.so
设置编译参数:-L路径 gcc main.c -L路径 -lmath
设置环境变量:设置方法与C_INCLUDE_PATH 类似
1、打开 vim ~/.bashrc 文件
2、在文件末尾,添加一行
export C_INCLUDE_PATH = $C_INCLUDE_PATH:NEW_PATH
3、重新加载配置文件 source ~/.bashrc
4、编译时要指定库名 gcc main.c -lmath

  1. 运行

在使用共享库时,调用者只是记录了代码在库的位置,因此执行时需要共享库同时被加载
操作系统还需要根据LD_LIBRARY_PATH环境变量的设置来加载共享库

七、动态加载共享库

  1. 头文件#include<dlfcn.h>

  2. 加载共享库void *dlopen(const char *filename, int flag);

filename:共享库的库名,或路径
flag:
RTLD_LAZY 使用时才加载
RTLD_NOW 立即加载
返回值:共享库的句柄(类似文件指针)

  1. 获取标识符地址并使用void *dlsym(void *handle, const char *symbol);

handle:共享库的句柄
symbol:标识符的名字
返回值:标识符在共享库中的位置(地址,可以解引用,或跳转过去)。

  1. 卸载共享库int dlclose(void *handle);

handle:共享库的句柄
返回值:成功返回0,失败返回-1

  1. 获取错误信息char *dlerror(void);

返回值:会把在使用共享库的过程中出现的错误,以字符串形式返回

八、辅助工具

  • nm:查看目标文件、可执行文件、静态库、共享库的中的符号列表
  • ldd:查看可执行程序所依赖的共享库有哪些
  • strip:减肥,去除掉目标文件、可执行文件、静态库和共享库中的符号列表、调试信息。
  • objdump -S a.out: 显示二进制模块的反汇编信息
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值