自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 资源 (2)
  • 收藏
  • 关注

原创 mmap函数分析

mmap:进程创建匿名的内存映射,把内存的物理页映射到进程的虚拟地址空间。进程把文件映射到进程的虚拟地址空间,可以像访问内存一样访问文件,不需要调用系统调用read()/write()访问文件,从而避免用户模式和内核模式之间的切换,提高读写文件速度(感兴趣的可以搜索下“零拷贝机制”)。再看看匿名映射的函数shmem_zero_setup到底做了什么,其实匿名页实际也映射了文件,只是映射到了/dev/zero上,这样有个好处是,不需要对所有页面进行提前置0,只有当访问到某具体页面的时候才会申请一个0页。

2023-03-02 00:15:31 519

原创 内存管理架构

内存管理子系统架构可以分为:用户空间、内核空间及硬件部分3个层面,具体结构如下所示:1、用户空间:应用程序使用malloc()申请内存资源/free()释放内存资源。2、内核空间:内核总是驻留在内存中,是操作系统的一部分。内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。3、硬件:处理器包含一个内存管理单元(Memory Management Uint,MMU)的部件,负责把虚拟地址转换为物理地址。上面的用户空间和内核空间所指的都是虚拟地址,物理地址没有用户和内核之分。每个项目

2023-02-26 23:38:44 250

原创 V4l2架构之主要结构体

struct v4l2_device: 一个摄像头硬件设备可能包含多个子设备,而 v4l2_device 则是所有设备的根,负责管理所有设备, 这个结构体可以看做是所有设备和子设备的基类。struct video_device: 这个结构体的主要目的就是提供众所周知的 /dev/videoX 和 /dev/v4l_subdevX 的设备节点。struct v4l2_subdev : 这是负责SOC 的视频系统中实现特定功能和抽象特定功能的子设备(ISP、3A 等)。

2023-02-13 23:20:49 317

原创 vscode C/C++ 插件推荐

vscode c/c++ 插件推荐 , 看个人爱好

2022-07-26 11:24:27 2082

原创 关于docker基于arm64平台配置jdk1.8环境记录

docker有默认的openjdk镜像,但是版本较低, 我记得好像是基于1.7的,如果你需要以上版本的docker镜像, 可以按照我的方式试试。首先看先docker官网上的镜像:Docker Hub具体自己上官网查看=》我用得是基于ubuntu基础镜像自己制作1.8版本的jre镜像分以下几个步骤:一:按照上序方式直接下载arm64位平台ubuntu基础镜像,或者执行docker pull --platfrom=arm64 ubuntu:16.04进行拉取,拉下来可以使用docke

2022-02-18 09:09:01 3763

原创 UDP编程

协议族为 AF_INET, 字节流选择SOCK_DGRAMsocket() --->bind() ---> recvfrom()--->sendto()---->close();通常使用recvfrom()和sendto()进行IO数据读取和发送,因为能够指定目的主机IP和端口号#include<sys/types.h> #include<sys/socket.h> ssize_t recv(int s, void*buf, size_t

2022-01-09 23:18:10 1827

原创 IO函数之select()与pselect()、poll()与ppoll()简介

一:select()函数select()函数与recv()和send()等直接操作文件描述符不同,它是对需要操作的文件描述符进行一个查询和监控的一个作用。

2021-12-19 03:32:29 1599

原创 tcp标准io简介 recv/send、readv/writev、recvmsg/sendmsg

一:函数原型#include <sys/types.h>#include <sys/socket.h>ssize_t recv(int s, void *buf, size_t len, int flags);ssize_t send(int s, const void *buf, size_t len, int flags);#include <sys/uio.h>ssize_t readv(int s, struct iovec *vector,

2021-12-16 23:29:11 950

原创 TCP/UDP基础协议

TCP网络套接字基础1.套接字通用结构体struct sockaddr sa_family_t sa_family; /*协议族*/ char data[14]; /*协议族数据*/ } typedef unsigned short sa_family_t; 所以sa_family 是个16字节的变量2.通常sockaddr结构体只是作为参数, 但是为了更为详细的设置,tcp通常使用struct sockaddr_in { u8 sin_len; /*结构体长度,1

2021-11-28 00:56:12 4336 1

原创 IP地址和二进制IP地址之间的转换

我们看到的IP通常是类似于127.0.0.1这样的字符串,然而计算机理解的则是像0x01111111100000000000000000000001(127.0.0.1)这样的ip地址方式。对于Linux系统而言有一组函数是专门处理这块的:#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>/*将IP地址装换为地址结构in_addr值*/int inet_aton...

2021-11-28 00:52:56 4990

原创 几种常见网络协议概叙

TCP/IP协议通常分为四层:应用层、传输层、网络互联层、主机到网络层IP协议ICMP协议:主要用于网络传输的诊断,错误,控制信息 IP数据报文 IP头部 ICMP报文 TCP协议:基于IP协议进行封装----------------------------------------IP 数据--------------------------------------------------------| ------

2021-11-13 01:19:23 1656

原创 C语言用二级指针实现以字符串为分割符的函数-加强版strtok

众所周知,标准的c有字符分割功能函数大致:char *strstr(const char *haystack, const char *needle);在字符串haystack中查找第一次出现字符串needle(不包含空结束字符)的位置。char *strchr(const char *str, int c)在参数str所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。char *strtok(char *str, const char *delim)...

2021-11-03 22:26:56 228 1

原创 python移植遇到的一些问题分享

报以下错误时, 在configure配置中添加:ac_cv_file__dev_ptmx=no \ac_cv_file__dev_ptc=no \--disable-ipv6 \二:修改Python-2.7.9\Include\pyport.h 文件中#ifdef HAVE_LONG_LONG# ifndef PY_FORMAT_LONG_LONG# if defined(MS_WIN64) || defined(MS_WINDOWS)# define

2021-10-26 11:44:54 433

原创 在代码中使用动态加载库函数调用动态库

函数原型:dlopen() ; dlsym(); dlerror(); dlclose()void *dlopen(const *char filename, int flag)自定义打开动态库,flag 通常为RTLD_LAZY返回值为null时打开失败void *dlsym(void *handle, char *symbol)获取动态库的函数指针,handle为dlopen的返回库句柄, symbol为动态库中存在的函数名, 返回的是一个函数指针, 所以定义时也需注意,...

2021-10-24 15:15:27 659

原创 使用正则法则获取wifi的mac地址

在某些情况下,需要我们在代码中获取wifi的mac地址,可以使用以下命令:"ifconfigwlan0 | head -1 | awk '/HWaddr/ {print $5}' | tr -d ':' "head -1 :显示第一行awk '/HWaddr/ {print $5}' :行处理器命令,找出包含HWaddr字符的行并且打印5个字符tr -d ':' :去除':'于是我们可以使用:popen()函数,发送相关指令,并使用fget()获取返回值。c...

2020-12-22 10:17:37 235

原创 C语言实现字符串中替换固定字符串

C语言实现字符串中替换固定字符串static void strreplece(char *str, const char *oldstr, const char *newstr){ char s_str[strlen(str)]; memset(s_str, 0, sizeof(s_str)); for(int i=0; i<strlen(str); i++){ if(!strncmp(str+i, oldstr, strlen(old...

2020-12-22 09:51:16 2574

原创 linux系统编程之静态库与动态库

在工程中,我们能够经常看到xxx.a或者xxx.so文件, 以这两种命名结尾的就是链接库文件, .a结尾的为静态库链接文件, .so结尾的则为动态链接库文件。两者各有差异, 差异后面会细说。静态库:创建: -c是生成可重定位的ELF格式文件,如下图所示: 然后就可以生成静态链接库了: // ...

2019-12-24 23:09:38 121

原创 Linux系统编程之进程调度问题二

在一中主要介绍了进程的特性值nice的特征和设置问题。接下来主要介绍一下进程的几种调度方式。 一般系统会同时运行交互进程和后台进程,而标准的内核算法通常能够提供足够的性能和响应度。但通常会有一下几点要求:需要提供担保最大响应时间。高优先级进程应该能够保持互斥访问CPU直至它完成或者释放;实施应用应能够精确的控制其组件进程的调度顺序;//组件进程即从自身fork()出去的进程。...

2019-12-20 23:26:47 271

原创 Linux系统编程之进程优先级和调度一

进程是CPU的执行单位, 进程间的配合是否完美在一定程度上也就决定了该CPU的运行速度。那进程间是如何对CPU资源进行一个调用的呢?又是如何去取得CPU的使用权?这就得谈到进程得优先级和调度问题了。Linux调度进程使用CPU得默认模型是循环时间共享,就是每个进程访问CPU得时间是一致得,并且是循环轮流使用的, 而访问CPU这段时间称之为时间片或者量子。在这种模式种,进程...

2019-12-20 00:14:47 444

原创 Linux系统编程之线程内容补充

线程安全(论可重入性):函数可以供多个线程安全调用,称之为安全函数。实现线程安全主要有两种方法:将函数与互斥量关联使用,在函数返回时解锁; 将共享变量与互斥量关联起来,这种较为复杂。 函数实现为可重入函数(可重入函数即无需使用互斥量,即可多线程安全调用,就是避免对全局变量和静态变量的使用)...

2019-12-17 22:08:15 70

原创 Linux系统编程之线程同步处理(互斥量和条件变量)

每个线程都能够单独执行一个命令,当创建多条线程并且多线程同时会对全局变量(同一文件)等进行调用, 这时就要注意同步处理了,不然可能会出现超出你预料的变化, 这是因为CUP的调度是随机的而引起的。线程中有一种专门处理这种问题的方法, 称之为互斥量, 它能确保同时仅有一个线程可以访问一个共享资源, 这能保证其对任意共享资源的原子访问。互斥量有锁定(lock)和未锁定(unlock)两种状态,最多只...

2019-12-15 16:25:41 252

原创 Linux系统编程之线程一(线程的创建)

线程(thread)与进程类似,但是创建一个线程是进程的10倍甚至更多,一个进程可以包括多个线程,多线程可以执行多个任务,且每个线程之间都可以执行独立的任务。注意:线程之间是共享同一个全局内存区域的,包括数据段,堆,栈;同时还包括一下内容:1:进程的ID; 2:控制终端; 3:用户ID和组ID; 4:打开的文件描述符; 5:资源限制; 6:间隔定时器(setitime...

2019-12-12 23:58:35 344

C语言常用排序实现.rar

用C语言实现的几种常用的排序方法(包括冒泡排序、希尔排序、快速排序、归并排序、直接插入排序)的简单实现,只完成基本功能,可能需要后续完善。

2019-12-27

基于ARM 实现简单的电子相册功能

基于GEC210 上实现电子相册的图片阅览功能 , 用双循环链表实现, 其他功能可以自行添加,包括遍历文件夹目录查找等等

2018-05-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除