IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 第二篇 主要涉及linux编程和linux网络编程 -> 正文阅读

[系统运维]第二篇 主要涉及linux编程和linux网络编程

(bash)shell 或 C库函数 应用程序等

系统调用函数

OS操作系统

驱动程序

硬件

.C(#开头的都是预处理指令)->预处理->.C->编译->汇编语言->汇编->.O文件的机器语言->链接(绑定程序运行的通用环境 比如其他.o文件) ->a.out可执行文件
man 3 库函数名
man 2 系统调用函数
man 1 命令(如vim)

比如当前.O文件的main函数里面有main 的实现细节 但是没有printf的实现细节
需要连接一个.O文件 它包含了printf的实现细节
需要连接一个.O文件 它包含了start函数的实现细节,且需要用到main函数,但是没有main函数的实现细节

静态链接 在编译时完成 代码直接进行组合
动态链接 在程序执行过程中,代码加载到内存执行时发生的 在执行过程中临时拼凑

pwd cd … . ls -al vim
shell也是一个进程 自定义变量 :只能该进程中应用 环境变量:可被子进程继承 用 env可查看环境变量 PATH就是一个环境变量的名 echo $PATH 会有很多路径 输入ls 就是在这些路径下找到ls并执行的

还要告诉加载器 动态库的路径 否则会找不到, LD_LIBRARY_PATH 环境变量
加载动态库 dlopen() dlsym()获取动态库中的某个函数地址 dlclose()引用计数减一,为0时从内存中卸载
errno全局变量 perror()打印错误信息, 发生错误时,系统会自动设置errno的值
gcc -g *.c 生成的可执行文件加了调试信息 gdb a.out可进行调试
l 列出程序 b行号/函数名 设置断点 r运行 p变量名 查看变量值 n执行下一条语句 s执行下一条,若有函数则进入函数内 q退出调试
每个进程都有0-4G地址空间 CPU执行该进程被该进程独享
0-3G-1为用户空间 3G-4G-1 为所有进程共享的内核空间 0-3G-1 分别为代码段 数据段 BSS段 堆向上 .SO(动态库文件)文件映射区 栈向下
虚拟地址空间 32位cpu寻址4G 内存条可能才1G 页表(逻辑地址与物理地址对应表) 操作系统维护 比如一个房间给4个客人住 打时间差
栈帧 返回地址
----------
被保存的寄存器的值
----------
栈帧内的局部变量(生命周期为该函数生命周期 作用域在当前栈帧)

内存映射默认大小为虚拟地址上的4K mmap函数 可以用文件映射 也可用内存条映射
用mmap将文件映射到虚拟地址空间 对虚拟地址的操作反应到文件中 就不用read write了
munmap取消映射
fopen fclose fwrite fread 有缓存
open close read write lseek无缓存
fopen()调用过程发生了什么?
1.调用了malloc分配了块缓存区 分别有用于读和用于写的
2.调用open打开一个文件,返回其描述符

fgetc() 缓存区有数据 直接获取 否者先调用read使缓存区有数 再获取
fputc() 缓存区有空间 直接写入 否者调用write将缓存中内容写入文件 清除缓存区 再写入内容到缓存区中

文件描述符fd
每个进程有pid 还有PCB(进程控制块)PCB在1G内核空间中 它记录了每个进程的资源使用情况 比如有下标0=stdin_fileno
下标1=stddout_fileno 下班2=stderr_fileno 这个下标就是文件描述符
rwxr–r-- 读写可执行 分别对应属主 属组 其他人
chmod a+x add.c 一般用来修改.sh脚本文件
stat filename 查看文件元数据 文件的inode号 每个文件都有且一个inode 但一个inode可对应多个文件
cat filename 查看文件内容
inode 存储了文件的元数据和在硬盘的数据块的编号 A,Binode相同 则是硬链接 软连接:a与binode不同 a的inode指向b的inode 删了 b cat a会报错
文件夹操作: opendir closedir readdir()返回其中的一个文件的指针
…上级目录 .当前目录 文件重定向 cat hello.c > abc.c 调用了dup()
某进程对某文件上文件锁:读锁(共享) 写锁(互斥) fcntl()
fork()创建子进程 父进程返回子进程pid 子进程返回0 两个进程的PCB一样
调用完后两个进程 if(pid==0){} else {} 两个进程执行不同代码
ps -aux 查看所有进程信息 ps -aux | grep… 查找
父进程用wait()回收子进程资源 若先死 子进程的父进程变成init进程 此子进程叫孤儿进程
若子死 父没来的及回收 叫僵尸进程 kill -9 pid
fork()后 父子进程代码段一样 用exec函数可以给儿子加载新代码段执行
在bash上执行a.out 其实就是bash先fork 再 exec
管道 : 有名管道(可以理解为一个管道文件) 无名管道(存在于1G内核空间中,用于具有亲缘关系的进程间通信,父进程创管道(此时有两个文件描述符分别用于读写),fork(此时pcb被复制一份),父关写端子关读端,子写父读)
信号:ctrl+c ctrl+\ SIGSEGV段错误时,系统给进程发的信号 SIGALRM
信号处理函数 默认为终止进程 可自己设置 中断服务程序
pcb中有 128个blocking位和128个pending位(信号未决,就是产生了但还没到)和128个函数地址位 针对不同的信号的
可靠信号 不可靠信号:1-31 阻塞期间 发了n次 只响应一次
可重入函数 :空间只在栈帧
前台作业与后台作业:kill -9 可杀死后台进程而 ctrl+c ctrl+\只可杀死前台
用key值可获取被绑定的位于内核空间的用于进程间通信的消息队列的id 向消息队列发消息 从消息队列中移除消息
共享内存也有key和id 都是从用户区向内核空间的映射 一个内核区域映射到多个进程的用户区域 操作用户空间就相当于操作了公共的共享内存区域
有以太网,令牌环网两种网卡两种网帧 IP包一样的 只是IP包外面那层装备变了 一般出网的时候用 tcp/ip 协议簇
应用层 HTTP等 传输层 TCP.UDP等(16位源端口号和16位目的端口号) 网络层 IP等 链路层(链路层(规定网帧格式)+物理层(规定网卡接口大小))
网帧: 比如包含 源MAC地址 目的MAC地址 源IP地址 目的IP地址 (ip地址32位 网卡地址48位)<- ifconfig可查看 MAC地址在传输过程中会一直变
内容经过每一层穿个衣服 到了目的地 经过每一层脱个衣服
上层 用户进程 处理应用程序细节
下层 内核 处理通信细节
交换机交换的是网帧 网段不会变,比如在一个局域网里面 路由器交换的是IP包,比如从以太网进入了令牌环网,先脱衣服到IP层再穿一层衣服
IP地址包含:网络号和主机号 子网掩码

一个交换机可以接很多机器 比如192.168.1.3 192.168.1.4 192.168.1.5 192.168.1.1(网关) 网关通过路由器接到外部 传输后 又经过另一个网关和路由器接入其他网段中 这个过程中IP地址不变 但MAC地址一直在变
三次握手 SYN ACK+SYN ACK
四次挥手 FIN ACK ACK+FIN ACK
数据传输:
1.判断目标IP地址与自己IP地址是否在一个网段
2.路由表查看是否需要出网
3 arp表查目标IP对应的MAC地址
4 若有直接给过去,若无,发广播询问谁的IP地址是,目标机器把自己的MAC地址回复回去,再发数据。
基于TCP网络编程:
listenfd 监听套接字 connfd 连接套接字
socket(创建套接字) bind(与端口和IP地址绑定) listen() accept(会阻塞,产生连接套接字) 处理数据read write close(关闭连接)
网络传输采用大端
客户端: 创建套接字 connect(连接到对应IP和端口号的服务器)
TCP 面向连接的,面向数据流的,保证了传输正确性,因为有三握四挥,
UDP 面向包的,不负责正确性,但传输快,音视频用。
基于UDP的编程:
创建套接字 bind() recvfrom(阻塞) sendto(地址可从recvfrom的返回值获得)
线程:线程共享进程的资源 有自己的tid 每个线程有自己的栈帧 可把main()理解成主线程 return后 主线程结束
pthread_create() pthread_join() 阻塞等待收尸 pthread_detach(指定一个线程是分离属性,它结束了自动回收)

线程对临界资源的访问要同步:mutex锁,是变量类型,可以定义多个不一样的 1 初始化锁变量 2 加锁 3 操作 4 解锁 其他线程加不到锁的
条件变量:cond也是变量类型,可以定义多个不一样的 和mutex搭配使用 pthread_cond_wait() 解锁等待条件变量为真再加锁
生产者消费者模型:加锁,如果是空,调用pthread_cond_wait()阻塞等待 当生产者产好了 pthread_cond_signal(cond) 解锁
信号量:有用于多进程的 也有用于多线程的
sem_post(使值+1) sem_wait(使值-1,若已经为0,则等待) sem_t 是信号量类型
信号量集是进程间通信的,是信号量的集合,包含多个信号量 信号量集 在内核空间中的 也有key和id

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:38:04  更:2021-07-22 14:40:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:56:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码