Liunx系统编程篇
文章平均质量分 75
Liunx系统编程学习笔记
阿波罗啦啦啦啦
粮厂嵌入式工程师 Android底层音视频开发 曲折中上升,实践中领悟
展开
-
Linux系统编程篇—开源压缩包的使用流程(libcurl库为例)
一、libcurl库简介libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。二、下载库下载https://github.com/curl/curl/releases/tag/curl-7_71_1三、解压tar xvf curl-7.71.原创 2021-04-30 13:37:13 · 525 阅读 · 0 评论 -
Linux系统编程篇—系统调用(ARM嵌入式)
一、系统调用的实现框图二、系统调用的实现细节原创 2021-04-20 14:34:21 · 365 阅读 · 0 评论 -
Linux系统编程篇—文件IO(文件来源、文件访问)
一、文件的来源1、磁盘、Flash、SD卡、U盘这些来源是真实存在的文件,以FAT32,EXT4,…等格式保存在某个设备上(如/dev/sda1),要使用mount指令挂载才能使用。df -T//文件系统类型在Type列输出。只可以查看已经挂载的分区和文件系统类型。2、Linux内核提供的虚拟文件系统,使用时也需要mount指令挂载才能使用。3、特殊文件:/dev/下的文件,这些文件是一些设备结点,我们通过open、write操作它们时,通过驱动操作的是硬件。主设备号用来确定哪一个驱动程原创 2021-04-19 20:39:28 · 1015 阅读 · 0 评论 -
Linux系统编程篇—Makefile的使用
一、Makefile的功能高效地编译程序在我们使用KEIL、Visual Studio编译程序时,会发现修改源文件或头文件,只需要重新编译牵涉到的文件,就可以重新生成可执行程序。Makefile就是一个可以帮你自动进行高效编译的脚本。一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操转载 2021-04-18 14:58:37 · 570 阅读 · 1 评论 -
Ubuntu18.04虚拟机搭建-VMware版本(自定义安装过程)(超详细、保姆教程)
准备工具:VMware软件、Ubuntu18.04系统1、创建虚拟机2、选择自定义安装3、下一步4、找到系统镜像地址5、下一步6、设定虚拟机名称、账号、密码7、设定虚拟机安装位置(注意:一定要选一个20GB以上的地方)8、设定处理器(一般电脑就按下面设置)9、设定虚拟机内存(一般电脑就按下面设置)10、设定网络连接类型(没有特殊需求,一般就按下面设置)11、设I/O控制器类型(没有特殊需求,一般就按下面设置)12、设磁盘类型(没有特殊需求,一般就按下面设置)13原创 2021-02-21 22:54:09 · 1213 阅读 · 1 评论 -
Linux系统编程篇—文件编程(一)打开及创建、写入、读取
文件编程概述打开与创建(open)使用open函数需要包含三个头文件:#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>三个open的API(函数):int open(const char *pathname,int flags);//pathname:指向文件路径的指针;flags:文件权限int open(const char *pathname,int flags,mode_t mo原创 2021-01-14 14:59:59 · 2915 阅读 · 0 评论 -
Linux系统编程篇—文件编程(二)光标移动(lseek)
需要包含两个头文件 #include <sys/types.h> #include <unistd.h>函数名 off_t lseek(int fd, off_t offset, int whence);fd:文件描述符offset:对于whence的偏移值,负数表示左,正数表示右,0表示原地whence:固定点的位置whence有三个固定宏:SEEK_SET:文件头SEEK_CUR:文件当前位置SEEK_END:文件尾巴原创 2021-01-15 14:25:52 · 523 阅读 · 0 评论 -
Linux系统编程篇—文件编程(三)文件操作原理(概念、步骤、静态文件与动态文件)
文件编程的一些概念文件描述符:1、文件描述符是文件的索引。对于内核而言,所有打开文件的操作==(write、read)都由文件描述符引用==。文件描述符是一个非负整数。当打开一个现存文件或者创建一个新文件时,内核向进程返回一个文件描述符。 fd_file1=open("./file1",O_RDWR);//此处fd_file1为文件描述符当读写一个文件时,用open和creat返回的文件描述符标识该文件,将其作为参数传递给read和write。write(fd_file1,buf,strle原创 2021-01-14 16:53:12 · 273 阅读 · 0 评论 -
Linux系统编程篇—文件编程(四)应用一(cp函数实现)
cp函数(copy)cp [原文件] [目标文件]cp demo1.c demo2.c功能:复制原文件[demo1.c],将新文件命名为demo2.c此处设demo1.c为原文件,demo2.c为目标文件总体思路1、打开原文件demo1.c2、读目标文件demo1.c到buf3、打开/创建demo2.c4、把buf的内容写入demo2.c4、关闭demo1.c和demo2.c实现过程一、设定main函数传入参数涉及知识点:argc和argv[]无论是操作系统中的很多命令,还原创 2021-01-15 20:40:50 · 739 阅读 · 0 评论 -
Linux系统编程篇—文件编程(五)应用二(修改配置文件)
修改config文件主要运用了前几讲文件基本的读取写入API,同时额外增加了一个==字符串搜索匹配API(strstr)==的使用。config文件config文件一般是软件中的配置文件,我们经常玩的许多有效都拥有其的配置文件,存放游戏数据的speed、leng等等参数。函数名:strstr包含文件:#include<string.h>函数原型:char *strstr(char *str1, const char *str2);语法:* strstr(str1,str2)原创 2021-01-18 15:53:09 · 220 阅读 · 0 评论 -
Linux系统编程篇—进程(一)五个基本问题
五个基本问题Q1:什么是程序,什么是进程,区别在哪里?程序:程序是描述在运行时如何创建一个进程。程序是存储在硬盘的可执行文件,其用来描述创建进程的相关信息。进程:进程是正在运行的程序实例。进程是运行的程序,其包含两个部分:处于用户空间的程序代码及变量与处于内核空间的进程状态信息(进程控制块)。Q2:如何查看系统中有哪些进程?一、ps指令显示全部进程ps -aux显示部分进程grep(文件查找)例:ps -aux|grep init//显示关于init的进程二、top指令(类原创 2021-01-18 16:44:35 · 207 阅读 · 0 评论 -
Linux系统编程篇—进程(二)进程的创建(fork)、子进程拷贝了父进程什么内容?、fork创建一个子进程的目的
函数名:forkfork,创建一个子进程包含文件:#include <unistd.h>函数原型: pid_t fork(void);返回值:返回两次PID成功,在父进程中返回子进程的PID(非负数),在子进程中返回0。失败,父进程中返回-1,没有创建子进程。实例:int main(){ int PID=0; int fork_r=0; PID=getpid(); printf("before fork原创 2021-01-18 21:28:55 · 496 阅读 · 0 评论 -
Linux系统编程篇—进程(三)fork与vfork的区别
vfork与fork都可以创建进程,但有两个区别关键区别一:vfork直接使用父进程存储空间,不拷贝。关键区别二:vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行。使用fork()创建进程int main(){ int cnt = 0; int fork_r=0; fork_r=fork(); if(fork_r!=0){ while(1){原创 2021-01-18 22:37:14 · 143 阅读 · 0 评论 -
Linux系统编程篇—进程(四)进程退出、子进程退出的收集、孤儿进程
退出的方式正常退出异常退出原创 2021-01-19 12:01:58 · 1329 阅读 · 0 评论 -
Linux系统编程篇—进程(五)exec族函数、exec族函数与fork函数的配合
exec族函数fork创建一个子进程的目的1、一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待客户端的服务请求。当这种请求到达时,父进程调用fork,使子进程处理此请求。父进程则继续等待下一个服务请求到达。2、一个进程要执行一个不同的程序。这对shell是常见的情况。在这种情况下,子进程从fork返回后立即调用exec。添加链接描述whereis lswhereis dateexec族函数与fork函数的配合...转载 2021-01-23 11:42:01 · 412 阅读 · 0 评论 -
Linux系统编程篇—进程(六)system函数、popen函数
添加链接描述popen函数原创 2021-01-23 21:41:23 · 228 阅读 · 0 评论 -
Liunx系统编程篇—进程通信(一)IPC引入
最基础的进程通信1、创建子进程,子进程退出,收集子进程状态2、使用execl族函数真正意义上的通信若是在单一机器上,则为单机通信多台机器上,为网络通信前五种为单机后两种为多机通信进程间五种通信方式...原创 2021-01-24 16:46:40 · 167 阅读 · 0 评论 -
Liunx系统编程篇—进程通信(二)无名管道(原理、创建、实战)命名管道(原理、创建、实战)
一、管道管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。1、特点:(1)它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。(2)它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。(3)它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。(4)管道中的数据被读走就没了...原创 2021-01-25 22:44:24 · 2630 阅读 · 0 评论 -
Liunx系统编程篇—进程通信(三)消息队列(原理、创建、实战)
消息队列消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。特点(1)消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级(链表存放的为结构体)。(2)消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除(管道是读完就消失),除非销毁队列。(3)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取(链表的特性),也可以按消息的类型读取。(4)没有固定的读端与写端,双方进程都可以原理创建了解了原理,我们则发现主要关原创 2021-01-26 20:02:41 · 567 阅读 · 0 评论 -
Liunx系统编程篇—进程通信(四)共享内存(原理、创建、实战)
消息队列信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。特点信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。支持信号量组。原理创建实例...原创 2021-01-26 22:08:43 · 852 阅读 · 0 评论 -
Liunx系统编程篇—进程通信(五)信号(一)(原理、概述、创建、实战)(kill、signal)
1原创 2021-01-28 22:38:09 · 288 阅读 · 0 评论 -
Liunx系统编程篇—进程通信(五)信号(二)(sigaction、sigqueue)
本文承接上文Liunx系统编程篇—进程通信(五)信号(一)(原理、概述、创建、实战)(kill、signal)上文对于信号的一些理论,本文就不再赘述。本文重点是讲解:sigaction、sigqueue两个函数,分别用于信号处理函数的注册、信号处理发送函数是signal和kill的升级版。常用API信号处理函数的注册入门版:函数signal高级版:函数sigaction信号处理发送函数1.入门版:kill2.高级版:sigqueue对于入门版的信号处理API的重点在于动作,但kill 函数原创 2021-01-29 23:06:20 · 484 阅读 · 0 评论 -
Liunx系统编程篇—进程通信(六)信号量(原理、特点、创建、实战)
信号量###信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。1、原理2、特点(1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。(2)信号量基于操作系统的== PV 操作==,程序对信号量的操作都是原子操作。(3)每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。(4)支持信号量组。注:PV操作是一种实现进程互斥与同步的有效方法。PV操作与信号量的原创 2021-01-30 15:24:25 · 357 阅读 · 0 评论 -
Liunx系统编程篇—多线程编程(一)进程与线程的区别、线程的优点、线程开发常用API
进程与线程的区别进程:进程是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述。进程才是程序(那些指令和数据)的真正运行实例。典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务。线程:线程是操作系统能够进行运算调度的最小单位。转载 2021-01-30 16:25:41 · 189 阅读 · 0 评论 -
Liunx系统编程篇—多线程编程(二)线程开发常用API(一)(关于线程操作)(共3种全)
线程开发常用API——关于线程操作包含的头文件#include <pthread.h>线程操作:线程操作包括3 种线程的创建,退出,等待。1、线程的创建函数原型int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);函数参数tidp:当pthread_create成功返回时原创 2021-01-30 20:07:43 · 194 阅读 · 0 评论 -
Liunx系统编程篇—多线程编程(二)线程开发常用API(二)(关于互斥锁)(共4种全)
互斥锁互斥量(mutex)是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁==(直白来说就是只有一个坑,排队上)==。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个(需要竞争)变为可运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去等待它重新变为可用。在这种方式下,每次只有一个线程可以向前运行。访问规则得制定好,不然会出现数据不原创 2021-01-30 22:27:29 · 137 阅读 · 0 评论 -
Liunx系统编程篇—多线程编程(三)(关于条件变量)常用API的使用
条件变量条件变量是的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为必须锁定互斥量以后才能计算条件。条件变量使用之前必须首先初始化pthread_cond_t数据类型代表的条件变量可以用两种方式进行初始化,静态初始化:pthread_cond_t cond = PTHREAD_COND_INITIALIZER可原创 2021-01-31 22:24:24 · 161 阅读 · 0 评论 -
Liunx系统编程篇—多线程编程(三)(关于互斥锁)互斥锁什么时候发生死锁?
互斥锁什么时候发生死锁?在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁,尽管死锁很少发生,但一旦发生就会造成应用的停止响应。注:死锁一般发生在程序存在2个锁以上的情况。实例:#include <stdio.h>#include <pthread.h>//int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *rest原创 2021-01-31 16:14:11 · 159 阅读 · 0 评论 -
Liunx系统编程篇—网络编程(一)为什么需要学习网络编程?计算机网络的分层
1、为什么需要学习网络编程?前面对于进程间通信我们讲了:管道、消息队列、共享内存、信号、信号量这5种通信方式都是依靠Liunx内核。这也造成了他们的一个缺点就是,这些通信方式只能在单机运行。那么如何实现多机通信呢?这就需要引入网络编程。那么网络有哪些呢?就从嵌入式出发,有Linux与Android、IOS、各种单片机,或者是Android对Android等等。网络编程中有两个主要的问题:1、如何准确地定位网络上一台或多台主机以及定位主机上的特定的应用?答:通过通信双方地址。地址由IP地址和端原创 2021-02-01 10:48:04 · 545 阅读 · 0 评论 -
Liunx系统编程篇—网络编程(二)Socket(套接字)网络编程、TCP/UDP、字节序(大端与小端)
Socket(套接字)Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。与管道类似的,Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。区别是管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递。在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。“IP地址+端口号”就对应一个soc原创 2021-02-01 11:45:32 · 495 阅读 · 0 评论 -
Liunx系统编程篇—网络编程(三)Socket编程步骤、常用API简析
Socket编程步骤常用API简析包含头文件#include<sys/types.h>#include<sys/socket.h>1、连接协议(socket)作用:用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源的函数原型:int socket(int domain,int type, int protocol);参数:domain:指明所使用的协议族/域。常用的domain类型有:AF_INET IPv4因特网域AF原创 2021-02-01 22:04:12 · 193 阅读 · 0 评论 -
Liunx系统编程篇—网络编程(五)项目实战(1)(FTP网盘项目)(类似百度云)
实现的功能利用socket,建立起服务端与客户端的对接;(服务端能支持多台客户端的同时连接)客户端1、客户端输入ls指令,能获取服务端上文件列表。2、客户端输入cd指令+路径,可以切换服务端的目录。3、在程序运行的过程中(不退出),客户端输入lls指令 能够查看自己的文件列表4、在程序运行的过程中(不退出),客户端输入lcd指令+路径 能够切换自己的目录。5、客户端输入get指令+文件名,能获取服务端上的某个文件(意思是将服务端的某个文件,下载到客户端)。6、客户端输入put指令+文件名,能原创 2021-02-28 14:50:32 · 617 阅读 · 0 评论 -
Liunx基础知识篇—嵌入式概述(什么是嵌入式?嵌入式芯片如何选型?什么是ARM?)
# 三个问题## 问题一:什么是嵌入式?## 问题二:嵌入式芯片如何选型?## 问题三:什么是ARM?原创 2021-01-27 11:35:57 · 2052 阅读 · 1 评论 -
Liunx树莓派(ARM)开发篇—第五章、Liunx库(1)分文件编程、函数库、动态库、静态库的概述与区别
一、分文件编程分文件编程就是将主函数与各模块函数分离成不同的.C文件,同时新建一个.h文件用于存放各模块函数的声明,在主函数中调用.h文件,使用格式为#include "abc.h"在函数编译时需要将主函数与模块函数一起编译,如下:编译:gcc jisuan.c suanfa.c注:<abc.c>与"abc.c"的区别:1.头文件#include <> :表示引用标准库头文件,编译器会从系统配置的库环境中去寻找2.头文件#include “”:一般表示用户自己定义使用的原创 2021-02-05 23:18:21 · 195 阅读 · 0 评论 -
Liunx树莓派(ARM)开发篇—第十二章、树莓派Linux源码目录树分析
Linux源码大约1.3w个C文件 1100w行代码,Linux是开源,免费,LInux开源社区工作者共同维护,同时Linux是一个开源的,支持多架构多平台代码,但是Linux内核编译出来一般就几M因为支持多平台,多架构,所以编译之前要配置,配置成适合的目标平台来用补充:有哪些架构?ARM(海思 友善之臂 RK 树莓派 nanoPi)、X86、PowerPC、MIPS下面就是Linux源码目录:**arch:**包含和硬件体系结构相关的代码,每种平台占一个相应的目录。和32位PC相关的代码存原创 2021-02-22 10:04:07 · 218 阅读 · 1 评论 -
Liunx树莓派(ARM)开发篇—第十三章、树莓派Linux源码配置步骤(超详细、图文结合)
一、为什么需要对liunx源码进行配置?嵌入式工程师有一个很重要也是工资很高的职位就是:驱动工程师,复制驱动代码的编写而驱动代码的编译需要一个提前编译好的内核编译内核就必须配置,配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核二、liunx源码配置的三种方法通常我们购买芯片,厂家会配linux内核源码,比如说买了树莓派,树莓派linux内核源码树莓派的内核源码下载地址==第一种方式:==使用 厂家.config进行配置查找厂家的.config指令:原创 2021-02-22 10:53:30 · 542 阅读 · 1 评论 -
Liunx树莓派(ARM)开发篇—第十五章、文件系统
1. 什么是文件系统?文件系统不是根目录文件系统是操作系统用于明确存储设备组织文件的方法。以上说的方法:就是文件管理系统(程序),简称文件系统2. 文件系统(文件管理系统的方法)的种类有哪些?有:FAT VFAT NTFS EXT1/2/3/4 HFS …树莓派查看文件系统的命令: df -T附:vfat : boot(bootloader, kernel)ext4 : 根目录tmpfs : 内存文件系统3. 什么是分区?windows:随意(面向普通用户PC),目录即分原创 2021-02-22 15:57:02 · 319 阅读 · 0 评论