Linux系统介绍

UNIX系统介绍:
最早版本的UNIX诞生于1970年的贝尔实验室,作者丹尼斯.里奇和肯.汤普逊
是最早的多用户、多任务、支持多种CPU处理器架构,高安全性、高可靠性、高稳定性的系统
既能架构大型关键性的商用服务器,也能支持嵌入式设备

Minix基于微内核架构的类UNIX操作系统,由此Linux之父林纳斯.托瓦兹受到了启发,才开发了第一个版本的Linux

Linux系统介绍:
Linux,全称GNU/Linux,其内核由林纳斯·托瓦兹于1991年发布,是一个基于POSIX(可移植操作系统接口)的多用户、多任务、支持多线程和多CPU的操作系统。

Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

相关知识:
Linux的标志:小企鹅,因为企鹅是南极标志性动物,而且南极目前没被任意国家占领,是属于全人类。

GNU组织:通用的非商业类UNIX系统,是目前全球最大的开源组织,由该组织负责Linux内核的维护升级

GPL通用许可证:在带GPL证书的代码的基础上开发出来的软件,也必须支持GPL通用许可证

POSIX:统一的操作系统接口规范,UNXI和Linux都遵循这个标准,因此它们的命令、API接口基本上是通用的

发行版:Linux只是内核,内核+Shell+基础软件才是可用的操作系统
    其他的公司就可以根据Linux内核来设计制作出来不同版本的Linux系统,这就是Linux的发行版。
    Ubuntu、RedHat、debian、CentOS、UOS

GNU编译工具:
多样化:
支持各种编程语言,支持各种操作系统
gcc -v 查看版本信息
编译过程:
预处理: gcc -E code.c -c code.i
编译: gcc -S code.i ->code.s
汇编: gcc -c code.s ->code.o
链接: gcc a.o b.o c.o … ->a.out
文件类型:
.h 头文件
.h.gch 头文件的编译结果,优先使用
.c 源文件
.i 预处理文件
.s 汇编文件
.o 目标文件
.a 静态库文件
.so 共享库文件
编译参数:
-E 只预处理
-S 编译
-c 汇编
-o 指定编译结果的名字
-g 设置生成调试信息
-std 设置编译语法标准
-Wall 尽可能多地产生警告
-Werror 把警告当错误处理
-D 设置宏
-L 设置库文件的加载路径
-I 设置头文件的查找路径
-l 指定要加载的库文件的名字 -lm
-On 优化等级 n 1、2、3
-pedantic 对于不符合 ANSI/ISO 语法标准的代码产生警告

预处理指令:
    #include <>/""  头文件包含
    #define         定义宏常量、宏函数
        #           把标识符转换成字符串
        ##          连接两个标识符
    #ifndef         宏名不存在条件为真  
    #ifdef          宏名存在时条件为真
    #undef          删除宏
    #if #elif #else #endif  条件判断
    
    #error      直接提示错误,并且阻止生成可执行文件,一般配合条件判断来使用
    #warning    提示警告
    #line       设置行号,可以影响下面错误、警告、正常语句的

行号

    #pragma pack n(1/2/4)   设置对齐、补齐的最大字节数 
    #pragma once    相当于头文件卫士
    #pragma GCC dependency "file.h" 监控文件
    #pragma GCC poison xxx 设置xxx关键词为“毒药”,相当于禁止在代码中使用

库:
库文件就是目标文件的集合,可以被其它代码调用,把代码封装成库文件后方便使用、方便管理、安全性高、保密性强

静态库:
    就是目标文件的集合,调用静态库就是把静态库中的二进制指令拷贝到可执行文件中
    优点:运行速度相对比共享库较快,可执行文件运行时不需要依赖静态库
    缺点:可执行文件相对较大,当静态库修改后,可执行文件需要重新编译
共享库:
    就是没有入口的可执行文件的集合,调用共享库时就是记录共享库二进制的指针的位置即可。
    当执行可执行文件时共享库文件就会一起加载到内存中,可执行文件就可以跳转到共享库中运行
    优点:可执行文件相对较小,当共享库修改后,可执行文件不需要重新编译
    缺点:运行速度比静态库慢,可执行文件运行时也需要依赖共享库

静态库:
制作静态库:
1、编译出目标文件
gcc -c code.c
2、打包目标文件生成静态库
ar -r libname.a a.o b.o c.o…
使用静态库:
1、直接使用
gcc code.c libname.a
2、指定库文件的位置(name是静态库文件名去掉前缀、后缀)
gcc code.c -Lpath -lname
3、通过设置环境变量来指定库的路径
打开系统配置文件:vim ~/.bashrc
在文件末尾添加库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/home/ubuntu/Linux环境编程/day01/lib
保存并退出后重新加载:source ~/.bashrc
使用静态库:gcc code.c -lname 【-l:指定库名】
注意:删除环境变量,需要关闭终端,再重新打开才生效

共享库:
制作共享库:
1、编译生成目标文件
gcc -fpic -c code.c
-fpic 位置无关
2、生成共享库
gcc -shared -fpic a.o b.o c.o … -o libname.so

使用共享库:
1、直接使用
    gcc code.c libname.so 
    ./a.out 加载失败,原因是系统只会去默认的共享库路径加载共享库 /lib 
2、指定库文件的路径
    gcc code.c -Lpath -lname
    注意:如果默认路径没有该共享库文件,执行可执行文件时还是会找不到
3、通过设置环境变量来指定共享库的加载路径
    打开系统配置文件:vim ~/.bashrc
    在文件末尾添加库的路径
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:path
    保存并退出后重新加载:source ~/.bashrc

注意:当共享库与静态库同名同时存在时,编译器会优先使用共享库,加上 -static 编译参数就可以优先使用静态库。

练习:
    把常用的数据机构与算法封装到libsa.so文件中
        栈
        队列
        通用链表
        平衡二叉树
        顺序查找
        二分查找
        冒泡排序
        快速排序

动态加载共享库:
#include <dlfcn.h>

void *dlopen(const char *filename, int flag);
功能:打开共享库
filename:共享库名字
flag:
    RTLD_LAZY   延时加载
    RTLD_NOW    立即加载
返回值: 共享库的句柄,功能类似于FIEL*

char *dlerror(void);
功能:获取错误信息
返回值:返回错误信息的字符串

void *dlsym(void *handle, const char *symbol);
功能:从共享库中获取函数指针
handle:共享库的句柄,也就是dlopen的返回值
symbol:函数名
返回值:成功返回函数的地址,失败返回NULL

int dlclose(void *handle);
功能:关闭共享库
返回值:成功返回0,失败返回-1

注意:使用动态加载共享库的好处是:可以在编译时不依赖共享库,只需要在编译时加 -ldl 库,但是加载共享库时还是需要依赖共享库

静态库和共享库的辅助工具:
ldd 查看可执行文件程序所依赖哪些共享库
nm 查看目标文件、可执行文件、静态库、共享库的符号列表
strip 减肥,删除目标文件、可执行文件、静态库、共享库的符号,可以减小文件大小
objdump 显示目标文件、可执行文件、静态库、共享库反汇编信息

环境变量表:
每个程序执行时操作系统都会给一个环境变量表,该表中记录了操作系统的所有的环境变量,这些环境变量反映了操作系统的配置,
以及该程序所处于的系统环境。

声明 extern char** environ 就可以直接使用本程序的环境变量表
注意:这个表是可以随意修改,因为这只是操作系统提供的一个备份

操作环境变量表的函数:
#include <stdlib.h>
char *getenv(const char *name);
功能:获取环境变量的值

int setenv(const char *name, const char *value, int overwrite);
功能:向环境变量表中添加环境变量
name:环境变量名
value:环境变量的值
overwrite:当环境变量已经存在时
            为真时修改原来环境变量的值
            为假不修改

int putenv(char *string);
功能:以 name=value 形式添加或者修改环境变量,如果存在则修改,不存在则添加
返回值:成功0 失败-1

int unsetenv(const char *name);
功能:删除环境变量
返回值:成功0 失败-1

int clearenv(void);
功能:清空环境变量表

错误处理:
1、通过函数的返回值来表示错误
a、合法值表示成功,非法值表示失败
例如:计算大小、查找
b、指针类型的返回值返回NULL或者0xFFFFFFFF表示失败,其它的都是表示成功
例如:malloc mmap
c、返回0表示成功,-1表示失败,一般都是系统函数
d、永远成功:printf
2、影响全局的错误编号 errno ,定义在errno.h文件中
#include <string.h>
char *strerror(int errnum);
功能:根据错误编号来获取详细错误原因,记录到日志中,或者通过网络发送

perror("func name") 可以直接显示错误原因
注意:errno是一个全局变量,不能仅仅通过它的值就判断产生错误
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux文件系统Linux操作系统用来管理文件和目录的一种机制。它定义了文件和目录的组织方式,以及对它们进行访问和操作的规则。Linux文件系统采用层次结构,以树状的形式组织文件和目录。 Linux文件系统的根目录是以斜杠(/)表示的。在根目录下,可以创建子目录和文件。每个目录可以包含其他目录和文件,形成一个层次结构。文件系统中的每个文件和目录都有一个唯一的路径来标识它们的位置。 Linux文件系统支持多种类型的文件,包括普通文件、目录、符号链接、设备文件等。普通文件是存储数据的文件,目录是用来组织文件和其他目录的容器,符号链接是指向其他文件或目录的快捷方式,设备文件是用来访问硬件设备的接口。 Linux文件系统还提供了权限控制机制,用于限制对文件和目录的访问权限。每个文件和目录都有一个所有者和一个所属组,可以设置不同的权限(读、写、执行)给所有者、所属组和其他用户。 Linux操作系统支持多种文件系统类型,包括ext4、XFS、Btrfs等。每种文件系统类型都有不同的特性和性能特点,可以根据需求选择适合的文件系统类型。 总结起来,Linux文件系统Linux操作系统用来管理文件和目录的机制,它采用层次结构,支持多种文件类型和权限控制,同时支持多种文件系统类型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值