- 博客(59)
- 资源 (15)
- 收藏
- 关注

原创 Linux驱动之 等待队列waitqueue
如何通过等待队列实现对进程的阻塞?当进程要获取某些资源(例如从网卡读取数据)的时候,但资源并没有准备好(例如网卡还没接收到数据),这时候内核必须切换到其他进程运行,直到资源准备好再唤醒进程。 waitqueue (等待队列) 就是内核用于管理等待资源的进程,当某个进程获取的资源没有准备好的时候,可以通过调用 add_wait_queue() 函数把进程添加到 waitqueue 中,然后切换到其他进程继续执行。当资源准备好,由资源提供方通过调用 wake_up() 函数来
2021-05-25 23:22:42
591

原创 Linux驱动之 字符设备 ioctl接口使用
字符设备ioctl接口使用记录:Linux驱动编写除了对设备进行读写数据之外,通常还希望可以对设备进行控制。在这里插入代码片
2021-04-28 13:22:38
1817
1
原创 【git clone error:no matching key exchange method found】
git报错未找到匹配的密钥交换方法,不同的密钥交换方法 //无法读取远程仓库。git又能愉快的玩耍了
2023-08-16 09:53:25
955
原创 Android源码新大陆
vold&avhttp://aospxref.com/android-13.0.0_r3/xref/system/vold/modelhttp://aospxref.com/android-13.0.0_r3/xref/frameworks/av/大神note:https://deepinout.com/
2023-01-12 23:52:19
316
原创 音视频编码格式认知
编码格式对应的就是音频编码和视频编码,音频编码标准和视频编码标准,每种编码标准都对应的编码算法,其目的是通过一定编码算法实现数据的压缩、减少数据的冗余。视频编码指的是通过特定的压缩技术,将某个视频文件格式转换为另一种视频格式文件的方式可变码率指的是输出码流的码率是可变的,因为视频信源本身的高峰信息量是变化的,从确保视频传输质量和充分利用信息的角度来说,可变码率视频编码才是最合理的。视频分辨率是指视频成像产品所形成的图像大小或尺寸,常见的 1080P、4K 等又代表什么呢,P 本身的含义是逐行扫描
2022-02-12 20:20:10
2541
原创 csdn极客江南
零基础学会 C 语言课程学习突破 1500 人:学习地址:https://edu.youkuaiyun.com/course/detail/31452?spm=1001.2014.3001.5507TSTS 专栏文章更新至第8期:学习地址:https://blog.youkuaiyun.com/weixin_44617968/article/details/119853157?spm=1001.2014.3001.5501C语言专栏:https://blog.youkuaiyun.com/weixin_44617968/catego.
2021-09-06 06:49:21
819
1
原创 linux下脚本实现 切换root用户并执行
借助一个工具 expectsudo apt-get install expect编写脚本:vim root.sh#!/usr/bin/expectspawn sudo /home/b/run.sh #执行run.shexpect {"password*" { send "root密码\r" exp_continue }}你要执行的脚本run.sh#!/bin/bashecho "your root ./sh"sudo ./hello确保脚本有执
2021-07-16 17:24:43
4070
1
转载 TCP 数据传输粘包的处理
使用 TCP 进行套接字通信,数据交互时多个数据包粘连到一起无法拆分是我们的需求过于复杂造成的,是程序猿的问题而不是协议的问题,TCP 协议表示这锅它不想背。解决方案:1.使用标准的应用层协议(比如:http、https)来封装要传输的不定长的数据包2.在每条数据的尾部添加特殊字符,如果遇到特殊字符,代表当条数据接收完毕了有缺陷:效率低,需要一个字节一个字节接收,接收一个字节判断一次,判断是不是那个特殊字符串3.在发送数据块之前,在数据块最前边添加一个固定大小的数据头,这时候数据由两部分组成:
2021-06-17 12:47:51
383
原创 结构体、结构体变量、结构体指针、字符串
结构体数组是用于保存一组相同类型数据的, 而结构体是用于保存一组不同类型数组的在使用结构体之前必须先定义结构体类型, 因为C语言不知道你的结构体中需要存储哪些类型数据, 我们必须通过定义结构体类型来告诉C语言, 我们的结构体中需要存储哪些类型的数据struct 结构体名{ 类型名1 成员名1; 类型名2 成员名2; …… 类型名n 成员名n; };结构体变量占用存储空间大小 struct Person{ int age; // 4 第
2021-06-12 18:16:52
1767
1
原创 指针、数组指针、字符串指针、函数指针、 const指针
指针与数组理论加强:指针变量的初始化定义的同时进行初始化int a = 5;int *p = &a;先定义后初始化int a = 5;int *p;p=&a;把指针初始化为NULLint *p=NULL;int *q=0;不合法的初始化://指针变量只能存储地址, 不能存储其它类型int *p;p = 250; // 错误写法//给指针变量赋值时,指针变量前不能再加“*”int *p;*p=&a; //错误写法指针注意事项指针的指向是
2021-06-12 17:48:48
202
转载 基于UDP的套接字通信
udp 是一个面向无连接的,不安全的,报式传输层协议,udp 的通信过程默认也是阻塞的。UDP通信不需要建立连接 ,因此不需要进行 connect () 操作UDP通信过程中,每次都需要指定数据接收端的IP和端口,和发快递差不多UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息UDP对接收到的数据报不回复确认信息,发送端不知道数据是否被正确接收,也不会重发数据。如果发生了数据丢失,不存在丢一半的情况,如果丢当前这个数据包就全部丢失了通信流程使用 UDP 进行通
2021-06-07 21:32:41
1638
转载 IO多路复用三剑客之 epoll学习记录及简单应用
epoll 全称 eventpoll,是 linux 内核实现 IO 多路转接 / 复用(IO multiplexing)的一个实现IO 多路转接的意思是在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。epoll 是 select 和 poll 的升级版,相较于这两个前辈,epoll 改进了工作方式,因此它更加高效。对于待检测集合select和poll是基于线性方式处理的,epoll是基于红黑树来管理待检测集合的。select和poll每次都会
2021-06-07 00:35:59
168
转载 IO多路复用三剑客之 poll学习记录及简单应用
poll 的机制与 select 类似,与 select 在本质上没有多大差别,使用方法也类似,下面的是对于二者的对比:内核对应文件描述符的检测也是以线性的方式进行轮询,根据描述符的状态进行处理poll 和 select 检测的文件描述符集合会在检测过程中频繁的进行用户区和内核区的拷贝,它的开销随着文件描述符数量的增加而线性增大,从而效率也会越来越低。select检测的文件描述符个数上限是1024,poll没有最大文件描述符数量的限制select可以跨平台使用,poll只能在Linux平台使用#
2021-06-07 00:04:44
150
原创 IO多路复用三剑客之 select学习记录及简单应用
IO 多路转接也称为 IO 多路复用,它是一种网络通信的手段(机制),通过这种方式可以同时监测多个文件描述符并且这个过程是阻塞的,一旦检测到有文件描述符就绪( 可以读数据或者可以写数据)程序的阻塞就会被解除,之后就可以基于这些(一个或多个)就绪的文件描述符进行通信了。通过这种方式在单线程 / 进程的场景下也可以在服务器端实现并发。常见的 IO 多路转接方式有:select、poll、epoll。与多进程和多线程技术相比,I/O 多路复用技术的最大优势是系统开销小,系统不必创建进程 / 线程,也不必维护这
2021-06-06 21:57:41
157
原创 程序返回return与系统退出exit
程序返回return与系统退出exitreturn是语言级别的,它表示了调用堆栈的返回;exit则是系统调用级别的,它表示了一个进程的结束。return是返回函数调用,如果返回的是main函数,则为退出程序 。 exit是在调用处强行退出程序,运行一次程序就结束 。exit(1)与 exit(0)区别 exit(1)表示异常退出。 exit(0)表示正常退出 该值返回给操作系统的,0是正常退出,其他值是异常退出,该值会被写入环境变量ERRORLEVEL,其它程序可以由此判断
2021-06-06 00:10:26
1034
6
原创 Linux 选择题一百道
cron 后台常驻程序 (daemon) 用于:A. 负责文件在网络中的共享B. 管理打印子系统C. 跟踪管理系统信息和错误D. 管理系统日常任务的调度在大多数Linux发行版本中,以下哪个属于块设备 (block devices) ?A. 串行口==B. 硬盘 ==C. 虚拟终端D. 打印机原文链接:https://blog.youkuaiyun.com/qq_36130482/article/details/806168333. 下面哪个Linux命令可以一次显示一页内容?A. ..
2021-05-31 13:58:42
7977
1
原创 Linux系统之 Shell 脚本
一个 Shell 脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell 脚本)来完成这些日常工作任务。if 语法如何嵌套?if [ 条件 ]then命令1命令2…..elseif [ 条件 ]then命令1命令2….else命令1命令2…..fifi在 Shell 脚本中如何比较两个数字?在 if-then 中使用测试命令( -gt 等)来比较两个数字。例如:#!/bin
2021-05-27 07:14:58
322
原创 程序编译链接
gcc -o hello hello.c预处理阶段:处理以 # 开头的预处理命令;编译阶段:翻译成汇编文件;汇编阶段:将汇编文件翻译成可重定位目标文件;链接阶段:将可重定位目标文件和 printf.o 等单独预编译好的目标文件进行合并,得到最终的可执行目标文件。静态链接静态链接器以一组可重定位目标文件为输入,生成一个完全链接的可执行目标文件作为输出。链接器主要完成以下两个任务:符号解析:每个符号对应于一个函数、一个全局变量或一个静态变量,符号解析的目的是将每个符号引用与一个符号定义关联起来
2021-05-27 07:11:15
123
原创 缓冲区buffer与缓存区cache
①buffer 就是写入到磁盘。 Buffer 是为了提高内存和硬盘(其他 I/O 设备) 之间的数据交换的速度而设计的。 buffer 将数据缓冲下来, 解决速度慢和快的交接问题; 速度快的需要通过缓冲区将数据一点一点传给速度慢的区域。 例如: 从内存中将数据往数据往硬盘中写入, 并不是直接写入, 而是缓冲到一定大小之后刷入硬盘中。②cache: cache 就是从磁盘读取数据然后存起来方便以后使用。 cache 实现数据的重复使用, 速度慢的设备需要通过缓存将经常要用到的数据缓存起来, 缓存
2021-05-24 08:30:20
403
转载 Linux驱动之 同步机制总结
Linux驱动 之同步机制总结:自旋锁和互斥锁使用场合:需求建议的加锁低开销加锁优先使用自旋锁短期锁定优先使用自旋锁长期锁定优先使用互斥体中断上下文中加锁使用自旋锁持有锁需要睡眠使用互斥体在中断上下文中只能使用自旋锁,而在任务睡眠时只能使用互斥体长时间睡眠,采用信号量、互斥体短时间,采用自旋锁相关视频讲解,B站 一口Linux :https://www.bilibili.com/video/BV1M64y127kA信号量和互斥体的选
2021-05-10 08:41:33
366
原创 Linux进程与线程之 用户态信号量使用
//@purpose: 基于信号量的多线程同步,操作系统原理中的P,V操作#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <semaphore.h>#include <unistd.h>#define CUSTOMER_NUM 6 /* @Scene: 某行业营业厅同时只能服务两个顾客。 * 有多个顾客到来,每个顾客如果发现服务窗口已满,就等待,
2021-05-09 13:27:32
203
1
原创 网络字节序、大小端模式
网络字节序、大小端模式学习记录:用共用体的方式来测试:可以通过下面的小程序测试自己的机器是大端字节序还是小端字节序#include <stdio.h>union{ char ch; int i;}un;int main(void){ un.i = 0x12345678; if(un.ch == 0x12){ printf("big endian\n"); } else{ printf("small e
2021-05-08 23:47:24
218
转载 指针和引用的不同之处?何时用用指针?何时用引用?
指针与引用:看如下C++代码:int a = 1;int b = 2;int *c = nullptr;c = &a;int &d = b;指针是用来表示内存地址的,而指针这个整数正是被指向的变量地址。而引用就是给变量重新起了一个名字,引用也就是 “别名”。不同之处指针在声明时可以暂时不初始化,当然每次使用指针时都要做检查,以防出现空指针异常的问题。而引用永远都不会为空,它一定得代表着某个对象, 所以 引用 不用做安全性检查。```cppvoid funcPtr(
2021-05-08 17:56:31
735
2
原创 TCP、UDP知识点回顾、应用场合
TCP 协议的优点: 可靠、 稳定, TCP 的可靠体现在 TCP 在传输数据之前, 会有三次握手来建立连接, 而且在数据传输之前, 会有三次握手来建立连接, 而且在数据传输时, 有确认、 窗口、 重传、 拥塞控制机制, 在数据传完猴, 还会断开连接用来节约系统资源。TCP 缺点: 慢, 效率低, 占用系统资源高, 易被攻击, TCP 在传输数据之前,要先建立连接, 这会消耗时间, 而且在数据传递时, 确认机制, 重传机制, 拥塞机制等都会消耗大量时间, 而且要在每台设备上维护所有的传输连接,
2021-05-08 15:57:35
136
原创 编译器优化、volatile关键字
编译器的优化:程序运行的优化可以分为硬件和软件。硬件:在CPU和内存中间增加缓存区 (cache)来解决CPU和内存之间运行速率差异过大的问题。软件上则分为 编译器优化和程序员优化:程序员优化: 程序员对程序算法、逻辑顺序进行合理安排。程序员优化是程序员在编写代码时,对代码的算法、逻辑顺序进行合理安排,提升效率;编译器优化: 编译器编译时会调整代码的执行顺序或者删掉一些无用的语句。编译器优化则是程序员写好的代码,在编译链接时由编译器进行优化,会调整代码的执行顺序或者删掉一些无用的语句。编译
2021-05-07 09:18:46
706
原创 高级排序之 希尔排序、归并排序(递归)、快速排序 C
之前我们学习过基础排序,包括冒泡排序,选择排序还有插入排序,并且对他们在最坏情况下的时间复杂度做了分析,发现都是(N^2),而。,因为每一次递归调用都会在栈内存开辟新的空间,重新执行函数,如果。定义函数时,在函数内部调用函数本身,称之为递归。将已有序的子序列合并,得到完全有序的序列;,是插入排序算法的一种更高效的改进版本。上的一种有效的排序算法,该算法是采用。希尔排序是插入排序的一种,又称。的问题,接下来我们学习一些。
2021-05-06 23:55:52
42
3
原创 简单排序之 冒泡排序、选择排序、插入排序 C
冒泡排序冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。需求:排序前 :{4,5,6,3,2,1};排序前 :{1,2,3,4,5,6};排序原理: 俩俩相比,比大互换。1.比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。2对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值。bubbleSort.cstatic void compareSwap(int *a, int *b){ if
2021-05-06 23:10:21
242
转载 计算机操作系统基本特征、基本功能、系统调用、宏内核、微内核、中断
认识Linux系统的并发机制:并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。并发容易导致竞争的问题。竞争就是两个或两个以上的进程同时访问一个资源,同时引起资源的错误。因此操作系统中,内核提供并发控制机制,对共享资源进行保护。...
2021-05-06 10:21:22
378
1
原创 算法时间复杂度、空间复杂度分析
算法时间复杂度分析在计算机程序编写前,依据统计方法对算法进行估算,经过总结,我们发现一个高级语言编写的程序程序在计算机上运行所消耗的时间取决于下列因素:1.算法采用的策略和方案;⒉编译产生的代码质量;3.问题的输入规模(所谓的问题输入规模就是输入量的多少);4.机器执行指令的速度;由此可见,抛开这些与计算机硬件、软件有关的因素,一个程序的运行时间依赖于算法的好坏和问题的输入规模。如果算法固定,那么该算法的执行时间就只和问题的输入规模有关系了。我们研究算法复杂度,侧重的是当输入规模不断增大时,
2021-05-06 00:06:46
2156
原创 数据结构、算法概述
1.1 什么是数据结构?官方解释:数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。大白话:数据结构就是把数据元素按照一定的关系组织起来的集合,用来组织和存储数据。1.2 数据结构分类传统上,我们可以把数据结构分为逻辑结构和物理结构两大类。逻辑结构分类:逻辑结构是从具体问题中抽象出来的模型,是抽象意义上的结构,按照对象中数据元素之间的相互关系分类,也是我们后面深入学习需要关注和讨论的问题。a.集合结构︰集合结构中数据元素除了属于同一个集合外
2021-05-06 00:06:01
172
转载 SQL 学习
SQL语法基础模式定义了数据如何存储、存储什么样的数据以及数据如何分解等信息,数据库和表都有模式。主键的值不允许修改,也不允许复用(不能将已经删除的主键值赋给新数据行的主键)。SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS 都有自己的实现,如 PL/SQL、Transact-SQL 等。SQL 语句不区分大小写,但是数据库表名、列名和值是否区分依赖于具体的 DBMS 以及配置。SQL 注释SQ
2021-05-05 17:27:42
185
原创 Linux驱动之 原子操作
Linux驱动之 原子操作学习记录:概念:原子操作是指在执行过程中不会被别的代码所中断的操作,即它是最小的执行单位。最简单的原子操作就是一条条的汇编指令(不包括一些伪指令,伪指令会被汇编器解释成多条汇编指令)。在linux中原子操作对应的数据结构为atomic t,定义如下:typedef struct{ int counter;}atomic_t;之所以定义这么一个数据类型,是为了让原子操作函数只接受 atomic_t 类型的操作数,如果传入的不是 atomic_t 类型数据,在程序
2021-05-04 22:20:28
676
原创 Linux进程与线程之 进程间通信IPC
进程间通信:管道,FIFO,消息队列, 信号量, 共享内存管道管道, 通常指无名管道, 是 UNIX 系统 IPC 最古老的形式①特点1. 半双工(即数据只能在一个方向上流动) , 具有固定的写端和读端2. 它只能用于具有亲缘关系的进程之间的(父子进程或兄弟进程之间)3. 万物皆文件, 可以被看成是一种特殊的文件, 可以使用普通的读些 write,read等函数。 但它不是普通文件, 并不属于其他文件系统, 只存于内存中。②原型4. #include <unistd.h>5.
2021-05-04 18:30:25
349
原创 Linux系统之 文件锁 fcntl函数使用
在多数unix系统中,当多个进程/线程同时编辑一个文件时,该文件的最后状态取决于最后一个写该文件的进程。文件锁(也叫记录锁)的作用是,当一个进程读写文件的某部分时,其他进程就无法修改同一文件区域。借助fcntl函数来实现锁机制。允许对文件中任意字节区域加锁,短至一个字节,长至整个文件。操作文件的进程没有获得锁时,可以打开,但无法执行read、write操作。适合环境——当前系统中该进程只能起一个。实现原理——当一个进程打开了这个文件,另一个进程发现文件被打开了,就无法再打开这个文件了。对于有些应
2021-05-04 17:19:21
913
原创 Linux驱动之 内核最常见的自旋锁及死锁示例
内核当发生访问资源冲突的时候,可以有两种锁的解决方案选择:一种是原地等待,一种是挂起当前进程,调度其他进程执行(睡眠)。Spinlock是内核中提供的一种比较常见的锁机制,自旋锁是“原地等待”的方式解决资源冲突的,即一个线程获取了一个自旋锁后,另外一个线程期望获取该自旋锁,获取不到,只能够原地“打转”。(忙等待)。自旋锁优点:自旋锁不会使线程状态发生切换一直处于用户态,即线程—直都是active的;不会使线程进入阻塞状态,减少了不必要的上下文切换,执行速度快。非自旋锁在获取不到锁的时候会进入
2021-05-04 17:12:26
2328
原创 Linux驱动之 互斥、内核态信号量、完成量
互斥概念信号量是在并行处理环境中对多个处理器访问某个公共资源进行保护的机制,mutex用于互斥操作。mutex的语义相对于信号量要简单轻便一些,在锁争用激烈的测试场景下,mutex比信号量执行速度更快,可扩展性更好,另外mutex数据结构的定义比信号量小。struct mutex my_mutex; //定义mutex_init(&mu_mutex); //初始化 mutex_lock(&my_mutex);...... //临界资源m
2021-05-04 11:17:52
379
原创 git 使用
Git基本常用命令如下:mkdir XX (创建一个空目录 XX指目录名)pwd 显示当前目录的路径。git init 把当前的目录变成可以管理的git仓库,生成隐藏.git文件。git add XX 把xx文件添加到暂存区去。git commit –m “XX” 提交文件 –m 后面的是注释。git status 查看仓库状态git diff XX 查看XX文件修改了那些内容git log 查看历史记录git reset --hard HEAD^ 或者 git reset --hard
2021-05-02 16:33:33
130
转载 函数值传递、地址传递、引用传递,指针与引用
1.值传递:有一个形参向函数所属的栈拷贝数据的过程,如果值传递的对象是类对象或是大的结构体对象,将耗费一定的时间和空间。函数返回后,函数栈帧销毁,拷贝也会自动被回收,所以对形参的操作不会影响原来的值。2.指针传递:同样有一个形参向函数所属的栈拷贝数据的过程,但拷贝的数据是一个固定为4字节的地址(32位系统)。传指针就是为实参创建一个指针变量,指针变量里面存的就是实参的地址,对形参进行操作也会通过指针的间接访问对实参进行修改,所以对形参的操作会影响原来的值。3.引用传递:传引用什么也没创建,只是给实
2021-05-01 17:26:06
520
原创 常用标准IO:fopen、fclose、fread、fwrite、fseek 学习、使用
系统调用IO函数open,close等都是围绕着文件描述符fd进行相关操作的。当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后续的IO操作。当用C库标准IO函数(fopen、fclose、fread、fwrite、fseek等)打开或创建一个文件时,我们已使一个流(FILE *stream)与一个文件相关联了。常用标准IO:fopen打开流FILE *stream, 文件指针,FILE结构体又被称作流。#include <stdio.h>/* * @descripti
2021-04-30 22:05:09
1488
CloverThese are great! Perfect reminders for my special jobs!
2022-02-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人