Unix系统高级编程
业务逻辑:根据业务需求,按照设计好的逻辑规则,处理信息,与系统无关。
系统访问:利用操作系统所提供的各种功能辅助业务逻辑的实现。
标准函数:scanf/printf - 源代码级兼容
系统函数:read/write - 接口级兼容
环境、性能、功能。
一、Unix系统简介
1.Unix系统的背景
1961-1969:史前时代
CTSS(Compatible Time-Sharing System,兼容分时系统),以MIT为首的开发小组,小而简单的实验室原型。
Multics(Multiplexed Information and Computing System,多路信息与计算系统),庞大而负责,不堪重负。
Unics(Uniplexed information and Computing System,单路信息与计算系统),返璞归真,走上正道。
1969-1971:创世纪
Ken Thompson,肯.汤普逊,Unix之父,B语言之父,内核用B语言+汇编语言开发,PDP-7,第一个Unix系统核心和简单应用。后来被移植到PDP-11平台,功能更加完善。
1971-1979:出谷纪
Dennis Ritchie,丹尼斯.里奇,C语言之父,用C语言重写了Unix系统内核,极大地提升了Unix系统的可读性、可维护性和可移植性——Unix V7,第一个真正意义上的Unix系统。
1980-1985:第一次Unix战争
AT&T贝尔实验室:SVR4
加州大学伯克利分校:BSD+TCP/IP
DARPA,ARPANET(INTERNET)
IEEE,国际电气电子工程师协会,POSIX为Unix内核和外壳制定了一系列技术标准和规范,消除系统版本之间分歧,大一统的操作系统。
1988-1990:第二次Unix战争
AT&T+Sun
IBM+DEC+HP
比尔.盖茨->Windows
1990-现在
1991,Linus Torvalds创建了Linux系统的内核
1993,Linux已达到产品级操作系统的水准
1993,AT&T将Unix系统卖给Novell
1994,Novell将Unix系统卖给X/Open组织
1995,X/Open将Unix系统捐给SCO
2000,SCO将Unix系统卖给Celdear——Linux发行商
Linux就是现代版本的Unix。
2.Linux系统的背景
类Unix操作系统,免费开源。
不同发行版本使用相同的内核。
支持多种硬件平台:手机、路由器、视频游戏控制器、个人电脑、大型计算机等等。
隶属于GNU工程。GNU = GNU Not Unix。
受GPL许可证限制:如果发布了可执行的二进制代码,就必须同时发布可读的源代码,并且在发布任何基于GPL许可证的软件时,不能添加任何限制性条款。
3.Linux系统的版本
早期版本:0.01,0.02,…,1.00
旧计划:1.0.1,…,2.6.0 (A.B.C)
A - 主版本号,内核大幅更新
B - 次版本号,内核重大修改,奇数测试版,偶数稳定版
C - 补丁序号,内核轻微修改
新计划:A.B.C-D.E
D - 构建次数,反映极微小的更新
E - 描述信息
rc/r - 候选版本
smp - 支持对称多处理器
EL - Rad Hat的企业版本
mm - 试验新技术

cat /proc/version
4.Linux系统的特点
遵循GNU/GPL许可证
开放性
多用户
多任务
设备无关性
丰富网络功能
可靠的系统安全
良好的可移植性
5.Linux的发行版本
Ubuntu - 大众化,简单易用
Linux Mint - 新潮前位
Fedora - Red Hat的桌面版本
openSUSE - 华丽
Debian - 自由开放
Slackware - 朴素简洁,简陋
Red Hat - 经典,稳定,企业应用,支持全面
二、GNU编译器(gcc)
1.GCC的基本特点
1)支持多种硬件架构
x86-64
Alpha
ARM
PowerPC
SPARC
VAX

2)支持多种操作系统
Unix
Linux
BSD
Android
Mac OS X
iOS
Windows
3)支持多种编程语言
C
C++
Objective-C
Java
Fortran
Pascal
Ada
4)GCC的版本
gcc -v
2.构建过程
源代码(.c)-预编译->头文件和宏扩展-编译->汇编码(.s)-汇编->目标码(.o)-链接->可执行代码(a.out)
代码:hello.c
vi hello.c - 编写源代码
gcc -E hello.c -o hello.i - 预编译(编译预处理)
gcc -S hello.i - 获得汇编代码(hello.s)
gcc -c hello.s - 获得目标代码(hello.o)
gcc hello.o -o hello - 获得可执行代码(hello)
./hello - 运行可执行代码
3.文件名后缀
.h - C语言源代码头文件
.c - 预处理前的C语言源代码文件 > 可读文本
.s - 汇编语言文件 /
.o - 目标文件
.a - 静态库文件 > 不可读的二进制
.so - 共享(动态)库文件 /
.out - 可执行文件 /
4.编译选项
gcc [选项] [参数] 文件1 文件2 …
-o: 指定输出文件
如:gcc hello.c -o hello
-E: 预编译,缺省输出到屏幕,用-o指定输出文件
如:gcc -E hello.c -o hello.i
-S: 编译,将高级语言文件编译成汇编语言文件
如:gcc -S hello.c
-c: 汇编,将汇编语言文件汇编成机器语言文件
如:gcc -c hello.s
-Wall:产生全部警告
如:gcc -Wall wall.c
代码:wall.c
-Werror:将警告作为错误处理
如:gcc -Werror werror.c
代码:werror.c
-x: 指定源代码的语言
xxx.c - C语言
xxx.cpp - C++语言
xxx.for - Fortran语言
xxx.java - Java语言

gcc -x c++ cpp.c -lstdc++ -o cpp
代码:cpp.c
-O0/O1/O2/O3: 指定优化等级,O0不优化,缺省O1优化
5.头文件
1)头文件里写什么?
头文件卫士
#ifndef XXX
#define XXX

#endif
a.h
/
b.h c.h
\ /
d.c
包含其它头文件
宏定义
#define PI 3.14159
自定义类型
struct Circle {
double x, y, r;
};
类型别名
typedef struct Circle C;
外部变量声明
extern double e;
函数声明
double circleArea(C c);
a.h
/
b.c c.c
| |
b.o c.o
\ /
d - 重定义
一个头文件可能会被多个源文件包含,写在头文件里的函数定义也会因此被预处理器扩展到多个包含该头文件的源文件中,并在编译阶段被编译到等多个不同的目标文件中,这将导致链接错误:multiple definition,多重定义。
2)去哪里找头文件?
gcc -I<头文件的附加搜索路径>
#include <my.h>
先找-I指定的目录,再找系统目录。
#include “my.h”
先找-I指定的目录,再找当前目录,最后找系统目录。
头文件的系统目录:
/usr/include - 标准C库
/usr/local/include - 第三方库
/usr/lib/gcc/i686-linux-gnu/5.4.0/include - 编译器库
代码:calc.h、calc.c、math.c
6.预处理指令
#include - 将指定的文件内容插至此指令处
#define - 定义宏
#undef - 删除宏
#if - 如果
#ifdef - 如果宏已定义
#ifndef - 如果宏未定义
#else - 否则,与#if/#ifdef/#ifndef配合使用
#elif - 否则如果,与#if/#ifdef/#ifndef配合使用
#endif - 结束判定,与#if/#ifdef/#ifndef配合使用
#error - 产生错误,结束预处理
#warning - 产生警告,继续预处理
代码:error.c
#line - 指定行号
代码:line.c
#pragma - 设定编译器的状态或者指示编译器的操作
#pragma GCC dependency 被依赖文件
a<-b
#pragma GCC poison 语法禁忌
#pragma pack(按几字节对齐:1/2/4/8)
#pragma pack() - 按缺省字节数对齐
代码:dep.c、pragma.c
7.预定义宏
无需自行定义,预处理器会根据事先设定好的规则将这些宏扩展成其对应的值。
BASE_FILE: 正在被处理的源文件名
FILE: 所在文件名
LINE: 所在行的行号
FUNCTION: 所在函数的函数名
func: 同__FUNCTION

DATE: 处理日期
TIME: 处理时间
INCLUDE_LEVEL: 包含层数,从0开始
a - 0
#include “b” - 1
#include “c” - 2
cplusplus: C++有定义,C无定义
代码:print.h、predef.h、predef.c
8.环境变量
在进程向下文中保存的一些数据:键(功能,是什么)=值(内容)。
env
C_INCLUDE_PATH
C语言头文件的附加搜索路径,相当于-I选项。
CPATH
同C_INCLUDE_PATH
CPLUS_INCLUDE_PATH
C++语言头文件的附加搜索路径,相当于-I选项。
LIBRARY_PATH
链接库路径
LD_LIBRARY_PATH
加载库路径
代码:calc.h、calc.c、math.c
#include “/…/…/xxx.h” - 移植性差
#include “xxx.h”
gcc -I/…/… … - 推荐
C_INCLUDE_PATH/CPATH=/…/…

Linux 基础资料相关推荐

  1. linux输入ls后不显示_零基础学习之Linux基础命令小结

    安装完重启后,没有像sery所说在图形界面崩溃了,由于我没有安装X-WINDOWS而是直接进入了文本界面.如果你想做linux管理的话,最好在文本界面下工作,这样会适应如下图: 第一行显示的是我们所安 ...

  2. linux基础知识_压缩—进程管理-网络管理-ftp-nfs-ssh-scp

    linux基础知识_压缩-进程管理-网络管理-ftp-nfs-ssh-scp 1.压缩包管理 gzip .gz格式的压缩包,不打包,分别压缩,原文件消失 bzip2 .bz2格式的压缩包,原文件不会消 ...

  3. 《嵌入式 Linux应用程序开发标准教程(第2版)》——第1章 Linux快速入门 1.1 嵌入式Linux基础...

    本节书摘来自异步社区<嵌入式 Linux应用程序开发标准教程(第2版)>一书中的第1章,第1.1节,作者 华清远见嵌入式培训中心,更多章节内容可以访问云栖社区"异步社区" ...

  4. 《嵌入式 Linux应用程序开发标准教程(第2版)》——1.1 嵌入式Linux基础

    本节书摘来异步社区<嵌入式 Linux应用程序开发标准教程(第2版)>一书中的第1章,第1.1节,作者:华清远见嵌入式培训中心,更多章节内容可以访问云栖社区"异步社区" ...

  5. linux基础知识个人总结

    linux基础知识个人总结 第一章: 1. Linux发展史略,有代表性的Linux发行版:Suse.slackware.ubuntu.RedHat.CentOS 2. GNU是Richard Sta ...

  6. linux 如何打包分区文件,Linux基础------文件打包解包---tar命令,文件压缩解压---命令gzip,vim编辑器创建和编辑正文件,磁盘分区/格式化,软/硬链接...

    作业一: 1)将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cat /etc/passwd /etc/group > /1.txt 2)将用户信息数据库文件和用户 ...

  7. day55 linux 基础以及系统优化

    Linux系统基础优化及常用命令   Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令 ...

  8. linux常用删除空文件夹,Linux基础 linux系统中的批量删除文件与空文件删除的命令介绍...

    Linux基础教程linux系统中的批量删除文件与空文件删除的命令介绍 Linux资料下面删除文件或者目录命令rm(remove): Linux培训功能说明:删除文件或目录. 语 法:rm [-dfi ...

  9. Linux基础,命令的使用以及环境的安装,jdk,mysql,tomcat

    Linux基础 1. Linux简介 1.1 Linux的概述 林纳斯·托瓦兹 linux 1.2 Linux的发展史 Linux 操作系统的诞生.发展和成长过程始终依赖着五个重要支柱:UNIX 操作 ...

  10. 一个不错的linux学习资料下载的网址

    本文比较完整的讲述GNU make工具,涵盖GNU make的用法.语法.同时重点讨论如何为一个工程编写Makefile.作为一个Linux程序员,make工具的使用以及编写Makefile是必需的. ...

最新文章

  1. 【思维导图-索引篇】搞定数据库索引就是这么简单
  2. neo4j安装_基于Neo4j的知乎关系爬虫
  3. 设计模式 — 结构型模式 — 组合模式
  4. [javaEE] 三层架构案例-用户模块(二)
  5. 你真的弄明白了吗?Java并发之AQS详解
  6. 直播报名 | 科技赋能零售金融业务转型
  7. workerman json mysql_workerman-json-rpc
  8. html-body相关标签
  9. HTML下拉菜单为什么无线拉长,【CSS】怎么拉长一个div的高度
  10. 大数据之-Hadoop3.x_MapReduce_切片源码分析---大数据之hadoop3.x工作笔记0104
  11. Typecho - MyTagCloud标签云插件
  12. Python 3 实现选择排序
  13. cocostudio常见问题
  14. psasp和matlab,MATLAB和PSASP电力系统潮流计算比较研究
  15. 【195】apache2.4安装ssl 证书
  16. (黑)群晖系统 ds photo 相机自动备份 无法识别DICM下的Camera解决方案
  17. ASP.NET MVC 上传文件方法
  18. 刚刚,10位青年学者获得阿里达摩院青橙奖,钟南山寄语,每人100万,最小获奖者28岁
  19. 量子BB84,B92协议简单介绍
  20. 原理c语言for循环延时1s,for循环实现C语言精确延时

热门文章

  1. R语言_根据马科维茨投资组合理论画出最优投资组合线
  2. Drillbeach---第一章 Drillbench 5.1发行说明
  3. java 无限循环_Java中的无限循环
  4. python无限循环怎么结束,python的无限循环及退出
  5. Android App赞赏功能,微信公众号赞赏功能升级:作者可直接收到赞赏, iOS安卓均可用...
  6. 自适应滤波器(E 题 本科组)--2017 年全国大学生电子设计竞赛试题
  7. LeetCode刷题之路:781. 森林中的兔子
  8. 信息安全意识主题分享-数据安全
  9. 从0到1CTFer成长之路环境搭建详细教程
  10. 豪沃轻abs12v电是什么系统_汽车中的ABS系统是什么意思?