【LinuxC高级】汇总

news2024/11/17 5:39:03

ls

ls -l:显示文件的详细信息

ls -a:显示隐藏文件

ls -lh:文件大小单位显示

ls -i:显示文件的inode号

 修改密码

passwd 用户名

su 用户名 -----> 用户名

su ----> 如果不加用户名,默认切换到超级用户

cd

cd 路径(可以是相对路径,也可以是绝对路径)

cd -----> 切换到当前用户的家目录

pwd 直接回显当前的绝对路径

新建文件/文件夹

touch 文件名 ----> 创建文件

touch 同名文件名 -----> 会更新时间戳

mkdir 目录名 ----> 创建目录名

mkdir 同名目录名 ----> 报错:文件已存在

cp/mv

cp 拷贝文件

cp 源文件的路径 目标文件的路径 (拷贝目录时需要再命令的后面加上 -r 选项)

mv 移动文件 (重命名)

mv 源文件的路径 目标文件的路径

rm

rm 文件名 ----> 删除文件

rmdir 目录名 -----> 删除空目录

rm -r 目录名 -----> 删除目录

 shell指令

1.用户、shell、内核、硬件之间的关系

用户在命令行提示符下键入命令文本,开始与Shell进行交互。

接着,Shell将用户的命令或按键转化成内核所能够理解的指令

控制操作系统做出响应,直到控制相关硬件设备。

然后,Shell将输出结果通过Shell提交给用户。

 文件相关的操作

head

head 文件名 -----> 回显文件的前十行内容到终端

head -n 文件名 -----> 回显文件的前n行内容

tail

tail 文件名 ------> 回显文件的后10行内容到终端

tail -n 文件名 ------> 回显文件的后n行内容

| 管道符

将前一个命令的输出结果作为后一个命令的输入

shell指令1 | shell指令2

wc(word count)

wc 文件名 ---> 回显文件行数、单词数、字符个数

wc -l 文件名 ---> 回显文件行数

wc -w 文件名 ---> 回显文件中单词的个数

wc -c 文件名 ---> 回显文件中字符的个数

通配符

通配符

含义

*

匹配一个或多个字符

?

匹配一个字符

[...]

匹配其中指定的一个字符

[-]

匹配指定一个字符范围

[^...]

除了其中指定的字符都可以

[[:lower:]]

匹配所有小写字母

[[:upper:]]

匹配所有大写字

 find

常用文件名来查找文件

find 指定路径 -name 文件名

用于模糊查找文件(当文件数量比较多时)

find 指定路径 -name *.c ---> 查找 指定路径下 所有的 .c 结尾文件

涉及*,存在转义问题,如果查找结果不对,就加上 \ -----> find 指定路径 -name \*.c

如果加上*导致报错,就直接使用

file *

file 文件名 ---> 显示文件的信息

file a.out

a.out: 文件名

ELF:类型

64-bit LSB shared object:小端存储

x86-64:64位操作系统

version 1 (SYSV):版本

dynamically linked, interpreter /lib64/l:动态链接的库

for GNU/Linux 3.2.0:gcc 编译器的版本 BuildID[sha1]=d0331b1eef2ecb7710b847e23849e40b98b323d9:动态ID

not stripped:文件没有被压缩,arm课程会讲到

grep

grep按照字符串查找内容

grep "要查找的字符串" 要查找的路径

-n:回显查找到字符串的行数

-R:查找的路径可以是目录,-R会进行递归查找

-i:不区分大小写的查找

-w:按单词查找关键字

查找以ubuntu开头的一行内容

grep "^ubuntu" /etc/passwd -n

查找hello.c中以;结尾的一行

grep ";$" hello.c

cut

cut -d "分隔符" -f "要截取的区域" 文件名

-d: 自定义分隔符,默认为制表符\t

-f: 与-d一起使用,指定截取哪个区域

grep root /etc/passwd -wn | cut -d ":" -f "1,8" ---> ("1,8" 截取第1个和第8个区域)

 压缩和解压缩

三种压缩工具:gz、bz2、xz

压缩: gzip 要压缩的文件名 ---> 自动生成.gz后缀的压缩文件

bzip2 要压缩的文件名 ---> 自动生成.bz2后缀的压缩文件

xz 要压缩的文件名 ---> 自动生成.xz后缀的压缩文件

特点:

1. 只能对单个的普通文件进行压缩

2. 不能进行归档,压缩后或解压后源文件都不存在

解压: 指定后缀的文件,需要用相同的压缩工具进行解压

gunzip 要解压的文件名

bunzip2 要解压的文件名

unxz 要解压的文件名

三种压缩工具的对比

压缩效率:xz > bz2 > gz

压缩时间:xz > bz2 > gz

gz用于临时的传输,xz用于文件的长期存储

打包并压缩和拆包解压

zip

压缩:

zip 命令用于将一个文件或多个文件压缩成单一的压缩文件 .zip

zip 压缩文件名 要压缩的文件列表

注意:

        a. 具有归档动能,并进行压缩

        b. 可以压缩文件夹,后缀 .zip,压缩文件夹需要加 -r

        c. 压缩或解压后源文件依然存在

解压:

unzip 要解压的压缩文件

tar

打包并压缩

选项:

-x:释放归档文件

-c:创建一个新的归档文件

-v:显示归档和释放的过程信息

-f:用户指定归档文件的文件名,否则使用默认名称 后跟文件名

tar -cvf 打包后生成的文件名.tar 要打包的文件列表

tar 指令已然依赖,压缩工具完成压缩:

-j:由 tar 生成归档,然后由 bzip2 压缩 .bz2

-z:由 tar 生成归档,然后由 gzip 压缩 .gz

-J:由 tar 生成归档,然后由 xz 压缩 .xz

tar -cvjf xxx.tar.bz2 要压缩的文件列表

tar -cvzf xxx.tar.gz 要压缩的文件列表

tar -cvJf xxx.tar.xz 要压缩的文件列表

拆包解压

如何拆包

tar -xvf 要拆包的文件

如何拆包并解压

仍然可以使用压缩工具的参数进行解压缩

tar -xvjf xx.tar.bz2

tar -xvzf xx.tar.gz

tar -xvJf xx.tar.xz

文件权限相关的操作

chgrp ----> 修改文件的所属组

 sudo chgrp 新的组名 文件名

chown ---> 修改文件的所属用户

sudo chown root xxx ---> 将xxx文件的所属用户改为root用户

sudo chown root: xxx ---> 将xxx文件的所属用户和所属组改为root用户

sudo chown :ubuntu xxx ---> 将xxx文件的所属组改为ubuntu

sudo chown ubuntu:root xxx ---> 将xxx文件的所属用户改为ubuntu,将xxx所属组改为root

链接文件的创建

硬链接文件

ln 被链接的文件(源文件) 生成的链接文件名(新文件)

(可以使用绝对路径,也可以使用相对路径)

硬链接文件的注意事项:

1. 硬链接文件和源文件拥有相同的inode号

2. 一个文件修改,另一个文件也会跟着发生修改

3. 删除源文件/链接文件,链接文件/源文件不受影响仍然存在,文件硬链接个数为0时才会被删除

4. 删除掉源文件后,即使创建一个和源文件同名的文件,也和硬链接文件之间不存在链接关系

5. 硬链接文件的文件类型是-,就是一个普通文件

6. 目录不能创佳绩硬链接

7. 和源文件是同一文件

 软链接文件

ln -s 被链接的文件(源文件) 生成链接的文件名(新文件)

软链接文件的注意事项:

1. 和源文件是两个不同的文件

2. 文件类型是l

3. 创建时一般使用绝对路径

4. 一个文件修改,另一个文件也会跟着发生修改

5. 如果源文件被删除,软链接文件会失效,在之前的位置创建一个同名的源文件软链接文件会重新生效

6. 在软链接文件失效的情况下,vim打开文件并保存退出,实际上是新创建了一份源文件保存并退出

7. 软链接文件可以链接目录

8. 拷贝目录的软链接可以拷贝,如果需要拷贝普通文件的软链接文件,需要加上 -d 选项保证链接属性依然存在

 用户相关的操作

 用户相关的配置文件

  1. /etc/passwd:存储用户的详细信息
  2. /etc/group:存储已有的用户组的信息
  3. /etc/shadow:存储用户密码

用户相关的指令

whoami ---> 查看当前用户

id -u ---> 查看当前用户的uid,选项后面不加用户名,默认查看当前登录用户的信息

id -u root ---> 查看指定的root用户的信息

id -g ---> 查看当前用户gid(组id)

id ---> 查看当前用户的信息

新建用户

sudo adduser 用户名 (新建用户必须使用sudo权限)

创建新用户时,会默认创建一个新用户同名的组并将新用户添加到该组中

sudo addgroup -g 组用户名 添加组用户(可以通过/etc/group查看组是否添加成功)

删除用户

sudo deluser 用户名 ---> 删除用户,但是不会删除用户的目录(残留目录可以直接使用rm -r 删除)

sudo userdel -r 用户名 ---> 删除用户的同时,删除用户的目录

sudo deluser --remove-home 用户名

开关机相关的操作

关机

sudo shutdown ---> 立即关机

sudo shutdown 时间 ---> 定时关机

sudo shutdown +10 ---> 在10分钟后关机

重启

sudo reboot ---> 立即重启

sudo shutdown -r ---> 立即重启

sudo shutdown -r 时间 ---> 定时重启

sudo shutdown -r +10 ---> 在10分钟后重启

磁盘相关的操作

查看U盘是否链接成功

ls /dev/sd*

如果终端回显包含除了ada外的其他内容,说明U盘链接并识别

所有sda开头的全部都是ubuntu镜像 自己的空间

对磁盘分区

查看磁盘使用率

df -h

如果U盘刚连入虚拟机,就可以使用df -h指令查找到,说明U盘被自动挂载

磁盘分区

需要使用到 fdisk 工具

sudo apt-get install fdisk (没有就下载软件)

sudo fdisk /dev/sdb ---> 要对整个磁盘进行分区

m:显示提示

p:打印已有的内存分区

n:新建分区

d:删除分区

q:不保存退出

w:写入磁盘并退出

格式化

格式化操作,一般是对具体分区的格式化

sudo mkfs.文件系统类型 分区名

sudo mkfs.ntfs /dev/sdb1

格式化错误:

说明分区已经被挂载(使用状态),需要取消挂载

sudo umount /dev/sdb1

挂载

sudo mount 要挂载的分区名 要挂载的目录

sudo umount 要取消挂载的分区

sudo umount 要取消的挂载点(挂载目录) ---->如果U盘是自动挂载到Linux中使用挂载点取消挂载有时会失效

sudo mount /dev/sdb1 /home/ubuntu/udisk

shell脚本

编程语言的分类

  1. 编译型语言:C、C++ 需要编译器
  2. 解释型语言:shell、python 需要解析器

操作系统架构

应用层:app、代码、shell命令

                    |                         |shell解析器

                C库                         |

                                 |

——————————————系统调用—————————————————————— 内核层:五大功能

        内存管理

        文件管理

        设备管理

        网络管理

        进程管理 ———————————————————————————————————————————— 硬件层:鼠标、键盘

shell ----> 贝壳

起到保护内核的作用,将内核和用户隔离开来

第一个shell脚本

#!/bin/bash ##说明使用的shell解析器

echo hello world #输出hello world

#在shell中表示注释

echo打印指令,将hello world输出

#! ------>用于指明该脚本默认使用的shell解析器

执行脚本的三种方式

bash 文件名

通过shell解析器,直接解析脚本,bash即是解析器

bash shell.sh

执行过程:

        在后台打开一个终端,在后台执行指令,将结果返回给当前终端

直接运行脚本

需要给脚本文件添加可执行文件

chmod 777 shell.sh         执行:./shell.sh

 source 脚本名

 不需要给脚本添加可执行权限

source 脚本名

执行过程:

        执行脚本和返回结果都在当前终端

shell中的变量

shell中的格式

变量名=变量的值

变量名='变量的值' ---> 用于变量的值中间有空格

变量名="变量的值" ---> 用于使用已有变量的值和空格拼接给新变量赋值时(只要需要用已有变量的值都建议加"")

HELLO=hello

WORLD="$HELLO world"

=两侧不能有空格

' '内不能使用$展开变量的值

 如何访问变量

$变量名 ---> 获取变量的值

${变量名} ---> 获取变量的值,为了更好区分变量名的范围

修饰变量的关键字

readonly :只读变量,只不能更改

unset :清空变量的值,不能清空

readonly修饰变量的值 local :定义局部变量,只能在函数中使用

 外部传参/位置变量

$0 ---> 执行的脚本名

$1-$9

$n ---> n >= 10,必须加上{}

${10}-${n}

$# ---> 获取所有外部参数的个数(不包括脚本名)

$* 或者 $@ ---> 获取所有的外部参数(不包含脚本名)

输出

echo 输出内容(将内容回显到终端,并自动换行)

echo默认不解析转义字符

echo -n 输出内容 ------>取消echo输出时的换行

echo -e "hello\n" ------->解析转义字符

输入

read 变量名 ---> 直接加变量名即可

read -p "提示信息" 变量名 ---> 在终端给用户输入提示信息

read -s 变量名 ---> 输入的信息不回显

read -t 秒数 变量名 ---> 如果用户n秒不输入,就结束输入并向后执行语句

read -n 个数 变量名 ---> 如果输入n个字符,输入自动停止

命令置换符

1. `指令` (反引号)

2. $(指令)

shell中的运算

(())

常用于shell中的整数算术运算

使用方法:

  1. (())几乎支持所有的C语言语法,还支持shell中幂运算**
  2. ((表达式1, 表达式2, 表达式2, ...)) 每个表达式都会执行,获取最右侧一个表达式的结果
  3. 想要获取运算结果,需要使用 $(()),还可以((变量名=表达式))
  4. 在(())中,使用变量,可以加$,也可以不加
  5. 在(())中,运算符两侧可以有空格

$[]

使用方法:

  1. 变量名=$[表达式1,表达式2,表达式3,·······]只获取最右侧表达式的结果
  2. 使用变量时,可以加$也可以不加$
  3. 运算符两侧可以加空格,也可以不加空格
  4. 仍然支持幂运算
  5. $[]的结果,建议直接按照"变量名=$[]"格式接收,因为$[]本质上,会遗留一个运算结果在表达式的位置,如果不接受继续向后运行指令会报错

expr

expr是一个终端指令

使用方法:

  1. expr 中使用变量,必须加$
  2. 如果想要接收expr的结果,必须使用命令置换符
  3. expr中运算符两侧必须有空格,不支持自增、自减和shell中幂运算
  4. expr中使用某些运算符是,需要转义|、>、
  5. expr指令的结果,可以直接回显到终端上,可以使用命令置换符接收
  6. expr操作数值不能为空

 let

 

使用方法:

  1. let运算时,运算符两侧一定不能有空格
  2. let 变量名=表达式 ---> let和变量名中一定要有空格
  3. let运算时,可以加$,也可以不加
  4. 如果直接写成 let 表达式,表达式会运行,但是没有办法接收

 shell中的数组

定义

c语言中的数组

int arr[32];

int arr[] = {};

int arr[3] = {1, 2, 3};

shell中的数组

数组名=(val1 val2 val3 ...)

# shell中的数组,不需要写出数组长度

# shell中的数组初始化时,直接使用()

# shell中的数组每个元素之间是空格,不是逗号

# 访问仍然需要通过下标,下标从0开始

采用键值对的方式赋值

数组名=([下标值]=val1 [下标值]=val2 ...)

arr=([9]=1 [0]=4 ...) 下标可以不连续

采用列表名的方式赋值

列表名="val1 val2 val3 ..."

数组名=($列表名)

通过分别定义数组变量的方式赋值

数组名[0]="val1"

数组名[1]="val2"

访问数组中的元素

只要在shell中需要使用变量的值,都需要用 $ 进行访问

${数组名[下标]} ---> 获取数组中指定下标的元素值

获取数组中所有元素

${数组名[*]} ---> 获取数组中的所有元素

${数组名[@]} ---> 获取数组中的所有元素

获取数组中元素的个数

${#数组名[*]} ---> 获取数组中元素的个数

${#数组名[下标]} ---> 获取数组中指定下标元素的长度(字符个数)

对数组元素重新赋值

数组名[下标]=新值

稀疏数组

使用已有的数组给新的数组赋值

arr=(1 2 3 4 5)

arr1=(a b c d)

arr2=(${arr[*]} ${arr1[*]}) # 拼接加空格

echo ${arr2[*]}

echo ${#arr2[*]} # 9

if分支结构

if对整数进行判断

if对字符串进行判断

if对文件的判断

case...in分支结构

while循环结构

for循环结构

select..in语句

辅助控制关键字

 shell中的函数

 

Makefile

Makefile文件由:规则、变量、条件编译、函数构成

规则的构成

 Makefile中的变量

预定义变量

 引入自动变量和通配符

伪目标

在Makefile中,有些目标并不需要生成文件,也没有文件依赖,往往把这样的目标定义为伪目标,为了防止,因为存在和目标同名的文件而不能执行目标的情况发生。

直接将目标定义为伪目标.PHONY

.PHONY:目标

引入函数

 wildcard

功能:根据给定的条件,获取指定的文件名(找文件名的功能)

$(wildcard 指定字符串的格式)

$(wildcard *.c) ---> 找到当前路径下,所有.c文件的文件名

patsubst

功能:模式匹配替换字符串

$(patsubst 源格式,目标格式,要替换的字符串)······

$(patsubst %.c,%.o,main.c add.c) ---> 获取到 main.c add.c字符串,根据模式匹配,得到 main.o add.o 字符串

每一个参数之间以逗号作为分隔,要替换的字符串之间以空格作为分隔

 Makefile文件

EXE=main

FILES=$(wildcard *.c)

OBJS=$(patsubst %.c,%.o, $(FILES))

CC=gcc

CFLAGS=-c -g -Wall -o

all:$(EXE)

$(EXE):$(OBJS)

        $(CC) $^ -o $(EXE)

%.o:%.c

        $(CC) $(CFLAGS) $@ $<

.PHONY:clean

clean:

        $(RM) $(OBJS) $(EXE)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2162783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 10 on ARM, version 22H2 (updated Aug 2024) ARM64 AArch64 中文版、英文版下载

Windows 10 on ARM, version 22H2 (updated Aug 2024) ARM64 AArch64 中文版、英文版下载 基于 ARM 的 Windows 10 请访问原文链接&#xff1a;https://sysin.org/blog/windows-10-arm/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;s…

MyBatis—Plus 快速上手【后端 22】

MyBatis-Plus 使用入门指南 前言 在Java的持久层框架中&#xff0c;MyBatis因其灵活性和易用性而广受欢迎。然而&#xff0c;随着项目规模的扩大&#xff0c;MyBatis的一些重复性工作&#xff08;如CRUD操作&#xff09;开始显得繁琐。为了解决这一问题&#xff0c;MyBatis-Pl…

Flink 高可用原理

Flink 高可用原理 Flink JobManager 高可用 加强了 Flink 集群防止 JobManager 故障的能力。 此特性确保了 Flink 集群将始终持续执行你提交的作业。 JobManager 高可用一般概念是指&#xff0c;在任何时候都有 一个领导者 JobManager&#xff0c;如果领导者出现故障&#xff…

失踪人口回归(明天开始继续更新学习内容)

从明天开始继续更新个人学习经验及收获&#xff0c;可能会直接从C入门开始&#xff0c;总结一下C在C的基础上增加的新语法。这篇就当作水贴算了&#xff0c;大家别点赞&#xff0c;留点赞给明天的文章&#xff0c;哈哈 我是安姐的修沟...........

html TAB、table生成

1. 代码 <!DOCTYPE html> <head> <meta charset"UTF-8"> <title>Dynamic Tabs with Table Data</title> <style> /* 简单的样式 */ .tab-content { display: none; border: 10px solid #ccc; padding: 30px; mar…

二叉树的基本概念(上)

文章目录 &#x1f34a;自我介绍&#x1f34a;简介&#x1f34a;树的定义树中的专业术语树的分类 &#x1f34a;二叉树的特性讲解 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介…

【Redis入门到精通六】在Spring Boot中集成Redis(含配置和操作演示)

目录 Spring Boot中集成Redis 1.项目创建和环境配置 2.基本操作演示 Spring Boot中集成Redis Spring社区也自定义了一套Redis的客户端&#xff0c;与jedis的操作方式有所差异&#xff0c;Spring中把每个类型的操作都单独封装了起来。下面就让我来带大家了解如何在Spring Boot…

JavaScript动态数据可视化

一、引言 在前端开发中&#xff0c;JavaScript无疑是最核心的技术之一。它能够处理各种交互逻辑&#xff0c;实现复杂的功能。本文将通过一个动态数据可视化的案例&#xff0c;展示如何使用JavaScript实现复杂功能。动态数据可视化能够将大量数据以直观、生动的方式呈现&#…

从 Tesla 的 TTPoE 看资源和算法

特斯拉的 ttpoe 出来有一段时间了&#xff0c;不出所料网上一如既往的一堆 pr 文&#xff0c;大多转译自 演讲 ppt 和 Replacing TCP for Low Latency Applications&#xff0c;看了不下 20 篇中文介绍&#xff0c;基本都是上面这篇文章里的内容&#xff0c;车轱辘话颠来倒去。…

Python网络爬虫获取Wallhaven壁纸图片(源码)

** 话不多说&#xff0c;直接附源码&#xff0c;可运行&#xff01; ** import requests from lxml import etree from fake_useragent import UserAgent import timeclass wallhaven(object):def __init__(self):# yellow# self.url "https://wallhaven.cc/search?co…

【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路

文章目录 C string 类的模拟实现&#xff1a;从构造到高级操作前言第一章&#xff1a;为什么要手写 C string 类&#xff1f;1.1 理由与价值 第二章&#xff1a;实现一个简单的 string 类2.1 基本构造与析构2.1.1 示例代码&#xff1a;基础的 string 类实现2.1.2 解读代码 2.2 …

电池快充协议芯片

1&#xff1a;18650充电快充规则 电池知识 | 东莞市恒帝电子科技有限公司 (heldee.com) 锂电池快速充电知识【钜大锂电】 (juda.cn)18 锂电池和18650锂电池能不能快速充电&#xff0c;四种充电方式讲解 | 东莞市恒帝电子科技有限公司 (heldee.com) 2&#xff1a;国产厂家 …

数据库课程 CMU15-445 2023 Fall Project-2 Extendible Hash Index

0 实验结果 tips:完成项目的前提不需要一定看视频 1 数据结构&#xff1a;扩展哈希 解释下这张图&#xff1a; 图中header的最大深度2&#xff0c;directory最大深度2&#xff0c;桶的容量2。 最开始的时候只有一个header。 插入第一个数据&#xff0c;假设这个数据对应的哈希…

安谋科技发布全新自研“玲珑”多媒体处理器

当前&#xff0c;受视频直播、AR/VR、智驾智舱等新兴应用场景和使用人群的飞速增长&#xff0c;视频编解码及显示处理领域呈现出旺盛需求&#xff0c;进而带动了下游设备数量不断攀升。以智能汽车为例&#xff0c;根据盖世汽车研究院的产业报告显示&#xff0c;预计2025年国内车…

【GeekBand】C++设计模式笔记4_Strategy_策略模式

1. “组件协作”模式 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”&#xff0c;“组件协作”模式通过晚期绑定&#xff0c;来实现框架与应用程序之间的松耦合&#xff0c;是二者之间协作时常用的模式。典型模式 Template MethodStrategyObserver / Event 2.…

如何确定SAP 某些凭证或者单号的号码编码范围的 OBJECT 是什么?

在SAP的运维或者项目实施中&#xff0c;有时会如何确定SAP 某些凭证或者单号的号码 OBJECT 是什么&#xff1f; 一般一下常用的可以通过事务代码 例如&#xff1a; XDN1 Create Number Ranges for Customer Accounts&#xff0c;定义客户编码FBN1查看维护会计凭证号范围 我…

【项目】多设计模式下的同步异步日志系统

文章目录 项目介绍开发环境核心技术日志系统介绍为什么需要日志系统日志系统技术实现同步写日志异步写日志 相关技术知识补充不定参函数不定参宏函数的使用C中不定参函数的使用C中不定参函数的使用 设计模式单例模式工厂模式建造者模式代理模式 日志系统框架设计模块划分日志等…

springboot+阿里云物联网教程

需求背景 最近有一个项目,需要用到阿里云物联网,不是MQ。发现使用原来EMQX的代码去连接阿里云MQTT直接报错,试了很多种方案都不行。最终还是把错误分析和教程都整理一下。 需要注意的是,阿里云物联网平台和MQ不一样。方向别走偏了。 概念描述 EMQX和阿里云MQTT有什么区别…

springboot整合openfeign

文章目录 准备一、引入必要依赖二、写一个feign client并暴露到注册中心2.1 client2.2 开启Feign客户端功能 三、别的服务引入IProductClient并调用方法3.1 建一个order-service&#xff0c;引入IProductClient所在模块3.2 注入IProductClient&#xff0c;并调用方法 四、启动服…