Linux操作系统
文章平均质量分 77
无
梅山剑客
2023年6月毕业,7月入职的嵌软攻城狮
展开
-
Linux高并发服务器开发—项目实战
本文主要介绍开发一个基本的高并发服务器需要用到哪些技术栈和技术实现,内容包括:1、unixI\O操作5中工作模式。2、http协议内容的介绍。3、http协议的工作流程。4、有限状态机编程思想。5、线程池原理的介绍。6、EPOLL如何确保两个线程同时访问一个socket‘’...原创 2022-07-11 09:25:48 · 4301 阅读 · 2 评论 -
Linux高并发服务器开发—UDP、广播、组播、本地socket
udp服务端udp客户端UDP通信的现象:向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊的IP地址,这个IP中子网内主机标志部分的二进制全部为1。a.只能在局域网中使用。b.客户端需要绑定服务器广播使用的端口,才可以接收到广播消息。广播服务端广播客户端组播(多播)——了解单播地址标识单个 IP 接口,广播地址标识某个子网的所有 IP 接口,多播地址标识一组 IP 接口。单播和广播是寻址方案的两个极端(要么单个要么全部)原创 2022-07-10 03:45:00 · 619 阅读 · 0 评论 -
Linux高并发服务器开发—I/O多路复用
I/O 多路复用使得程序能同时监听多个文件描述符,能够提高程序的性能,Linux 下实现 I/O 多路复用的系统调用主要有 select、poll 和 epoll。多路转接!!!select 工作流程:101+1的目标是为了遍历到101。底层是一个for循环。小于102,所以能遍历到101。实验现象:现象:实验现象:LT 模式 (水平触发)LT(level - triggered)是缺省的工作方式,并且同时支持 block 和 no-block socket。在这种做法中,内核告原创 2022-07-08 07:54:21 · 393 阅读 · 0 评论 -
Linux高并发服务器开发—多进程和多线程
只能连接一个 客户端。要求服务器连接多个客户端。要实现TCP通信服务器处理并发的任务,使用多线程或者多进程解决。思路:1、一个父进程,多个子进程2、父进程负责等待并接收客户端的链接3、子进程:完成通信连接,接收一个客户端连接,就创建一个子进程。通过信号和errno回收子进程的资源!!!3个客户端和一个服务器。...原创 2022-07-08 00:45:00 · 495 阅读 · 0 评论 -
Linux高并发服务器开发—网络编程(二)
所谓 socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。socket 可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的 API,也是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连的原创 2022-07-07 08:32:32 · 308 阅读 · 0 评论 -
Linux高并发服务器开发—网络编程(一)
网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件,又称为网络适配器或网络接口卡NIC。其拥有 地址,属于 OSI 模型的第 层,它使得用户可以通过电缆或无线相互连接。每一个网卡都有一个被称为 MAC 地址的独一无二的 位串行号。网卡的主要功能1.数据的封装与解封装2.链路管理3.数据编码与译码MAC 地址(Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址、以太网地址、物理地址或硬件地址,它是一个用来的位址,由网络设备制造商生产时原创 2022-07-07 01:00:00 · 619 阅读 · 0 评论 -
Linux高并发服务器开发—多线程
连接已终止的线程代码实现间隔3S 回收子线程资源。为什么pthread_join 要传递2级指针?好比说,int *a;修改这个数值,要传递一级指针。为了获得子线程退出时的返回值,所以join函数传入的是指向该返回值的指针,因为该返回值也是一个指针,所以传入的是二级指针。好比说 int a =10;函数要对a进行改变,无法修改a的数值。所以类型为 同理:函数要对a进行改变,无法修改a的数值。所以类型为 代码实例线程分离之后再进行连接会出现error的情况。取消某个线程多次运行结原创 2022-07-06 00:45:00 · 2736 阅读 · 0 评论 -
Linux高并发服务器开发—进程间通信(三)-共享内存和守护进程
实验现象:共享内存实现进程间通信。共享内存的读取守护进程查看当前的终端的ID!!!不同的获取终端!!!守护进程实例:实验现象:原创 2022-07-05 09:35:01 · 254 阅读 · 0 评论 -
Linux高并发服务器开发—进程间通信(二)--信号
未决状态:未被处理的状态。非法访问野内存:GDB分析段错误core文件:kill函数实现:现象:子进程杀死自己。alarm定时器函数实验现象:之前有定时器,返回之前的定时器剩余的时间结果显示:重定向到a.txt实例:过3秒以后,每隔2秒钟定时一次信号捕捉函数示例现象:捕捉到信号后打印编号。1表示没有被处理,0表示已经被处理。以下信号集相关的函数都是对自定义的信号集进行操作信号集代码实现:信号集操作现象:对内核的信号集进行操作:操作内核当中的信号集...原创 2022-07-05 01:00:00 · 223 阅读 · 0 评论 -
Linux高并发服务器开发—进程间通信(一)
1、匿名管道2、有名管道3、信号4、消息队列5、共享内存6、信号量7、Socket循环队列:线性队列变成环形队列,可以覆盖写数据。同时发送和接收:匿名管道数据基本单向流动,不会出现双向流动,避免发生错误。子进程: ps aux, 子进程结束后,将数据发送给父进程父进程:获取到数据,过滤pipe()execlp()子进程将标准输出 stdout_fileno 重定向到管道的写端。 dup2管道的读写特点和管道设置为非阻塞管道的读写特点使用管道时,需要注意以下几种特殊的情况(假设原创 2022-07-04 03:00:00 · 276 阅读 · 0 评论 -
Linux高并发服务器开发—进程
程序是文件。进程占用CPU的资源,进程是程序要运行,系统要分配的资源。进程调度的策略和进程调度的算法。父子进程交替执行:父子进程执行代码:实际上,更准确来说,Linux 的 fork() 使用是通过写时拷贝 (copy- on-write) 实现。写时拷贝是一种可以推迟甚至避免拷贝数据的技术。内核此时并不复制整个进程的地址空间,而是让父子进程共享同一个地址空间。只用在需要写入的时候才会复制地址空间,从而使各个进行拥有各自的地址空间。也就是说,资源的复制是在需要写入的时候才会进行,在原创 2022-07-03 03:45:00 · 228 阅读 · 0 评论 -
Linux高并发服务器开发—系统IO
标准C库函数带有缓冲区,效率执行效率高,在缓冲区中。然后一次性发送出去。而linux中的系统调用没有缓冲区,执行效率低。调用一次,读取一次,或者写入一次。网络通信的时候,就用linux系统IO,因为发送次数多。写一次,操作一次磁盘,读一次,操作一次磁盘。虚拟地址空间->MMU映射->真实的内存。MMU把虚拟内存和物理内存连接在一起。通过系统调用来进入内核区,操作内核区的数据。为什么要用数组来存储文件描述符,因为,就是可以同时打开多个文件,每打开一个文件,都占用一个文件描述符。每一个进程中都有一个PCB原创 2022-07-02 16:11:42 · 414 阅读 · 0 评论 -
Linux高并发服务器开发—GDB调试
就是debug用的呗。打了3个断点:next:step:向下执行一句。next :一步步向下执行;不会进入函数体中;step :遇到函数进入函数体finish进入函数体中。设置自动变量后的结果显示——每次打印a和b的数值。set var 变量名= 变量值.........原创 2022-07-01 14:10:30 · 214 阅读 · 0 评论 -
Linux高并发服务器开发—静态库和makefile
重点笔记记录静态库的制作静态库生成.o文件拷贝静态库文件得到.o文件,生成和位置无关的代码。得到动态库ldd可以查看依赖关系:1、载入环境变量环境变量是一次性的,临时的。2、永久配置环境变量shift+g进入最后一行:添加环境变量。更新环境变量再次运行,可以运行。3、系统级别的配置最后一行添加环境变量代码。配置文件添加文件路径:更新指令静态、动态库编译的过程静态库一直加载,占用资源厉害。动态库只加载一次,节约资源。参考笔记:Makefile原创 2022-06-30 22:20:29 · 432 阅读 · 0 评论 -
正点原子linux阿尔法开发板使用——应用开发篇
linux应用开发篇1、应用编程点灯:使用交叉编译器source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi2022.5.15 GPIOlinuxc 应用文档p526控制gpio输出在GPIO中断测试章节中,使用到了 poll()多路转接。作用:检测文件当前状态是否就绪,是不是需要使用到的状态。文档交叉P475。#include <poll.h>int原创 2022-05-19 20:47:32 · 1681 阅读 · 2 评论 -
Linux网络通信——TCP通信流程
1、TCP通信流程TCP是一个面向连接的,安全的,流式传输协议,这个协议是一个传输层协议。面向连接:是一个双向连接,通过三次握手完成,断开连接需要通过四次挥手完成。安全:tcp通信过程中,会对发送的每一数据包都会进行校验, 如果发现数据丢失, 会自动重传流式传输:发送端和接收端处理数据的速度,数据的量都可以不一致4.1 服务器端通信流程创建用于监听的套接字, 这个套接字是一个文件描述符int lfd = socket();将得到的监听的文件描述符和本地的IP 端口进行绑定bind()原创 2022-04-09 22:49:56 · 6844 阅读 · 2 评论 -
Linux网络编程——socket套接字
socket编程Linux系统采用了Socket套接字,因此,Socket接口就被广泛使用,到现在已经成为事实上的标准。与套接字相关的函数被包含在头文件sys/socket.h中。网络通信的主体主要分为两部分:客户端和服务器端。在客户端和服务器通信的时候需要频繁提到三个概念:IP、端口、通信数据,下面介绍一下需要注意的一些细节问题。字节序在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么原创 2022-04-08 22:42:44 · 889 阅读 · 0 评论 -
Linux线程间同步(三)
6. 信号量6.1 信号量函数信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作。信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后再进行自己下面的步骤,这个任务并不一定是锁定某一资源,还可以是进行一些计算或者数据处理之类。信号量(信号灯)与互斥锁和条件变量的主要不同在于”灯”的概念,灯亮则意味着资源可用,灯灭则意味着不可用。信号量主要阻塞线程, 不能完全保证线程安全,如果要保证线程安全, 需要信原创 2022-04-06 17:03:05 · 354 阅读 · 0 评论 -
Linux线程间同步(二)
4. 读写锁4.1 读写锁函数读写锁是互斥锁的升级版, 在做读操作的时候可以提高程序的执行效率,如果所有的线程都是做读操作, 那么读是并行的,但是使用互斥锁,读操作也是串行的。读写锁是一把锁,锁的类型为pthread_rwlock_t,有了类型之后就可以创建一把互斥锁了:pthread_rwlock_t rwlock;之所以称其为读写锁,是因为这把锁既可以锁定读操作,也可以锁定写操作。为了方便理解,可以大致认为在这把锁中记录了这些信息:锁的状态: 锁定/打开锁定的是什么操作: 读操作/写操原创 2022-04-05 09:26:41 · 551 阅读 · 0 评论 -
linux线程间同步(一)
1. 线程同步概念假设有4个线程A、B、C、D,当前一个线程A对内存中的共享资源进行访问的时候,其他线程B, C, D都不可以对这块内存进行操作,直到线程A对这块内存访问完毕为止,B,C,D中的一个才能访问这块内存,剩余的两个需要继续阻塞等待,以此类推,直至所有的线程都对这块内存操作完毕。 线程对内存的这种访问方式就称之为线程同步,通过对概念的介绍,我们可以了解到所谓的同步并不是多个线程同时对内存进行访问,而是按照先后顺序依次进行的。1.1 为什么要同步线程需要分时复用CPU时间片,并且如果测试程序中原创 2022-04-03 04:30:00 · 1200 阅读 · 0 评论 -
Linux高级编程——多线程
1、线程概念线程是轻量级的进程,在Linux环境下线程的本质仍是进程。操作系统会以进程为单位,分配系统资源,可以这样理解,进程是资源分配的最小单位,线程是操作系统调度执行的最小单位。1.1 线程与进程的区别进程有自己独立的地址空间, 多个线程共用同一个地址空间1、线程更加节省系统资源, 效率不仅可以保持的, 而且能够更高2、在一个地址空间中多个线程独享: 每个线程都有属于自己的栈区, 寄存器(内核中管理的)3、在一个地址空间中多个线程共享: 代码段, 堆区, 全局数据区, 打开的文件(文件描述符原创 2022-04-02 16:31:25 · 1833 阅读 · 0 评论 -
Linux信息处理机制——信号
1. 信号概述Linux中的信号是一种消息处理机制, 它本质上是一个整数,不同的信号对应不同的值,由于信号的结构简单所以天生不能携带很大的信息量,但是信号在系统中的优先级是非常高的。在Linux中的很多常规操作中都会有相关的信号产生,先从我们最熟悉的场景说起:通过键盘操作产生了信号:用户按下Ctrl-C,这个键盘输入产生一个硬件中断,使用这个快捷键会产生信号, 这个信号会杀死对应的某个进程通过shell命令产生了信号:通过kill命令终止某一个进程,kill -9 进程PID通过函数调用产生了信号转载 2022-03-31 04:30:00 · 1836 阅读 · 0 评论 -
linux进程——守护进程
信号概述Linux 中的信号是一种消息处理机制,它本质上是一个整数,不同的信号对应不同的值,由于信号的结构简单所以天生不能携带很大的信息量,但是信号在系统中的优先级是非常高的。在 Linux 中的很多常规操作中都会有相关的信号产生,先从我们最熟悉的场景说起:通过键盘操作产生了信号:用户按下 Ctrl-C,这个键盘输入产生一个硬件中断,使用这个快捷键会产生信号,这个信号会杀死对应的某个进程通过shell命令产生了信号:通过 kill 命令终止某一个进程,kill -9 进程PID通过函数调用产生.转载 2022-03-30 17:27:41 · 2699 阅读 · 0 评论 -
Linux多线程高并发网络通信服务器与客户端实现
学习本节内容需要掌握网络socket编程基础,多线程编程基础。下面来看在没有多线程情况下,使用单线程实现socket编程的步骤:1、单线程服务器端单线程实现网络通信服务器代码实现:服务器端实现流程:1、socket创建socket套接字文件描述符2、bind绑定ip地址和端口号3、listen监听是否有客户端与服务器端连接4、accept并且等待客户端连接5、read/recv、write/send与客户端通信6、close关闭套接字文件描述符#include <stdio.h&原创 2022-03-29 10:10:52 · 1920 阅读 · 0 评论 -
Linux进程间通信—共享内存
共享内存不同于内存映射区,它不属于任何进程,并且不受进程生命周期的影响。通过调用 Linux 提供的系统函数就可得到这块共享内存。使用之前需要让进程和共享内存进行关联,得到共享内存的起始地址之后就可以直接进行读写操作了,进程也可以和这块共享内存解除关联,解除关联之后就不能操作这块共享内存了。在所有进程间通信的方式中共享内存的效率是最高的。共享内存操作默认不阻塞,如果多个进程同时读写共享内存,可能出现数据混乱,共享内存需要借助其他机制来保证进程间的数据同步,比如:信号量,共享内存内部没有提供这种机制。1转载 2022-03-29 04:00:00 · 1904 阅读 · 0 评论 -
Linux进程间通信—内存映射
1. 创建内存映射区如果想要实现进程间通信,可以通过函数创建一块内存映射区,和管道不同的是管道对应的内存空间在内核中,而内存映射区对应的内存空间在进程的用户区(用于加载动态库的那个区域),也就是说进程间通信使用的内存映射区不是一块,而是在每个进程内部都有一块。由于每个进程的地址空间是独立的,各个进程之间也不能直接访问对方的内存映射区,需要通信的进程需要将各自的内存映射区和同一个磁盘文件进行映射,这样进程之间就可以通过磁盘文件这个唯一的桥梁完成数据的交互了。如上图所示:磁盘文件数据可以完全加载到进程的转载 2022-03-28 03:45:00 · 636 阅读 · 0 评论 -
Linux进程间通信—管道
1. 管道管道的是进程间通信(IPC - InterProcess Communication)的一种方式,管道的本质其实就是内核中的一块内存 (或者叫内核缓冲区),这块缓冲区中的数据存储在一个环形队列中,因为管道在内核里边,因此我们不能直接对其进行任何操作。因为管道数据是通过队列来维护的,我们先来分析一个管道中数据的特点:管道对应的内核缓冲区大小是固定的,默认为 4k(也就是队列最大能存储 4k 数据)管道分为两部分:读端和写端(队列的两端),数据从写端进入管道,从读端流出管道。管道中的数据只转载 2022-03-27 03:45:00 · 970 阅读 · 1 评论 -
Linux进程控制(详解)
内容来自:爱编程的大丙1. 进程概述从严格意义上来讲,程序和进程是两个不同的概念,他们的状态,占用的系统资源都是不同的。程序:就是磁盘上的可执行文件, 并且只占用磁盘上的空间,是一个静态的概念。进程:被执行之后的程序叫做进程,不占用磁盘空间,需要消耗系统的内存,CPU资源,每个运行的进程的都对应一个属于自己的虚拟地址空间,这是一个动态的概念。1.1 并行和并发CPU时间片CPU在某个时间点只能处理一个任务,但是操作系统都支持多任务的,那么在计算机CPU只有一个和的情况下是怎么完成多任务处理的呢转载 2022-03-26 03:30:00 · 4992 阅读 · 1 评论 -
Linux文件描述符复制与重定向
在 Linux 中只要调用 open() 函数就可以给被操作的文件分配一个文件描述符,除了使用这种方式 Linux 系统还提供了一些其他的 API 用于文件描述符的分配,相关函数有三个:dup, dup2, fcntl。转载 2022-03-25 03:15:00 · 3107 阅读 · 0 评论 -
Linux虚拟地址空间与文件描述符
本文主要介绍linux操作系统中的虚拟地址空间和文件描述符,通过图解的形式形象解释了其内容。转载 2022-03-24 03:00:00 · 628 阅读 · 0 评论 -
Makefile详解及使用
Makefile简介linux环境下,当用户编译文件过多的时候,使用makefile可以帮助模块化编译文件,makefile是一个脚本文件,根据规则,来执行相应的脚本文件,实现自动化编译。转载 2022-03-23 16:42:12 · 13760 阅读 · 3 评论 -
迅为嵌入式linux驱动开发笔记(十一)—触摸屏驱动
驱动开发综合例程实验原创 2022-03-12 10:19:56 · 424 阅读 · 0 评论 -
迅为嵌入式linux驱动开发笔记(十)—IIC驱动实验
一、IIC简介IIC介绍参照二、应用层实现IIC应用层操作 I2C 是以数据包进行交流的,所有我们在应 用层就要进行封包的操作。 数据包对应的结构体是 i 2c_rdwr_ioctl_data , 这个结构体定义在 i nclude\uapi\linux\i2c-dev.h 下面:定义如下:/* This is the structure as used in the I2C_RDWR ioctl call */ struct i2c_rdwr_ioctl_data { struct i2c原创 2022-03-11 08:28:54 · 1367 阅读 · 1 评论 -
迅为嵌入式linux驱动开发笔记(九)—输入子系统
一、什么是输入子系统输入子系统是 Linux 专门做的一套框架来处理输入事件的,像鼠标,键盘,触摸屏这些都是输入设备。 但是这些输入设备的类型又都不是一样的,所以为了统一这些输入设备驱动标准应运而生的。统一了以后,在节点 /dev/input 下面则是我们输入设备的节点,如下图所示:这些节点对应的则是我们当前系统的输入设备 , 我们要怎么查看当前系统都有哪些输入设 备呢?我们可以使用命令来查看:cat /proc/bus/input/devices那么我们要怎么确定哪个设备对应哪个节点呢?这里原创 2022-03-10 10:55:57 · 1390 阅读 · 0 评论 -
迅为嵌入式linux驱动开发笔记(四)—设备树
一 、什么是设备树? 设备树是一种描述硬件资源的数据结构。 它通过 bootloader 将硬件资源传给内核, 使得内核和硬件资源描述相对独立。二、设备树的基本概念 1、为什么叫设备树呢? 因为他的语法结构像树一样,所以管它叫设备树。...原创 2022-03-09 20:28:05 · 1084 阅读 · 0 评论 -
迅为嵌入式linux驱动开发笔记(八)—内核定时器
内核定时器二. Linux 内核定时器基础知识Linux 内 核 使 用 timer_list 结 构 体 表 示 内 核 定 时 器 ,timer_list 定 义 在 文 件 include/linux/timer.h 中,定义如下:struct timer_list { struct list_head entry; unsigned long expires; /* 定时器超时时间,不是时长,单位是节拍数 */ struct tvec_base *base; void原创 2022-03-09 20:20:47 · 1065 阅读 · 0 评论 -
迅为嵌入式linux驱动开发笔记(七)—等待&工作队列
等待队列二.等待队列基础知识当我们进程去访问设备的时候,经常需要等待有特定事件发生以后在继续往下运行,这 个时候就需要在驱动里面实现当条件不满足的时候进程休眠,当条件满足的时候在由内核唤醒 进程。 那么等待队列就实现了在事件上的条件等待。<1> 等待队列头 等待队列头就是一个等待队列的头部, 每个访问设备的进程都是一个队列项, 当设备 不可用的时候就要将这些进程对应的等待队列项添加到等待队列里面。 等待队列头使用结构体 wait_queue_head_t 来表示,这个结构体定义在文件 in原创 2022-03-08 21:14:15 · 1302 阅读 · 0 评论 -
迅为嵌入式linux驱动开发笔记(五)—pinctl和gpio子系统
一、pinctl和gpio子系统pinctrl子系统设置引脚的复用关系和电气属性。2、Linux Pinctrl 子系统提供的功能是什么?( 1 ) 管理系统中所有的可以控制的 pin , 在系统初始化的时候,枚举所有可以控制的 pin , 并标识这些 pin 。( 2 ) 管理这些 pin 的复用( Multiplexing )。对于 SOC 而言,其引脚除了配置成普通 的 GPIO 之外,若干个引脚还可以组成一个 pin group,形成特定的功能。( 3 ) 配置这些 pin 的特性。例如原创 2022-03-05 14:08:32 · 2600 阅读 · 0 评论 -
迅为嵌入式linux驱动开发笔记(三)— 平台总线模型
一、平台总线模型介绍1、什么是平台总线模型?平台总线模型也叫 platform 总线模型。 是 Linux 内核虚拟出来的一条总线,不是真实的导线。平台总线模型就是把原来的驱动 C 文件给分成了俩个 C 文件,一个是 device.c , 一个是 driver.c 把稳定不变的放在 driver.c 里面,需要变得就放在了 device.c 里面。把共性的放在dirver.c,变的存放在device.c中。2、为什么会有平台总线模型?( 1 ) 可以提高代码的重用性( 2 ) 减少重复性代码。原创 2022-03-04 08:28:01 · 1014 阅读 · 0 评论 -
迅为嵌入式linux驱动开发笔记(二)—地址映射与字符设备
一、linux物理地址到虚拟地址的映射linux不能直接对物理地址进行操作,如果需要操作硬件,需要先把物理地址转成虚拟地址,因为linux使能了MMU,所以不能直接操作物理地址。1、使能MMU有什么好处?(1)让虚拟地址成了可能(2)可以让系统更加安全,有了MMU,上层应用看到的内存都是虚拟内存,应用就不能直接访问硬件,这样保证了系统安全。2、MMU非常复杂,如何完成物理地址到虚拟地址的转换呢?内核提供了相关的函数。在include/asm-generic 下的io.hioremap:把物理原创 2022-03-03 11:14:57 · 1157 阅读 · 0 评论