一.UNIX操作系统 
 作者:丹尼斯.里奇,肯.汤普逊
 版权:贝尔实验室
 时间:1971
 特点:多用户,多任务(多进程),多CPU(多种CPU架构),高安全,高可靠,高性能,高稳定
 应用:构建大型服务器的商业服务器,移动终端的嵌入式手持设备。
 三大派生版本:
  各大公司对Unix进行的升级扩展:
   IBM,SUN\Oracle,HP
  有界面支持的:
   MacOS
  开源免费的:
   Linux
二.Linux操作系统
 类Unix系统,开源免费,应用于消费类电子,网络设备,服务器等,Linux严格来说指的是内核,各个公司对它添加界面形成不同风格的发现版。
 
 标志:企鹅,意味着它属于全世界。
 
 相关知识:
  1.Minix:在各大学免费开源的Unix,Linux就起源于它
  2.GNU工程:世界上最大的开源组织,也是Linux的维护者,所以Linux也叫GNU Linux
  3.POSIX标准:统一的系统编程接口规范,Unix和Linux都支持遵守此规范,所以这两个系统的接口基本通用。
  4.GPL公共许可证:A遵循了GPL标准,那么使用A开发的出来的B也不能收费。
 
 
Linux:
版本号:
  A-B-C
  A:内核大幅更新
  B:重要修改,奇数代表测试,偶数代表稳定版
  C:有补丁要升级
 
 
  2003年之后 A-B-C-D-E 前面三个不变
  D:内核构建的次数
  E:添加的一些描述信息
 
 
 特点:
  1.遵循了GPL
  2.开放 目前全世界的程序员还对它进行着升级改造
  3.继承了Unix,多用户,多任务
  4.设备具有独立性
  5.丰富的网络通信
  6.安全,可靠
  7.可移植性强
 
 
 常见的发行版:
  Ubuntu(市场占有率第一)
  StartOS(国有比较好)
  CentOS(做服务器用这个比较好)
  debian
  redhat
  Oracle
 
 
四:编译器
 GNU编译框架
 1.支持众多编译语言
  C++,C,JAVA,Objective-C,Ada
 2.支持各种编译平台
  U\L\W
 3.构建过程(build)
  a.c -> a.out
  a.c -> a.i 预处理 gcc -E
  a.i -> a.s 汇编 gcc -S
  a.s -> a.o 编译 gcc -c
  a.o -> a.out 链接gcc a.o
 
 4.查看版本信息
  通过gcc -v来查看
  编译器的版本号 gcc version 4.8.1
  编译器位数 i686 -linux0-gnu
  所支持的语言 C/C++
  头文件路径 /usr/include
 
 5.文件类型
  .c 源代码文件
  .h 头文件
  .i 预处理文件
  .s 汇编文件
  .o 目标文件
  .a 静态库文件
  .so 共享库文件
  .gch 编译后的头文件,file.h file.gch(优先使用)
 
 6.编译单个文件
  -c 只编译不链接
  -E 预处理
  -S 汇编
  -Wall 尽可能多的生成警告信息
  -Werror 把警告信息当作错误处理
  -g 生成调试信息,gdb来调试
  -x 指定要编译的语言
  -pedantc 以ANSI标准检查语法(本来默认以GNU标准进行检查编译,但是GNU兼容ANSI,而且会多一些自己私有的语法,用这个参数就会只用ANSI这个标准来检查)
 
 7.编译多个文件
  ①头文件的作用
   声明一些外部变量和外部函数
   定义宏常量,宏函数
   类型的设计,类型重定义
   在头文件中包含其他头文件
   借助“头文件卫士”防范重复包含
  ②防止头文件相互包含
   a.h -> b.h ->a.h
   这个时候定义c.h把两者共用的部分移动到c.h
  ③包含头文件与不包含头文件
   如果没有头文件,编译器会猜测函数的格式(返回值猜测成int,参数根据实参的类型去猜测)
   #include ""先在当前文件夹寻找,如果找不到,再到系统指定的位置去查找
   #include <>系统指定的位置去查找
   编译器也可以指定头文件的查找路径 -I path
 
  ④编译单个.c文件 然后再合并生成可执行文件
   gcc -c code.c -> code.o
   gcc code.o -> a.out
 
  ⑤编写Makefile脚本
 
 8.预处理指令
  #include 包含头文件
  #define 定义宏常量或宏函数
  #undef 取消宏定义
  #if 判断
  #elif 当if为假再次进行判定
  #else if判断为假
  #endif 结束判断
  #ifndef 判断没有定义宏
  #ifdef 判断定义宏
  ## 连接两个标识符形成一个新的标识符
  # 转换字符串字符串字面值
  #error 生成错误信息
  #warning 生成警告信息
 
  #pragma pack(1/2/4) 设置结构体补齐,对齐的字节数(大于所设置的这个数,才改这个类型的对齐数)
 
  #pragma GCC poison key 将key设置为病毒(一旦使用key,编译的时候就会报错使用病毒)
 
  #line 设置代码的行号
 
 9.预定义的宏
  __BASE_FILE__ 当前编译的文件名(都是双下划线)
  __FILE__ 代码所在的文件名
  __LINE__ 获取行号
  __FUNCTION__ 获取函数名
  __func__ 同上
  __DATA__ 获取日期
  __TIME__ 获取时间
  __cplusplus 判定是C编译器还是C++编译器
 
 10.与编译器相关的环境变量
  vi ~/.bashrc
  C_INCLUDE_PATH 设置C语言头文件路径
  export CPATH=/home/wangdama/ 设置C语言头文件路径
  LIBRARY_PATH 设置查找库文件路径(静态和共享,编译时查找)
  LD_LIBRARY_PATH 动态加载库文件路径(运行时)
  添加环境变量:source ~/.bashrc
  删除环境变量要关闭重新打开才有效(这是我所用的终端的一个BUG)
五:库
 库(库文件):就是代码的集合,把若干个目标文件合并在一起形成的集合
 1.分久必合(方便使用),合久必分(文件维护)
 2.库文件的分类:
  静态库:调用者把所需的代码从静态库中直接拷贝到可执行文件中
  共享库(动态库):调用者把所需的代码先在共享库中确认,当执行会把共享库和可执行文件一起加载,当需要执行共享库的代码时,直接从可执行文件中跳转过去,.so,.dll
 3.静态库:编译出的静态库相对比较大,不易修改,但是执行效率高
 4.共享库:编译出的共享库相对比较小,容易修改,但是执行效率不高(相对而言)
 
六:静态库
 创建静态库:
  1.gcc -c code.c -> code.o
  2.ar -r libname.a code.o .....若干个.o文件
 调用静态库:
  静态库是需要与调用者一起编译(拷贝)。
  1.直接调用(调用者和静态库在同一目录下)
   gcc hello.c libname.a
  2.设置环境变量LIBRARY_PATH,配合-lname
  vi ~/.bashrc
  export LIBRARY_PATH = $LIBRARY_PATH:path
  关闭终端
   gcc hello.c -lname
  3.-Lpath配合-lname
   gcc hello.c -L/home/wangdama/pratice -lmath
 
  ar命令:
   -r生成静态库
   -q 向静态库中追加目标文件
   -t向静态库中删除目标文件
   -t显示静态库中所有的目标文件
   -x 把静态库展开成目标文件
 
  练习:
  1.实现strlen strcat strcpy strcmp 函数,制作成libstring.a,并用三种方法调用
七:共享库
 创建共享库
 -fpic位置无关,代码段的地址都使用的是相对位置
 1.gcc -fpic -c code.c ->code.o
 2. gcc -shared -o libname.so code.o
 与调用静态库的方法一致
 当静态库和共享库同时存在时候,优先调用共享库 -static强制调用静态库
 
 共享库的运行
  调用共享库的可执行文件运行时候需要共享库一起加载并执行。
  运行时查找共享库需要从LD_LIBRARY_PATH指定的位置加载
  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:path
 
  共享库相关命令:
   -fpic:小模式,生成的位置无关目标文件相对较小,速度较快,但是只有个别平台支持
 
   -fPIC:大模式,生成的位置无关目标文件相对较大,速度相对较慢,但所有平台都支持
 
   ldd:查看可执行文件所依赖的共享库文件
 
   ldconfig:
    LD_LIBRARY_PATH环境变量所配置的路径会记录到ld.so.conf,每次开机时会把共享库加载到ld.so.cache文件中,以此来提高共享库的运行速度,ldconfig可以重新生成ld.so.cache,而不用等到开机
 
 动态加载共享库
  在编译时不再查找共享库,在运行时才去查找加载共享库
  #include <dlfcn.h>
 
  打开共享库
  void *dlopen(const char *filename, int flag);
  filename:库名或路径,如果只有库名则其LD_LIBRARY_PATH去查找
  flag:
   RTLD_LAZY延迟加载,使用的时候才加载
   RTLD_NOW立即加载,程序执行时就被加载
  返回值:成功返回共享库的句柄,失败返回NULL
 
  查找函数
  void *dlsym(void *handle, const char *symbol);
  handle:共享库的句柄,dlopen的返回值
  symbol:函数名
  返回值:成功返回函数指针,失败返回NULL
 
 
  关闭共享库
  int dlclose(void *handle);
  handle:共享库的句柄,dlopen的返回值
  返回值:返回0成功,非零失败
 
  查看错误
  char *dlerror(void);
  当dlopen,dlsym,dlclose执行出错再调用此函数获取错误信息
 
  编译时gcc main.c -ldl
 
 
八:辅助工具
 nm:查看目标文件,静态库,共享库,可执行文件中的符号列表。
 
 strip:减肥,删除目标文件,静态库,共享库,可执行文件中的符号。
 
 objdump:显示二进制模块的汇编信息
 
 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

附件列表

1.Unix,Linux起源与编译原理的更多相关文章

  1. 从事UNIX/LInux服务器编程最方便的代码编译工具------(eclipse for c/c++)、(FileZilla)、(Secure CRT) 这三种一定要一起使用 之1

    今天主要是将前几天搞的Linux学习的心得写出来,希望帮助更多的人进行,方便从事Unix和Linux编程的同行和刚入门者.主要介绍三种工具并给出安装过程,请大家不必怀疑这个博文,此博文是我自己原创.请 ...

  2. Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用

    catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...

  3. linux动态库编译和使用详细剖析 - 后续

    引言 - 也许是修行 很久以前写过关于动态库科普文章, 废话反正是说了好多. 核心就是在 linux 上面玩了一下 dlopen : ) linux动态库编译和使用详细剖析 - https://www ...

  4. linux起源及centos安装

    第1章 Linux介绍 1.1 什么是操作系统 是一个人与计算机硬件的中介 Linux:内核+shell+扩展软件  操作系统,英文名称Operating System,简称OS,是计算机系统中必不可 ...

  5. Unix&Linux技术文章目录(2015-12-22更新)

    Unix & Linux 方面的博客整理.归纳分类,要坚持不懈的学习Unix &Linux,加油!技术需要累积和沉淀.更需要锲而不舍的精神.持之以恒的毅力!借此下面名句勉励自己! 书上 ...

  6. linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记

    上篇文章 小记了: 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记. http://www.cnblogs.com/bleachli/p/4352 ...

  7. 《UNIX/Linux网络日志分析与流量监控》新书发布

    本书从UNIX/Linux系统的原始日志(Raw Log)采集与分析讲起,逐步深入到日志审计与计算机取证环节.书中提供了多个案例,每个案例都以一种生动的记事手法讲述了网络遭到入侵之后,管理人员开展系统 ...

  8. 获得Unix/Linux系统中的IP、MAC地址等信息

    获得Unix/Linux系统中的IP.MAC地址等信息 中高级  |  2010-07-13 16:03  |  分类:①C语言. Unix/Linux. 网络编程 ②手册  |  4,471 次阅读 ...

  9. 《Unix/Linux日志分析与流量监控》书稿完成

    <Unix/Linux日志分析与流量监控>书稿完成 近日,历时3年创作的75万字书稿已完成,本书紧紧围绕网络安全的主题,对各种Unix/Linux系统及网络服务日志进行了全面系统的讲解,从 ...

随机推荐

  1. PYQT5实现控制台显示功能

    首先,写一个信号,用来发射标准输出作为信号 class EmittingStream(QtCore.QObject): textWritten = QtCore.pyqtSignal(str) #定义 ...

  2. MVVM Light Toolkit使用指南

    原文:MVVM Light Toolkit使用指南 原文地址:  https://blog.csdn.net/ldld1717/article/details/77040077 概述 MVVM Lig ...

  3. 5、JVM的监控与分析工具

    一.JPS(虚拟机进程监控工具) 二.jstat:虚拟机统计信息监视工具 例子:jstat -gcutil 16478 s0:区域占比2.33%: s1占比0.00%: E:伊甸园区 : O:老年区: ...

  4. 洛咕 P3700 [CQOI2017]小Q的表格

    洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...

  5. mysql基础(三)——中级查询

    创建表 CREATE TABLE DEPT( DEPTNO ) PRIMARY KEY, DNAME ) , LOC ) ) ; ,'ACCOUNTING','NEW YORK'); ,'RESEAR ...

  6. .NetCore利用BlockingCollection实现简易消息队列

    前言 消息队列现今的应用场景越来越大,常用的有RabbmitMQ和KafKa. 我们用BlockingCollection来实现简单的消息队列. 实现消息队列 用Vs2017创建一个控制台应用程序.创 ...

  7. Reflux系列01:异步操作经验小结

    写在前面 在实际项目中,应用往往充斥着大量的异步操作,如ajax请求,定时器等.一旦应用涉及异步操作,代码便会变得复杂起来.在flux体系中,让人困惑的往往有几点: 异步操作应该在actions还是s ...

  8. gulp.src()内部实现探究

    写在前面 本来是想写个如何编写gulp插件的科普文的,突然探究欲又发作了,于是就有了这篇东西...翻了下源码看了下gulp.src()的实现,不禁由衷感慨:肿么这么复杂... 进入正题 首先我们看下g ...

  9. MOSFET简介以及PMOS和NMOS的差异

    最近在工作中,一直在调试关于MOSFET的电路.在设计过程中发现了PMOS和NMOS的差异,在此记录. 一. MOSFET简介 MOSFET (metal-oxide-semiconductor fi ...

  10. 前端常见算法面试题之 - 二维数组中的查找[JavaScript解法]

    --------------------- 作者:吴潇雄 来源:CSDN 原文:https://blog.csdn.net/weixin_43439741/article/details/835118 ...