自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(93)
  • 资源 (1)
  • 收藏
  • 关注

转载 C语言位操作

一、位操作符1、位与 &(1)注意:位与符号是一个&,两个&&是逻辑与。(2)真值表:1&0=0 1&1=1 0&0=0 0&1=0 (3)从真值表可以看出:位与操作的特点是,只有1和1位于结果为1,其余全是0.(4)位与和逻辑与的区别:位与时两个操作数是按照二进制位彼次对应位相与的,逻辑与是两个操作数作为整体来相与的。(举例:0xAA&0xF0=0xA0, 0xAA && 0xF0=1)2、位或 |

2021-06-15 13:45:22 745

原创 数据结构与算法 --- 双向链表

#include <stdio.h>#include <stdlib.h>#include <stdbool.h>typedef struct Node{ int data; struct Node *pNext; struct Node *pRior;} NODE, *PNODE;PNODE pHead;PNODE init_link(int data);bool crate_link(PNODE, int);void t

2021-05-31 21:36:52 179

原创 linux网络编程 --- socket实战(二)

common.h#include <stdio.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/types.h>#include <arpa/inet.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#define SERADDR "192.168.

2021-05-31 14:32:53 264

原创 linux网络编程 --- socket实战(一)

server.c#include <stdio.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/types.h>#include <arpa/inet.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#define SERADDR "192.168.

2021-05-31 13:21:01 262

转载 linux网络编程 --- socket编程接口介绍

一、什么是socket?二、 UNIX/Linux 中的 socket 是什么?三、套接字有哪些类型?socket有哪些类型?流格式套接字(SOCK_STREAM)数据报格式套接字(SOCK_DGRAM)四、socket() 函数五、bind() 函数**`sockaddr_in 结构体`****`in_addr 结构体`**为什么使用 sockaddr_in 而不使用 sockaddr六、connect() 函数七、listen() 函数八、accept() 函数一、什么是socket?socke.

2021-05-30 23:00:29 274

原创 linux网络编程 ---TCP/IP协议

一、TCP/IP分层模型这个网络模型究竟是干什么呢?简而言之就是进行数据封装的。我们平常使用的程序(或者说软件)一般都是通过应用层来访问网络的,程序产生的数据会一层一层地往下传输,直到最后的网络接口层,就通过网线发送到互联网上去了。数据每往下走一层,就会被这一层的协议增加一层包装,等到发送到互联网上时,已经比原始数据多了四层包装。整个数据封装的过程就像俄罗斯套娃。当另一台计算机接收到数据包时,会从网络接口层再一层一层往上传输,每传输一层就拆开一层包装,直到最后的应用层,就得到了最原始的数据

2021-05-30 22:11:25 254

原创 linux网络编程 --- 网络基础

一、网络通信概述二、网络通信的层次三、网络通信基础知识1四、网络通信基础知识21、 OSI 7层网络模型2、网卡3、集线器(HUB)4、交换机五、网络通信基础知识31、路由器2、DNS(Domain Name Service 域名服务)六、网络通信基础知识41、DHCP(dynamic host configuration protocl,动态主机配置协议)2、IP地址分类(IPv4)3、如何判断2个IP地址是否在同一子网内一、网络通信概述从进程间通信说起:网络域套接字socket,网络通信其实就是.

2021-05-30 17:07:54 85

原创 Linux线程 --- 信号量、互斥锁、条件变量

一、线程同步之信号量1、信号量相关操作函数二、线程同步之互斥锁1、什么是互斥锁2、用互斥锁来实现上节代码三、线程同步之条件变量1、什么是条件变量2、相关函数一、线程同步之信号量1、信号量相关操作函数 #include <semaphore.h> //信号量初始化 int sem_init(sem_t *sem, int pshared, unsigned int value); sem_destroy(&sem) // 销毁信号量.

2021-05-30 14:17:46 330

原创 Linux线程 --- 线程的引入

一、再论进程1、多进程实现同时读取键盘和鼠标2、分析优劣二、解决方案就是线程技术1、线程的引入2、线程常见函数3、使用线程技术同时读取键盘和鼠标4、pthread_cleanup_push 和 pthread_cleanup_pop一、再论进程1、多进程实现同时读取键盘和鼠标#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include.

2021-05-30 13:05:07 95 1

原创 高级IO --- 异步IO和存储映射IO

一、何为异步IO几乎可以认为:异步IO就是操作系统用软件实现的一套中断响应系统。异步IO的工作方法是:我们当前进程注册一个异步IO事件(使用signal注册一个信号SIGIO的处理函数),然后当前进程可以正常处理自己的事情,当异步事件发生后当前进程会收到一个SIGIO信号从而执行绑定的处理函数去处理这个异步事件。涉及的函数:(1)fcntl(F_GETFL、F_SETFL、O_ASYNC、F_SETOWN)(2)signal或者sigaction(SIGIO)代码案例#include

2021-05-30 00:01:07 175

原创 高级IO --- 并发式IO

一、IO多路复用原理1、何为IO多路复用?2、select函数介绍3、poll函数介绍一、IO多路复用原理1、何为IO多路复用?I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。实质: .

2021-05-29 23:48:24 88

转载 高级IO --- 阻塞与非阻塞IO

一、阻塞IO最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。常见的阻塞:wait、pause、sleep等函数;read或write某些文件时优点:内核好实现、没有降低CPU的效率,让CPU整体处理效率提高,适合一路IO也许有人会说,可以采用多线程+ 阻塞

2021-05-29 22:55:38 247

原创 (11)Linux中的信号

一、什么是信号?信号是内容受限的一种异步通信机制(1)信号的目的:用来通信(2)信号是异步的(对比硬件中断)(3)信号本质上是int型数字编号(事先定义好的)二、信号由谁发出使用kill -l产看linux信号列表(1)用户在终端按下按键(2)硬件异常后由操作系统内核发出信号(3)用户使用kill命令向其他进程发出信号(4)某种软件条件满足后也会发出信号,如alarm闹钟时间到会产生SIGALRM信号,向一个读端已经关闭的管道write时会产生SIGPIPE信号三、信号由谁处

2021-05-29 17:40:19 619

原创 (10)进程间的通信

一、linux的IPC机制1-管道管道(无名管道)(1)管道通信的原理:内核维护的一块内存,有读端和写端(管道是单向通信的)(2)管道通信的方法:父进程创建管理后fork子进程,子进程继承父进程的管道fd(3)管道通信的限制:只能在父子进程间通信、半双工(4)管道通信的函数:pipe、write、read、close有名管道(fifo)(1)有名管道的原理:实质也是内核维护的一块内存,表现形式为一个有名字的文件(2)有名管道的使用方法:固定一个文件名,2个进程分别使用mkfifo创建f

2021-05-28 15:57:48 99

原创 (9)让程序不能被多次运行

问题(1)因为守护进程是长时间运行而不退出,因此./a.out执行一次就有一个进程,执行多次就有多个进程。(2)这样并不是我们想要的。我们守护进程一般都是服务器,服务器程序只要运行一个就够了,多次同时运行并没有意义甚至会带来错误。(3)因此我们希望我们的程序具有一个单例运行的功能。意思就是说当我们./a.out去运行程序时,如果当前还没有这个程序的进程运行则运行之,如果之前已经有一个这个程序的进程在运行则本次运行直接退出(提示程序已经在运行)。实现方法:(1)最常用的一种方法就是:用一个文件

2021-05-28 10:41:48 251

原创 (8)守护进程之syslog

一、使用syslog来记录调试信息1、函数原型 #include <syslog.h> void openlog(const char *ident, int option, int facility); void syslog(int priority, const char *format, ...); void closelog(void);2、作用(1) openlog() 为程序打开到系统记录器的连接.(2) sys

2021-05-28 10:38:13 238

原创 (7)进程关系和守护进程

一、 进程关系1、进程组1.每个进程都会有一个进程组,进程组是多个进程的集合,多个进程组组成一个会话。查看进程组的id,其中每个进程组都有一个组长,进程组的id就是该进程组长的id号。该进程组是否存在取决于进程组中是否有进程,与进程组长是否结束无关。 #include <sys/types.h> #include <unistd.h> int setpgid(pid_t pid, pid_t pgid); pid_

2021-05-28 00:17:11 213

原创 (6)进程状态和system函数

进程的5种状态(1)就绪态。这个进程当前所有运行条件就绪,只要得到了CPU时间就能直接运行。(2)运行态。就绪态时得到了CPU就进入运行态开始运行。(3)僵尸态。进程已经结束但是父进程还没来得及回收。(4)等待态(浅度睡眠&深度睡眠),进程在等待某种条件,条件成熟后可进入就绪态。等待态下就算你给他CPU调度进程也无法执行。浅度睡眠等待时进程可以被(信号)唤醒,而深度睡眠等待时不能被唤醒只能等待的条件到了才能结束睡眠状态。(5)暂停态。暂停并不是进程的终止,只是被被人(信号)暂停了,还可以

2021-05-27 22:52:06 164

原创 (5)exec函数详解

一、为什么需要exec函数(1)fork子进程是为了执行新程序(fork创建了子进程后,子进程和父进程同时被OS调度执行,因此子进程可以单独的执行一个程序,这个程序宏观上将会和父进程程序同时进行)(2)可以直接在子进程的if中写入新程序的代码。这样可以,但是不够灵活,因为我们只能把子进程程序的源代码贴过来执行(必须知道源代码,而且源代码太长了也不好控制),譬如说我们希望子进程来执行ls -la 命令就不行了(没有源代码,只有编译好的可执行程序)(3)使用exec族运行新的可执行程序(exec

2021-05-27 17:46:56 6812

转载 (4)wait&&waitpid函数详解

一、父进程wait回收子进程1、wait的工作原理(1)子进程结束时,系统向其父进程发送SIGCHILD信号(2)父进程调用wait函数后阻塞(3)父进程被SIGCHILD信号唤醒然后去回收僵尸子进程(4)父子进程之间是异步的,SIGCHILD信号机制就是为了解决父子进程之间的异步通信问题,让父进程可以及时的去回收僵尸子进程。(5)若父进程没有任何子进程则wait返回错误2、wait实战编程(1)wait的参数status。status用来返回子进程结束时的状态,父进程通过wait得到

2021-05-27 16:38:31 403

原创 (3)进程的诞生&消亡&僵尸&孤儿进程

一、 进程的诞生(1)进程0和进程1 进程0由内核构建 进程1由内核态fork创建(2)fork 用户态创建(3)vfork二、进程的消亡(1) 正常终止和异常终止(2) 进程在运行时需要消耗系统资源(内存、IO),进程终止时理应完全释放这些资源(如果进程消亡后仍然没有释放相应资源则这些资源就丢失了)(3) linux系统设计时规定:每一个进程退出时,操作系统会自动回收这个进程涉及到的所有的资源(譬如malloc申请的内容没有free时,当前进程结束时这个内存会被释放,譬如op

2021-05-23 16:50:53 107

原创 (2)父子进程对文件的操作

一、关于子进程二、父子进程对文件的操作1、子进程继承父进程中打开的文件2、父子进程各自独立打开同一文件实现共享总结一、关于子进程(1)子进程和父进程的关系(2)子进程有自己独立的PCB(3)子进程被内核同等调度二、父子进程对文件的操作1、子进程继承父进程中打开的文件(1) 上下文:父进程先open打开一个文件得到fd,然后在fork创建子进程。之后在父子进程中各自write向fd中写入内容(2) 测试结论是:接续写。实际上本质原因是父子进程之间的fd对应的文件指针是彼此关联的(很像O.

2021-05-23 16:36:56 1383

原创 (1)进程的基础概念

一、程序的开始与结束1、main函数由谁调用(1)编译链接时的引导代码。操作系统下的应用程序其实在main执行前也需要先执行一段引导代码才能去执行main,我们写应用程序时不用考虑引导代码的问题,编译链接时(准确说是链接时)由链接器将编译器中事先准备好的引导代码给连接进去和我们的应用程序一起构成最终的可执行程序。补充: linux源文件生成可执行文件的过程(2)运行时的加载器。加载器是操作系统中的程序,当我们去执行一个程序时(譬如./a.out,譬如代码中用exec族函数来运行)加载器负

2021-05-23 16:21:28 102

原创 arm裸机【14】 --- 时钟系统 (2)

一、各时钟典型值(默认值,iROM中设置的值)(1)当210刚上电时,默认是外部晶振+内部时钟发生器产生的24MHz频率的时钟直接给ARMCLK的,这时系统的主频就是24MHz,运行非常慢。(2)iROM代码执行时第6步中初始化了时钟系统,这时给了系统一个默认推荐运行频率。这个时钟频率是三星推荐的210工作性能和稳定性最佳的频率。(3)各时钟的典型值:? freq(ARMCLK) = 1000 MHz? freq(HCLK_MSYS) = 200 MHz? freq(HCLK_IME

2021-05-20 12:53:05 195

原创 arm裸机【13】 --- 时钟系统 (1)

一、 SoC时钟系统简介1、什么是时钟?SoC为什么需要时钟?(1) 时钟是同步工作系统的同步节拍(2) SoC内部有很多器件,譬如CPU、串口、DRAM控制其、GPIO等内部外设,这些东西要彼此协同工作,需要一个同步的时钟来指挥。这个就是时钟系统。2、时钟一般如何获得?(1)SoC的时钟获得一般有:** 外部直接输入时钟信号,SoC有个引脚用来输入外部时钟信号,用的很少。** 外部晶振+内部时钟发生器产生时钟,大部分低频单片机都是这么工作的。** 外部晶振+内部时钟发生器+内部PLL

2021-05-20 12:45:51 257 3

原创 arm裸机【12】 --- SDRAM

SDRAM引入SDRAM:Syncronized Dynamic Ramdam Access Memory,同步动态随机存储器DDR:DDR就是DDR SDRAM,是SDRAM的升级版。(DDR:double rate,双倍速度的SDRAM)DDR有好多代:DDR1 DDR2 DDR3 DDR4 LPDDRSDRAM的特性(容量大、价格低、掉电易失性、随机读写、总线式访问)SDRAM/DDR都属于动态内存(相对于静态内存SRAM),都需要先运行一段初始化代码来初始化才能使用不像SRAM开

2021-05-19 20:48:01 327

转载 arm裸机【11】 --- 重定位实战(2)

adr与ldr伪指令的区别ldr和adr都是伪指令,区别是ldr是长加载、adr是短加载。重点:adr指令加载符号地址,加载的是运行时地址;ldr指令在加载符号地址时,加载的是链接地址。深入分析:只要知道adr和ldr分别用于加载运行地址和链接地址,从而可以判断是否需要重定位即可;根本不需知道为什么adr和ldr是这样子,但是我们还是给大家扩展讲下为什么adr和ldr可以加载不同的地址。1、重定位重定位就是汇编代码中的copy_loop函数,代码的作用是使用循环结构来逐句复制代码到链

2021-05-19 17:56:15 103

原创 arm裸机【10】 --- 重定位实战(1)

任务思路任务在SRAM中将代码从0xd0020010重定位到0xd0024000任务解释:本来代码是运行在 0xd0020010的,因为一些原因我们又希望代码实际运行在 0xd0024000 。这时候就需要重定位了。注解:本练习对代码本身运行无实际意义,通过这个去熟悉重定位这个技能。但某些情况重定位是必须的,譬如在uboot中。思路1. 通过链接脚本将代码链接到0xd00240002. dnw下载时,将bin文件下载到0xd0020010第1点 + 第2点,就保证了:代码实际下载运行.

2021-05-19 16:50:21 238

原创 arm裸机【9】 --- 重定位引入和链接脚本2

运行时地址由什么决定?链接地址由什么决定?从源码到可执行程序的步骤:预编译、编译、链接、strip程序段的概念:代码段、数据段、bss段(ZI段)、自定义段链接脚本究竟要做什么?运行时地址由什么决定?运行时的地址是由运行时决定的(编译链接时是无法绝对确定运行时地址的)链接地址由什么决定?链接地址是由程序员在编译链接的过程中,通过Makefile中-Ttext xxx或者在链接脚本中指定的。程序员事先会预知自己的程序的执行要求,并且有一个期望的执行地址,并且会用这个地址来做链接地址。举例:.

2021-05-18 23:41:18 143

原创 arm裸机【8】 --- 重定位引入和链接脚本1

一个事实:大部分指令是位置有关编码位置无关编码(PIC: position independent code):汇编源文件被编码成二进制可执行程序时编码方式与位置(内存地址)无关。位置有关编码: 汇编源文件被编码成二进制可执行程序时编码方式与位置有关我们在设计一个程序时,会给这个程序指定一个运行地址(链接地址)。就是说我们在编译程序时其实心里是知道我们程序将来被运行时的地址(运行地址)的,而且必须给编译器链接器指定这个地址(链接地址)才行。最后得到的二进制程序理论上是和你指定的运行地址有关的,将

2021-05-18 22:12:12 143

原创 arm裸机【7】 --- 汇编写启动代码之开ICache

什么是ICache? 有什么用?cache 是一种内存,叫高速缓冲区从容量来说:CPU < 寄存器 < cache < DDR从速度来说:CPU > 寄存器 > cache > DDRcache的存在,是因为寄存器和ddr之间速度差异太大,ddt的速度远不能满足寄存器的需要(不能满足CPU的需要,所以没有cache会拉低整个系统的整体速度)整个系统中cpu的供应链由:寄存器+cache+DDR+硬盘/flash四阶组成,这是综合考虑了性能、成本后得到的妥协的结

2021-05-18 12:49:19 300

转载 arm裸机【6】 --- 看门狗和汇编调用C语言

1、汇编写启动代码之关看门狗1.1 什么是看门狗?1.2 分析硬件物理特性、原理图、数据手册1.3 找到关键性操作SFR(特殊功能寄存器)1.4 编写汇编代码1.5 总结210中看门狗特性(iROM中已经关看门狗)2、 汇编写启动代码之设置栈和调用C语言12.1 C语言运行时需要和栈的意义2.2 CPU模式和各种模式下的栈2.3 查阅文档并设置栈指针至合法位置2.4 汇编程序和C程序互相调用3、 汇编写启动代码之设置栈和调用C语言2C函数的编写和被汇编调用使用C语言来访问寄存器的语法神奇的volatile.

2021-05-17 00:28:53 345

原创 arm裸机【5】 --- 反汇编介绍

1、反汇编工具objdump的使用简介反汇编的原理&为什么要反汇编反汇编文件的格式和看法2、初识指令地址3、展望:反汇编工具帮助我们分析链接脚本1、反汇编工具objdump的使用简介反汇编的原理&为什么要反汇编arm-linux-objdump -D led.elf > led_elf.dis objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf格式的可执行程序反过来得到汇编源代码 -D表示反汇编 > 左边的是elf的可执行程序(反汇编时的原材料),.

2021-05-17 00:28:18 543

原创 arm裸机【4】 --- 一步步点亮LED(二)

1、使用位运算实现复杂点亮要求问题提出:如何只点亮中间1颗(两边是熄灭的)LED通过位运算点灯2、汇编编写延时函数并实现LED闪烁效果1、使用位运算实现复杂点亮要求用宏定义来定义寄存器名字,再来操作。用 b . 来实现死循环用.global把_start链接属性改为外部,消除链接时的警告问题提出:如何只点亮中间1颗(两边是熄灭的)LED分析:程序其实就是写了GPJ0CON和GPJ0DAT这2个寄存器而已,功能更改也要从这里下手。GPJ0CON寄存器不需要修改,GPJ0DAT中设置相.

2021-05-16 22:38:47 121

原创 arm裸机【4】 --- 一步步点亮LED(一)

1、 一步步点亮LED1_硬件工作原理及原理图查阅查阅原理图,发现开发板上一共有5颗LED。其中一颗D26的接法是:正极接5V,负极接地。因此这颗LED只要上电就会常亮。因此我们分析这颗LED是电源指示灯。剩下4颗LED的接法是:正极接3.3V,负极接了SoC上的一个引脚(GPIO),具体详细接法是:D22:GPJ0_3D23:GPJ0_4D24:GPJ0_5D25:PWMTOUT1(GPD0_1)2、数据手册查阅及相关寄存器浏览GPIO概念的引入GPIO:general purp

2021-05-16 22:24:49 448 3

转载 arm裸机【3】 --- 安装交叉编译工具链 , Makefile , mkv210_image.c文件详解

安装交叉编译工具链1.linux中装软件的特点linux中安装软件比windows中复杂。linux中安装软件一般有以下几种方法:第一种:在线安装。譬如ubuntu中使用apt-get install vim来安装vim软件。第二种:自己下载安装包来安装。这种方式的缺陷就是你不知道你下载的安装包和你的系统是否匹配。第三种:最装逼的一种方式,就是源代码安装。我们安装交叉编译工具链(arm-linux-gcc)实际采用第二种安装方式。2.交叉编译工具链的选择我们选择交叉编译工具链的原则:和我们所

2021-05-16 20:30:16 585

转载 arm裸机【2】 ---基于S5PV210的X210V3S开发板刷机教程

刷机前的准备工作先了解什么是刷系统刷系统就是利用刷机工具,向开发板中烧录预先编译好的系统镜像,使之在开发板上运行起来。使用串口输出的意义(叫系统控制台)串口是一种硬件通信口,很多年前的时候串口是CPU之间进行通信的主要接口。但是现在因为串口通信的速度很低,所以现在串口主要是用来做程序输出监控、调试。桌面电脑可以打开一个虚拟控制台,嵌入式系统一般是用串口来做控制台的。一般是用一根串口线连接开发板的串口和我们笔记本电脑的串口,然后在电脑上打开一个串口监视,这样开发板上的串口输出内容就可以在电脑上看到。

2021-05-16 19:39:13 314

原创 arm裸机【1】 --- ARM的汇编指令

两个概念:指令与伪指令指令是CPU机器指令的助记符,经过编译后会得到一串1010…组成的机器码,可以由CPU读取执行。伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。’(指令可以类比为米,编译过程就是相当于煮饭的过程,最后生成的饭就是相当于1010的机器码,让CPU读取,而伪指令就相当于煮饭用的锅,只参与煮饭(编译过程),最终锅是不会成为米饭的)一.ARM汇编的特点ARM汇编特点1:LDR/STR架构ARM.

2021-05-16 19:21:27 658 5

原创 linux基础入门(2) --- 进阶指令

1.1、find1.2、grep1.3、which和whereis1.5、开机和关机1.6、tree/lstree1.7、mount/umount1.8、磁盘空间相关1.9、用户管理1.10、权限管理1.11、文件打包压缩与解压缩1.12、sed和awk1.13、格式化文件系统1.14、网络配置命令1.1、find功能:在linux文件系统中,用来查找一个文件放在哪里了。举例:find /etc -name "interfaces"总结:(1)什么时候用find? 当你知道你要找的文件名,但是.

2021-05-16 17:10:39 77

原创 linux基础入门(1) --- 常用指令

1.0 ls(list,列表)作用:使用列表把当前文件夹下所有文件显示出来 ls -a 显示所有文件,包括隐藏文件 ls -l 以详细信息显示 ls -a -l ls -l -a ls -la ls -al 四种方式都是可以的1.1 cd(change directory,更改目录)作用:用来切换目录涉及到相对路径和绝对路径 cd .. ..代表上一层目录 .代表当前目录1.2 pwd(print work directory,打印工作目录)作用:打印出当前的绝对

2021-05-16 17:01:43 67

mosquitto_study.zip

搭建MQTT服务器

2021-05-30

空空如也

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

TA关注的人

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