首页 > 系统相关 >Linux系统简介

Linux系统简介

时间:2023-08-09 20:12:06浏览次数:31  
标签:文件 gcc 静态 简介 系统 Linux 共享 环境变量

程序员必备的技能:
一门编程语言:C语言、C++
数据结构与算法:表、树、图、查找、排序、STL
操作系统:Linux操作系统
网络通信:TCP\IP协议簇(Socket套接字技术、TCP、UDP、FTP、HTTP等协议)
数据库:MySQL
界面设计:Qt

操作系统课程内容:
系统介绍、内存管理、文件管理、信号处理、进程管理、进程通信、线程管理、线程同步、网络通信

UNIX系统简介:
1970年于美国贝尔实验室,作者肯.汤普逊和丹尼斯.里奇
UNIX是最早的多用户、多任务、支持多种CPU架构,高稳定性、高可靠性、高安全性
既能构建大型关键型业务系统的服务器(银行、电信公司等),也能支持移动嵌入式设备
Minix是一种开源的基于微内核架构的类UNIX计算机操作系统,Linux之父林纳斯.托瓦兹受到Minix的启发,开发了Linux内核的第一个版本

Linux系统简介:
Linux,全称 GNU/Linux
于1991年发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它支持32位和64位硬件,能运行主要的Unix工具软件、应用程序和网络协议。
Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版
相关知识:
Linux的标志:企鹅,因为企鹅是南极洲的标志动物,而南极目前没有被任何国家占用,属于全人类
GNU计划\组织:目前全球最大的开发开源系统的开源组织,负责Linux内核源的升级和维护
GPL通用许可证:在带有GPL证书的代码基础下开发出来的软件,也都需要支持GPL证书
POSIX统一可移植操作系统接口:Linux是完全遵循,UNIX绝大部分遵循,所以它们的命令、API接口基本上都是通用的
发行版:Linux只是内核,内核+Shell+基础软件 = 用户操作系统
不同的公司可以根据Linux内核制作出不同版本、不同风格的Linux发行版,例如:Ubuntu、Redhat、CentOS、Debian

GNU编译工具gcc\g++:
多样化:
支持多种编程语言、支持各种操作系统
gcc -v 查看版本信息
编译构建过程:
预处理:gcc -E code.c -o code.i
编译:gcc -S code.i -> code.s
汇编:gcc -c code.s -> code.o
链接:gcc a.o b.o ... -> a.out
文件类型:
.c 源文件
.h 头文件
.h.gch 头文件的编译结果,会被优先使用
.i 预处理文件
.s 汇编文件
.o 目标文件(二进制)
.a 静态库文件
.so 共享库文件
编译参数:
-E 只预处理
-S 只生成汇编代码
-o 指定编译结果文件名
-c 只编译不链接
-std 指定语法标准 -std=gnu99
-g 生成调试信息
-Wall 尽可能多地产生警告
-Werror 把警告当错误处理
-L 指定库文件的查找路径
-l 指定要一起加载的库文件名字 -lm
-I 指定头文件的加载路径 <> ""
-pedantic -ansi 对于不符合ANSI/ISO标准的语法产生警告
预处理指令:
#include <>/"" 导入头文件
#define 定义宏常量、函数
#undef 删除宏
#ifdef 宏存在则条件为真
#ifndef 宏不存在则条件为真
#endif
#if/#elif/#else/#endif 条件判断编译
#error 提示错误,并阻止生成可执行文件,一般与条件判断配合
#error "提示信息"
#warning 提示警告
#line 设置行号 影响了提示错误、提示警告的行号
#pragma pack(n) 设置对齐、补齐的最大字节数
#pragma once 相当于头文件卫士 防止头文件重复导入
#pragma GCC dependency "file.h" 监控文件是否有修改
#pragma GCC poison key 设置关键字key为毒药,禁止在后续代码中使用

库:
库文件是目标文件的集合,可以被其他代码调用,把代码封装成库文件后方便使用、方便管理,安全性高、保密性强
静态库:
就是目标文件的集合,当调用静态库时,编译器会把静态库的所有的二进制指令拷贝到最后的可执行文件中
优点:运行速度比共享库要快,运行时不需要依赖静态库文件
缺点:可执行文件相对较大,当静态库有修改后,所有使用了该静态库的可执行文件都需要重新编译

共享库:
    就是带入口的可执行文件,当调用共享库时,调用语句处会记录该函数在共享库中的位置,并且共享库文件要与运行的可执行文件一起加载到内存中,当执行到调用共享库代码的语句时,就会跳转到共享库二进制指令的内存中执行,执行完后会跳转回调用语句处
    优点:可执行文件相对较小,当共享库有修改,可执行文件不需要重新编译
    缺点:运行速度比静态库慢一些,运行时需要依赖于共享库文件

静态库:
制作静态库:
1、编译出目标文件
gcc -c xxx.c ...
2、打包目标文件生成静态库文件
ar -r libxxx.a a.o b.o c.o...
使用静态库:
1、直接使用
gcc xxx.c libxxx.a
2、指定库文件的位置
gcc xxx.c -Lpath -lxxx
-L指定库的路径 -l库名 指定要加载的库(库名不包括前缀lib 后缀.a .so)
3、通过修改配置文件中的环境变量来指定库的查找路径
打开系统配置文件:
vim ~/.bashrc
在配置文件末尾添加:
export LIBRARY_PATH=$LIBRARY_PATH:新路径(绝对路径)
保存退出并重新加载配置文件
source ~/.bashrc
使用静态库:
gcc xxx.c -lxxx

共享库:
制作共享库:
1、编译生成目标文件
gcc -fpic -c xxx.c
-fpic 生成与位置无关的文件
2、生成共享库文件
gcc -shared -fpic a.o b.o c.o ... -o libxxx.so
使用共享库:
编译时:
1、直接使用
gcc xxx.c libxxx.so
2、指定库文件的位置
gcc xxx.c -Lpath -lxxx
-L指定库的路径 -l库名 指定要加载的库(库名不包括前缀lib 后缀.a .so)
3、通过修改配置文件中的环境变量来指定库的查找路径
打开系统配置文件:
vim ~/.bashrc
在配置文件末尾添加:
export LIBRARY_PATH=$LIBRARY_PATH:新路径(绝对路径)
保存退出并重新加载配置文件
source ~/.bashrc
使用共享库:
gcc xxx.c -lxxx

运行时:
    运行时,系统会去默认指定的共享库加载路径进行加载共享库,一般通过修改配置文件的环境变量进行设置
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:共享库的加载路径

注意:
1、如果指定路径下有同名的静态库文件、共享库文件,gcc编译器会默认优先加载共享库文件
    如果想要优先使用同名静态库文件 增加 -static编译参数实现
2、对配置文件中的环境变量进行删除修改时,最好重启终端才生效

练习:
    把常用的数据结构、算法封装成libdsa.so
    把常用的头文件放入 /usr/include
    栈、队列、通用链表、平衡二叉树、顺序查找、二分查找、快排、冒泡、计数、插入、选择

动态使用共享库:
    作用:在代码中决定使用哪些共享库,编译时不需要指定,执行时还是需要依赖共享库
    dlopen\dlerror\dlsym

库文件相关辅助命令:
ldd 查看可执行文件依赖哪些共享库 ldd ./a.out
nm 查看目标文件、可执行文件、静态库、共享库文件的符号列表
strip 减肥 删除目标文件、可执行文件、静态库、共享库文件的符号列表

环境变量表:
操作系统会给每个执行的程序提供一张环境变量表,该表中记录了操作系统在提供的时候所处于的所有环境变量,这些环境变量反映了操作系统的配置情况以及该程序所处操作系统中的环境情况
通过声明 extern char** environ; 就可以使用该程序的环境变量表
这个表可以随意使用,因为它只是操作系统提供的一张拷贝表而已
for(int i=0; environ && environ[i]; i++){
printf("%s\n",environ[i]);
}
操作环境变量表的函数:
char *getenv(const char *name);
功能:通过环境变量名获取它的值
int setenv(const char *name,const char *value,int overwrite);
功能:向环境变量表中添加新的环境变量
name:环境变量名
value:环境变量的值
overwrite: 当环境变量存在时
非0 修改原来环境变量的值
0 不修改
返回值:成功返回0 失败返回-1

int putenv(char *string);
功能:向环境变量表中添加新的环境变量或修改值
    string:以 环境变量名=环境变量值

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中
由于系统函数执行导致出现错误,就会改变errno的值
char *strerror(int errnum);
功能:根据errno的值获取对应的错误提示信息
注意:errno是一个全局变量,所以不能只根据它的值是否为0就简单地判断是否产生错误

标签:文件,gcc,静态,简介,系统,Linux,共享,环境变量
From: https://www.cnblogs.com/wangqiuji/p/17617889.html

相关文章

  • linux安装nodejs
    安装node使用node安装elasticdump非常方便。node官网:传送门https://nodejs.org/en下载版本:node-v12.14.0-linux-x64.tar.gz安装环境:centos7.9创建nodejs文件夹cd/usr/localmkdirnodejs解压文件tar-xzvfnode-v12.14.0-linux-x64.tar.gz移动nodejs文件mvno......
  • 简易的学生管理系统(go语言)
    简易的学生管理系统(go语言)首先,你需要安装github.com/go-sql-driver/mysql这个包来操作MySQL数据库。你可以使用以下命令来安装它:gogetgithub.com/go-sql-driver/mysqlpackagemainimport( "database/sql" "fmt" "os" "bufio" "strings" _"......
  • Linux之shell脚本
    目录一、shell脚本基础1.1shell的作用1.1.1shell脚本的概念1.1.2shell脚本应用场景1.1.3shell的作用--命令解释器1.1.4用户登陆的shell1.2shell脚本的构成1.3shell脚本的执行逻辑和方式1.4脚本错误调试1.5重定向与管道符1.5.1充定向1.5.2管道符二、shell脚本的变量2.1命名要求2.2r......
  • Linux系统多网卡多网段多路由表配置
    Linux多个网卡多个网段存在的问题:1.由于只能配置一个默认网关,所以另外一个口只能配置路由,配置比较复杂;2.如果不配置的话,会存在往返路由不一致的情况,导致网络不通。所以,我们可以通过设置多个路由表的方式来实现源进源出,简单写下步骤:1.nano/etc/iproute2/rt_tables,增加两个网卡(vlan)......
  • 高层次人才业务申报系统建设方案
    需求分析:确立系统建设的目标和需求,明确高层次人才业务的各个环节和流程,了解用户需求和功能要求。系统设计:根据需求分析结果,设计系统的架构和模块划分,确定数据流程和界面设计,制定数据库结构和数据管理方案。开发与测试:根据系统设计,进行系统开发和编码工作,实现各项功能和模块。在开发......
  • 软件测试|Windows系统安装Cypress教程
    前言每当提起web自动化测试,大家首先想到的就是selenium,最近这两年时间,出现了playwright和cypress这两款新的工具,不过现在应用范围还是不如selenium,之前我们介绍了playwright的使用,现在开始,我们将介绍cypress工具。cypress是一款易于使用、快速稳定、可靠性高、全面性强的自动化测试......
  • 解决window移植到linux shell执行Python脚本提示找不到模块问题
    1、将工程目录添加到sys.path中(测试有效importsyscpath='project_path'#写成项目的地址最好是绝对地址因为有的地方确实会报错不清楚原因sys.path.append(cpath) eg:sys_path=os.path.abspath(os.curdir)sys.path.append(sys_path.split('test_case')[0])#为了......
  • linux手动安装.net5
    安装依赖sudoapt-getinstall-y-no-install-recommendslibc6libgcc1libgssapi-krb5-2libicu7libssl1.1libstdc++6zliblg解压官网下载的文件tarzxfdotnet-sdk-7.0.100-linux-x64.tar.gz配置环境变量vim~/.bashrc添加dotnet配置exportDOTNET_ROOT=\(HO......
  • ubuntu linux 安装与卸载 anaconda
    Anaconda安装step1下载并上传Anaconda安装包step2安装Anaconda注意到当前没有解压权限,所以要修改文件权限chmod+xAnaconda3-2023.07-2-Linux-x86_64.sh然后执行安装程序./Anaconda3-2023.07-2-Linux-x86_64.sh然后按照提示输入回车或者yes即可。其中有一步要注......
  • Linux系统下安装Hadoop环境
    安装Hadoop的话,是在安装好JDK和MYSQL之后的环境下进行的;还没有安装的话,可以跳转到安装jdk环境(https://www.cnblogs.com/liuzijin/p/17591188.html)和安装mysql环境(https://www.cnblogs.com/liuzijin/p/17591191.html)我使用的是FinalShell远程辅助工具1、将对应的hadoop压缩包上......