Linux
文章平均质量分 69
基尔霍夫原来是码农
学电气的渣渣码农
展开
-
Linux——进程调度
一.进程的分类:实时进程:与用户交互,需要快速响应普通进程:不需要及时响应二.上下文切换:上下文切换简单来说就是cpu在运行当前的进程的时候切换到另一个进程执行;这中间需要对前一个进程的有关信息进行保存,比如程序计数器、变量、寄存器的值等等保存到内核的栈中;例如CPU在执行P1进程的时候需要切换到P2进程,这时候保存P1的相关环境和参数,然后加载P2相关进程信息,让P2运行起来。三.调度算法调度算法是为了实现一个CPU执行多个进程1.先到限制性算法,短作业/进程调度算法1.1 FFCFS(原创 2021-08-16 20:30:50 · 126 阅读 · 0 评论 -
基于Linux的客户端与服务端的传输和信息交互
基于Linux的客户端与服务端的传输和信息交互,利用socket网络来构建服务端和客户端的网络请求,在服务端接收到客户端的连接请求的时候创建进程用于,服务端与多个客户端之间的连接,在头文件中穿件用于网络传输数据的结构体,其中包括具体的命令(cmd),传输文件时文件中的内容(context),以及用于判断在传输后是否需要创建文件的标志位;利用字符串处理函数来分解指令,获得具体指令,再根据指令的类型来选择需要执行的代码,实现服务端与客户端之间的文件传输和信息交互;头文件中包含宏定义各个指定,和数据传输过程中的原创 2021-08-06 20:06:52 · 1145 阅读 · 0 评论 -
基于翔云OCR实现的人脸识别
翔云ocr平台需要的信息使用post请求实现人脸识别:#include <stdio.h>#include <curl/curl.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#define tr原创 2021-08-02 21:58:12 · 338 阅读 · 0 评论 -
Linux——进程
#include<stdio.h>#include <sys/types.h>#include <unistd.h>int main(){ int data = 100; pid_t pid; pid_t retpid; pid = getpid(); printf("pid is %d\n",pid); retpid = fork();原创 2020-11-28 13:47:47 · 66 阅读 · 0 评论 -
Linux进程间通信(ipc)——管道
进程间通信(单机)无名管道(pipe)无名管道为半双工方式,只能存在于父子进程之间进行通信(父进程写时子进程只能读,子进程写时父进程只能读)#include<stdio.h>#include <unistd.h>#include<stdlib.h>#include<string.h>int main (){ int fd[2]; //创建读写数组,fd[0]为读端,fd[1]为写端原创 2020-11-28 15:23:04 · 125 阅读 · 0 评论 -
Linux进程间通信(ipc)——共享内存
共享内存:步骤1:创建/打开共享内存。步骤2:映射。步骤3:读写数据。步骤4:释放共享内存。步骤5:删除共享内存。创建和写入数据的进程:#include<stdio.h>#include<stdlib.h>#include <sys/ipc.h>#include <sys/shm.h>#include<string.h>#include <unistd.h>// int shmget(key_t k原创 2020-12-02 18:45:23 · 196 阅读 · 0 评论 -
Linux进程间通信(ipc)——信号
信号信号是软中断,为linux提供了一种异步处理方式。信号有三种处理方式:忽略、捕捉、默认。忽略信号:大多数信号采用忽略的方式,但是SIGKILL和SIGSTOP不能被忽略,因为他们向内核和超级用户提供进程中止和停止,如果被忽略,进程将无法管理。捕捉信号:需要告诉内核,用户希望处理某一种信号,就是写一个信号函数,当信号产生时,由内核调用用户自定义的函数。(相当于中断)默认信号:当产生默认信号,系统会自动执行。信号处理函数注册两种:初级:signal;高级:sigaction。信号处理发送函原创 2020-12-03 09:36:33 · 137 阅读 · 0 评论 -
Linux进程间通信(ipc)——信号量
信号量原创 2020-12-04 15:43:18 · 113 阅读 · 0 评论 -
Linux进程间通信(ipc)——消息队列
消息队列是全双工通信方式,双方可以同时读写数据,读写数据后,数据依然在队列中没有消失。进行通信的两个进程所用的消息队列代码基本一样。消息队列进项通信的进程1:#include<stdio.h>#include<stdlib.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include<string.h>//int msgget(key_原创 2020-12-04 15:44:00 · 229 阅读 · 0 评论 -
Linux套接字(socket)网络编程
tcp/udp对比:1.tcp面向于连接(如打电话要先拨号建立连接);udp是无连接,即发送数据之前不需要建立连接;2.tcp提供可靠地服务,也就是说,通过tcp连接传送数据,无差错,不丢失,不重复,且按序到达;udp尽最大努力交付,即不保证可靠交付;3.tcp面向字节流,实际上是tcp把数据看成一连串无结构的字节流;udp是面向报文的;4.每一条tcp连接只能是点到点的;udp支持一对一,一对多,多对一和多对多的交互通信;5.tcp首部开销20字节;udp的首部开销小,只有8个字节;6.tcp原创 2020-12-07 16:36:15 · 167 阅读 · 0 评论 -
静态库动态库
分文件编程:静态函数库和动态函数库之间的区别:静态库:程序执行之前就加入到目标程序中,优点:运行快,发布程序是已经在APP中,移植方便。缺点:程序太大。更新部署麻烦。被调用多次会有冗余。静态库生成:步骤:1.先生成.o文件。2.生成静态库文件gcc calcufuncs.c -c //会生成calcufuncs.o文件ar rcs libcalcufunc.a calcufuncs.o //会生成libcalcufunc.agcc -xxxx.c -c; //生成xxxx原创 2020-12-08 18:14:10 · 88 阅读 · 0 评论 -
ARM——IO口驱动
总线地址:CPU能够访问内存的范围。如32位的win7系统,内存条是8G,但是系统只能识别3.8G,装64位才能识别8G。32位能访问2的32次方4,294,967,296bit = 4194304kb =4096Mb = 4Gb。物理地址:又叫做硬件的实际地址或绝对地址。虚拟地址:逻辑地址(基于算法的地址,软件层面的地址)。当程序运行起来需要的内存超过物理地址大小,就会通过MMU把物理地址映射成虚拟地址来。芯片手册第六章:寄存器:GPFSEL0 GPIO Functio原创 2020-12-11 21:41:42 · 825 阅读 · 0 评论 -
ARM——交叉编译
交叉编译:编译:在一个平台上生成该平台可执行代码。交叉编译:在一个平台生成另一个平台上可执行的代码。(在windows中编写C51代码,并编译成可执行代码如***.hex)交叉编译什么情况使用:1.由于平台不允许或者不能够安装所需要的编译器。2.有时因为目的平台没有建立,没有操作系统,所以需要交叉编译。操作系统也是代码,需要编译。(平台运行需要bootloader和系统核心)。宿主机:编译和编译程序的平台,一般是基于X86的PC机,通常称为主机。目标机:用户开发的系统,通常为非X86主机,宿主原创 2020-12-12 09:39:00 · 1151 阅读 · 0 评论 -
Linux文件系统
文件系统:常规认知:根目录;文件系统是操作系统用于明确存储设备组织文件的方法,就是文件管理学系统,简称文件系统。文件系统的种类:FAT NTFS EXT1/2/3/4…Linux查看文件系统的命令:df -T。vfat:存放Boot( bootload kernel)(基于磁盘)ext4: 根目录(基于磁盘)tmpfs:临时文件系统/内存文件系统分区的概念:windows:(面向普通用户)C盘(存放系统位置)可以随意在C盘存放文件,D盘(用户随意操作)Linux: ( 按照功原创 2020-12-12 09:41:11 · 55 阅读 · 0 评论 -
测试驱动代码步骤
设备号:主设备号:用于区分不同种类的设备。次设备号:区分同一类型的多个设备。驱动链表:管理所有设备的驱动。**1.添加:**编写完驱动程序加载到内核。1.1设备号。1.2设备号。1.3设备驱动函数(操作寄存器来驱动IO口)**2.查找:**调用驱动程序,用户空间去open驱动插入链表的顺序由设备号检索。...原创 2020-12-12 10:17:10 · 499 阅读 · 0 评论 -
ARM——带wiringPi库的交叉编译
先交叉编译wiringPi库,编译出的库适合树莓派。通过 -I -L来指定。软链接:类似于windows的快捷方式。ln -s libwiringPi.so.2.50 libwiringPi.so //创建了libwiringPi.so 这个软链接ln -s 要被链接的文件 软链接文件名字。ln命令会保持每一处链接文件的同步性。软链接ln -s xxx ----- 只会在选定的位置上生成一个文件镜像,不会占用磁盘空间,硬链接ls原创 2020-12-12 21:09:43 · 110 阅读 · 0 评论 -
Linux线程
线程:一个进程在同一时刻制作一件事,有了多格控制线程之后,在程序设计时就可以把进程设计成同一时刻做不止一件事,每个线程各自处理独立的任务。进程有独立的地址空间,一个进程崩溃后在保护模式下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径,线程有自己的堆栈和局部变量,但是线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序比多线程的程序健壮,但是在进程切换时,耗费的资源较大,效率要差一些。...原创 2020-12-30 11:04:09 · 85 阅读 · 0 评论 -
linux文件编程
open:当文件打开成功时函数返回的是文件描述符,打开失败时返回的负数。int open(const char *pathname, int flags); //通常用于打开已存在的文件 int open(const char *pathname, int flags, mode_t mode); //通常用于未存在的文件,创建目标文件。mode_t mode表示为文件类型如0600为可读可写write写入成功时函数返回的是写入的字节数,fd为文件描述符,无类型指原创 2021-03-30 21:22:44 · 86 阅读 · 0 评论 -
标准C库打开创建文件读写
标准C库的fopen、fwrite、fread和open、write、read之间的区别:1.来源:fopen是ANSIC标准的C语言函数库,在不同的额系统中应该调用不同的内核api,返回的是一个指向文件结构的指针。open是UNIX系统调用函数(包括LINUX等),返回文件描述符。2.移植性:由于fopen是标准的C函数因此拥有良好的移植性,而open是UNIX系统调用,移植性有限。3.适用范围:open返回文件描述符,而文件描述符是UNIX系统下的一个重要概念,UNIX下的一切设备都是以文原创 2021-03-31 20:10:56 · 81 阅读 · 0 评论 -
exec族函数、system()函数和popen函数
exec族函数:exec族函数的作用:(1)一个父进程希望复制自己,使父子进程同时执行不同的代码段,如父进程等待客户端的服务请求。当这种请求到达时,父进程嗲用fork(),使子进程处理次请求,父进程则继续等待下一个服务请求到达。(2)一个进程要执行一个不同的程序。在这种情况下,子进程fork返回后立即调用exec。 int execl(const char *path, const char *arg, ...); int execlp(const char *file,原创 2021-04-02 16:27:07 · 387 阅读 · 0 评论 -
Linux——硬链接软链接
ln -s是为某一个文件在另外一个位置建立一个不同的链接;具体用法:硬链接 :ln 源文件 目标文件;该命令会在选定的位置上生成一个和源文件大小相同的文件;软链接:ln -s 源文件 目标文件;该命令只会在选定的位置上生成一个文件的镜像,不会占用磁盘空间;无论是硬链接还是软链接文件都保持同步变化;硬链接:硬链接通过索引节点来进行连接,在LInux文件系统中,保存在磁盘分区的文件不管是什么类型都会为期分配一个编号,称为索引节点号。在Linux中,多个文件名指向同一索引节点是存在的,一原创 2021-06-27 15:45:42 · 68 阅读 · 0 评论 -
Linux——Makefile
Makefile的核心 ----规则:目标:依赖1 依赖2 …[TAB]命令当目标文件不存在或某个依赖文件比目标文件新时执行命令;原创 2021-07-03 15:31:09 · 146 阅读 · 0 评论 -
Linux——构建根文件系统
内核如何启动第一个程序:1.open(/dev/console);其中有两个sys_dup(0);2.run_init_process启动应用程序(命令行中的init = “xxx”)如果命令行中没有设置该命令,则按照以下顺序启动if (execute_command) { run_init_process(execute_command); printk(KERN_WARNING "Failed to execute %s. Attempting " "defaults...原创 2021-07-08 15:24:25 · 117 阅读 · 0 评论 -
Boot——自己编写简单的bootloader
bootlaoder目标:启动内核1.从FLASH上把内核读入内存;需要可以读写FLASH;初始化时钟,内存,其他;2.启动设置参数;跳转执行;最简单bootloader的编写步骤:1.初始化硬件:关看门狗(防止自动复位整个开发板);设置时钟,SDRAM,NAND FALSH;2.如果bootloader比较大需要将其重定位至SDRAM;3.把内核从NAND FLASH读到SDRAM中;4.设置需要传给内核的启动参数;5.跳转执行内核;假设是NOR启动:将代码直接从NOR FALSH原创 2021-07-11 15:26:06 · 1293 阅读 · 0 评论 -
Linux调试——gdb的使用
需要使用gdb进行调试的时候需要在编译.c文件的时候在gcc后面加上-g在调试的时候使用gdb ./可执行文件就可以对其进行调试输入l就可以打印程序的代码在终端上;设置断点输入b 行号 (break)让程序运行输入 r(run)使用print打印程序信息:让程序从当前位置向后执行输入c(continue)退出输入qgdb调试core文件可以直接定位到段错误的位置;配置.bashrc文件添加ulimit -c unlimited当运行程序出现段错误的时候就会在当前文件原创 2021-07-19 14:52:18 · 175 阅读 · 0 评论 -
linux驱动——块设备驱动
在字符设备发出读写请求的时候,实际上硬件IO就发生了,但是块设备不同,块设备利用一块系统内存作为缓冲区,当用户进程对设备请求能够满足用户的要求时,就返回请求的数据,如果不能就调用请求函数来进行实验IO操作,块设备是对慢速设备设计,防止消耗过多的CPU事件来等待。与字符设备根本的区别在于是否能够被随机访问(在访问设备的时候随意地从一个位置跳转到另一个位置); 简单来讲,块设备通过系统缓存进行读取,不直接和物理磁盘进行读取,他是将读写放入到队列中,优化之后再执行,而字符设备可以直接读取物理磁盘不经过系统缓存.原创 2021-07-19 18:58:16 · 204 阅读 · 0 评论 -
Linux——IO多路复用
对于监听和通信而言两者都有两个缓冲区,监听调用accept函数的时候会有读写缓冲区,通信调用read和write的时候也有读写缓冲区;在单线程的条件下是不能同时处理这三个函数的阻塞的,使用多路IO复用就可以同时检测若干个文件描述符;IO多路转接并发使用io多路复用时是委托内核检测服务端所有文件描述符(通信和监听两类),这个检测过程会导致进程/线程的阻塞,如果检测到已经就绪的文件描述符阻塞解除,并将这些已就绪的文件描述符传出;根据类型对传出的所有已经就绪的文件描述符进行判断,并做出不同的处理:监听的原创 2021-07-30 17:37:58 · 175 阅读 · 0 评论