Linux 進程間通信 System V系列: 共享內存,信號量,簡單介紹消息隊列

進程間通信 System V系列: 共享內存,初識信號量

  • 一.共享內存
    • 1.引入
    • 2.原理
    • 3.系統調用接口
      • 1.shmget
      • 2.shmat和shmdt
      • 3.shmctl
    • 4.邊寫代碼邊了解共享內存的特性
      • 1.ftok形成key,shmget創建與獲取共享內存
      • 2.shm相關指令
      • 3.shmat和shmdt掛接和取消掛接
      • 4.shmctl獲取共享內存信息,釋放共享內存
      • 5.開始通信
    • 5.利用管道實現共享內存的協同機制
      • 1.Sync(同步類)
      • 2.讀寫端的修改
      • 3.動圖演示
    • 6.共享內存的優缺點
  • 二.消息隊列
    • 1.概念
    • 2.接口,數據結構等等
  • 三.信號量理論
    • 1.信號量的原理
    • 2.信號量的理論
      • 1.從生活中的例子理解信號量
      • 2.進程角度的信號量
      • 3.信號量的細節
        • 1.信號量必須要由OS提供并維護
        • 2.信號量的基本操作
    • 3.信號量的接口
      • 1.semget
      • 2.semctl
      • 3.semop
  • 四.System V系列的進程間通信的小總結
  • 五.利用信號量實現共享內存的協同機制
    • 1.思路
    • 2.Server創建并獲取信號量,Client獲取信號量 -> ftok和semget
      • 1.ftok
      • 2.shmget
    • 3.Server阻塞申請信號量資源 - semop
    • 4.Client初始化信號量資源 - semctl
    • 5.Server釋放信號量資源 - semctl
    • 6.完整代碼
      • 1.Common.hpp
      • 2.sem.hpp
      • 3.ShmServer.cpp
      • 4.ShmClient.cpp
    • 7.演示

我們不是都有管道了嗎?為什么還要有其他的進程間通信方式呢?
當時的年代,通信技術是一個非常火的點,就像現在人工智能和各種大模型一樣,類似于百家爭鳴的樣子,所以有很多進程間通信的方式

因為共享內存跟我們學的進程地址空間有密切聯系,所以我們重點學習
而信號量我們就先認識一下,學習一下理論即可

一.共享內存

1.引入

管道方便是方便,直接復用文件接口即可,但是想要使用管道是需要訪問內核的,而且管道的內核級緩沖區也是在內核當中的,因此會導致效率不是特別好(因為訪問內核本身就是一個比較大的消耗)

那么有沒有什么辦法能夠讓兩個進程無需訪問內核就能進行進程間通信呢?
在這里插入圖片描述

2.原理

跟命名管道一樣,共享內存也是允許完全無關的兩個進程商量一下一起使用同一份資源,從而實現進程間通信的
在這里插入圖片描述
看似很好懂,但是有幾個值得關注的點:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

3.系統調用接口

shm就是shared_memory:共享內存
ipc: InterProcess Communication:進程間通信

1.shmget

在這里插入圖片描述
第三個參數為什么要這么設計呢?
我們一起來分析一下
在這里插入圖片描述
我們剛才還沒有說返回值
在這里插入圖片描述

2.shmat和shmdt

分配完一個共享內存了,下面要做的事情就是把共享內存映射到進程的進程地址空間當中,并用頁表建立該映射

shmat:shmattach是負責建立映射的,也就是將共享內存和進程掛接起來
shmdt:shmdetach(detach是分離,拆卸的意思),也就是取消該共享內存跟進程的掛接關系
在這里插入圖片描述
shmdt直接傳入shmat的返回值即可
在這里插入圖片描述
shmat:如果掛接失敗,返回(void*)-1

3.shmctl

在這里插入圖片描述

4.邊寫代碼邊了解共享內存的特性

1.ftok形成key,shmget創建與獲取共享內存

在這里插入圖片描述
在這里插入圖片描述
下面我們應該是要使用shmat和shmdt了,不過在此之前,我們還要介紹幾個指令

2.shm相關指令

在這里插入圖片描述
如何釋放呢?
可以通過shmctl系統調用接口來釋放,也可以通過指令來釋放
我們先介紹指令釋放
在這里插入圖片描述
這里的key顯示的是16進制,我們剛才打印的是10進制
因此我們改一下代碼,讓它以16進制打印
在這里插入圖片描述

3.shmat和shmdt掛接和取消掛接

在這里插入圖片描述
在這里插入圖片描述

while :;do ipcs -m;sleep 1;done
這里反過濾掉了root創建的共享內存
while :;do ipcs -m | grep -v root;sleep 1;done

在這里插入圖片描述
我們看到了掛接和取消掛接的全過程

4.shmctl獲取共享內存信息,釋放共享內存

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
我們實現了共享內存的創建/獲取,掛接,取消掛接和釋放
下面是時候開始讓這兩個進程開始通信了
在掛接之后,取消掛接之前開始通信

5.開始通信

我們剛才獲取信息只是為了告訴大家這個函數有這么個功能而已,因此我們就不調用這個獲取信息的函數了哦
在這里插入圖片描述
在這里插入圖片描述
通信成功
在這里插入圖片描述
那么沒有協同機制怎么辦?
一個很好的方法是借助信號量來解決這一問題,但是因為信號量的接口太麻煩(比共享內存的這些接口還要麻煩很多),因此我們以后詳細介紹信號量的時候再去使用信號量的接口

要不然是像我剛才那樣通信雙方約定好一個暗號,讀端讀到暗號時意味著通信結束
而是那樣只能解決一部分情況下保證讀端讀取完所有的寫端數據時才退出
還是無法解決寫端還沒寫入你讀端就開始讀了啊

我們可以利用天然具有協同機制的管道啊!!
又因為我們這兩個進程是沒有血緣關系的,因此我們用一下命名管道吧
這里直接把我們之前寫的管理命名管道的代碼拿過來

#pragma once
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <cerrno>
#include <cstring>
#include <string>
using namespace std;
const char* path="./namedpipe";
#define MODE 0666
class Fifo
{
public:Fifo(const char* path):_path(path)//用成員變量保存路徑{int ret=mkfifo(_path.c_str(),MODE);if(ret==-1)//說明創建失敗{cerr<<"create namedpipe fail, errno: "<<errno<<" , strerror: "<<strerror(errno)<<endl;}else{cout<<"create namedpipe succeed"<<endl;}}~Fifo(){unlink(_path.c_str());}
private:string _path;
};

5.利用管道實現共享內存的協同機制

1.Sync(同步類)

在這里插入圖片描述
在這里插入圖片描述

2.讀寫端的修改

在這里插入圖片描述
在這里插入圖片描述

3.動圖演示

在這里插入圖片描述
成功解決了寫端沒寫數據,讀端還讀的問題

6.共享內存的優缺點

在這里插入圖片描述
下面我們趁熱打鐵快速了解一下消息隊列

二.消息隊列

1.概念

在這里插入圖片描述
消息隊列的生命周期也是隨內核的,跟共享內存一樣

2.接口,數據結構等等

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

三.信號量理論

1.信號量的原理

這里介紹信號量的原理,
一方面是為了讓我們更好地理解信號量,一方面是先提出一些多線程當中的概念

在這里插入圖片描述

2.信號量的理論

1.從生活中的例子理解信號量

在這里插入圖片描述

2.進程角度的信號量

在這里插入圖片描述

3.信號量的細節

1.信號量必須要由OS提供并維護

在這里插入圖片描述

2.信號量的基本操作

在這里插入圖片描述

3.信號量的接口

1.semget

在這里插入圖片描述

2.semctl

在這里插入圖片描述

3.semop

在這里插入圖片描述
關于信號量的更多話題我們等到多線程的時候還會再說明的

四.System V系列的進程間通信的小總結

共享內存,消息隊列和信號量的很多接口都是相同的,它們的內核數據結構當中也都有一個一樣的結構體:ipc_perm,
它們都是主要應用于本地通信的,因此在目前的網絡時代當中并不常用(用的更多的還是網絡通信)

它們都屬于System V系列的進程間通信,OS為了管理它們搞了一個
ipc_ids結構體,ipc_id_ary結構體,kern_ipc_perm結構體實現了ipc資源的動態申請和釋放,并將對ipc資源的管理轉換為了對kern_ipc_perm的增刪查改和對ipc_id_ary的動態擴容
在這里插入圖片描述
在這里插入圖片描述
不過因為System V系列的進程間通信的結構和數據結構都是獨立設計的,跟文件是完全解耦的,因此不符合Linux一切皆文件的設計思想,這也是System V系列的進程間通信并不熱門的原因

如果OS能夠在struct file當中封裝一個ipc_perm的指針,把kern_ipc_perm關聯起來,并利用文件接口封裝ipc資源使用的接口,就能讓System V系列的進程間通信符合一切皆文件

那樣的話使用起來肯定也就更容易,肯定就能熱門了

五.利用信號量實現共享內存的協同機制

本來想寫完前4點就結束吧,不過心血來潮想用一下信號量,下面我們一起來用一下信號量吧

1.思路

依舊是回歸我們之前需要利用管道實現共享內存的協同機制的時候
我們的目的是讓讀端一開始阻塞等待,等到寫端準備要進行寫入的時候告訴讀端: 我要開始寫啦,你也開始讀吧

此時就能夠保證讀端不會在一開始的時候做無意義的讀取操作

大致流程分為:

  1. 讀端(Server)創建并獲取信號量
  2. Server阻塞申請信號量資源,此時讀端就是阻塞等待寫端進行寫入
  3. Client獲取讀端創建好的信號量
  4. 寫端(Client)準備寫入時初始化信號量資源
  5. Server成功申請信號量資源,開始進程間通信
  6. 最后Server釋放信號量資源

流程很清晰,
(那為什么我們一開始不用信號量呢? 因為信號量接口太麻煩了…,而且我用管道和信號量來解決這一共享內存的同步機制是為了學習熟悉這些接口)

之前有一些點我沒有注意到,寫代碼的時候屢屢碰壁,最后才搞過來了

2.Server創建并獲取信號量,Client獲取信號量 -> ftok和semget

1.ftok

在這里插入圖片描述

  1. ftok里面傳入的路徑必須是我們Linux系統中的確存在的路徑!!!
  2. 我們申請的共享內存和信號量各自的key是不可以相同的(大家也能夠很好的理解,因為key才是ipc資源的唯一標識嘛)

我們就用這個產生sem的key
在這里插入圖片描述
用這個產生shm的key
在這里插入圖片描述

2.shmget

在這里插入圖片描述
我們共享內存的資源就是一個整體,因此nsems傳入1
然后跟共享內存一樣,Server傳IPC_CREAT | IPC_EXCL | 0666, Client傳入IPC_CREAT即可
在這里插入圖片描述
Server:
在這里插入圖片描述
Client:
在這里插入圖片描述

3.Server阻塞申請信號量資源 - semop

在這里插入圖片描述
當sem_op<0即需要申請信號量時,如果信號量==0,那么該進程就會阻塞,等待信號量>0
而信號量在還沒有被進程設置之前默認值是0,因此我們可以這樣來玩
(注意:

  1. semget時傳入的nsems時你申請的這個信號量集當中的信號量數目,而不是信號量的初始值!!
  2. 初始值需要進程顯式傳入,而且默認值是0[我就是因為這點屢屢碰壁]
  3. sembuf是本來就有的,不需要我們顯式提供[我就是因為這點屢屢碰壁]
    )
    Server不設置信號量,在讀取之前申請信號量資源阻塞等待寫端進行寫入(我們起名為lock函數)
    Client即將進行寫入之前初始化該信號量為1(我們起名為Unlock函數),此時Server等待成功,退出阻塞狀態,開始進行讀取操作
    在這里插入圖片描述

4.Client初始化信號量資源 - semctl

在這里插入圖片描述
在這里插入圖片描述

5.Server釋放信號量資源 - semctl

在這里插入圖片描述

6.完整代碼

1.Common.hpp

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <cstring>
#include <sys/ipc.h>
#include <sys/shm.h>
using namespace std;const char* shm_path="/home/wzs/ubuntucode/process_ipc/semaphore";
const int shm_id=0x5678;
const int agreeSize=4096;key_t GetKey(const char* k_path,int proj_id)
{key_t ret=ftok(k_path,proj_id);if(ret==-1){cout<<"ftok fail"<<endl;exit(1);}return ret;
}class Shm
{
public:int GetShmid(int key,int size,int shmflg){int shmid=shmget(key,size,shmflg);if(shmid==-1){cout<<"shmget fail"<<endl;exit(1);}return shmid;}void* Attach(int shmid){void* addr=shmat(shmid,nullptr,0);if(addr==(void*)-1){cout<<"shmat fail"<<endl;exit(1);}return addr;}void Detach(void* addr){shmdt(addr);}void DelShm(int shmid){shmctl(shmid,IPC_RMID,nullptr);}
};

2.sem.hpp

#pragma once
#include <sys/sem.h>
const char* sem_path="/home/wzs/ubuntucode/process_ipc/pipe/namepipe/name_pipepool";
const int sem_id=0x3f45289;union semun {  int val;                /* 用于SETVAL */  struct semid_ds *buf;  /* 用于IPC_STAT和IPC_SET */  unsigned short *array; /* 用于GETALL和SETALL */  
};void ChangeCount(sembuf* buf,int val)
{buf->sem_num=0;buf->sem_op=val;buf->sem_flg=SEM_UNDO;
}class Sem
{
public:int GetSemid(key_t key,int nsems,int semflg){int semid=semget(key,nsems,semflg);if(semid==-1){cout<<"semget fail"<<endl;exit(1);}return semid;}void DelSem(int semid){semctl(semid,0,IPC_RMID);}void Change(int semid,sembuf* sops){cout<<"wait sem resource..."<<endl;semop(semid,sops,1);cout<<"wait success!"<<endl;}void GetInfo(int semid){int val=semctl(semid,0,GETVAL);cout<<val<<endl;}void Init(int semid,semun un){semctl(semid,0,SETVAL,un);}void Unlock(int semid){union semun sem_union;sem_union.val=1;//將信號量的初始值設置為1,此時相當于開鎖,讀端可以拿到信號量,開始讀取Init(semid,sem_union);}void lock(int semid){sembuf buf;ChangeCount(&buf,-1);Change(semid,&buf);//我想申請信號量,但是信號量默認是0,我需要阻塞等待}
};

3.ShmServer.cpp

#include "Common.hpp"
#include "sem.hpp"
int main()
{Shm shm;key_t sem_key=GetKey(shm_path,shm_id);//獲取Keyint shmid=shm.GetShmid(sem_key,agreeSize,IPC_CREAT | IPC_EXCL | 0666);//申請shmchar* addr=(char*)shm.Attach(shmid);//掛接shm//利用二元信號量(鎖)Sem sem;key_t k=GetKey(sem_path,sem_id);int semid=sem.GetSemid(k,1,IPC_CREAT | IPC_EXCL | 0666);//等待獲取鎖sem.lock(semid);cout<<"receive message begin########################################"<<endl;//開始讀取while(true){if(addr[0]=='q') break;cout<<"this is message:"<<addr<<"。"<<endl;sleep(1);}cout<<"receive message over#########################################"<<endl;cout<<"Server will detach shm now..."<<endl;shm.Detach(addr);//解除掛接shm.DelShm(shmid);//刪除shmsem.DelSem(semid);//刪除semreturn 0;
}

4.ShmClient.cpp

#include "Common.hpp"
#include "sem.hpp"
int main()
{Shm shm;key_t sem_key=GetKey(shm_path,shm_id);int shmid=shm.GetShmid(sem_key,agreeSize,IPC_CREAT);Sem sem;key_t k=GetKey(sem_path,sem_id);int semid=sem.GetSemid(k,1,IPC_CREAT);char* addr=(char*)shm.Attach(shmid);memset(addr,0,agreeSize);cout<<"send message begin########################################"<<endl;//開鎖sem.Unlock(semid);for(char c='A';c<='Z';c++){addr[c-'A']=c;sleep(1);}addr[0]='q';cout<<"send message over########################################"<<endl;cout<<"Client will detach shm now..."<<endl;shm.Detach(addr);return 0;
}

7.演示

在這里插入圖片描述

以上就是Linux 進程間通信 System V系列: 共享內存,信號量,簡單介紹消息隊列的全部內容,希望能對大家有所幫助!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/9979.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/9979.shtml
英文地址,請注明出處:http://en.pswp.cn/web/9979.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

政務網離線安裝python3及其依賴手冊

文章目錄 python安裝及環境配置gcc安裝make安裝python3安裝pip安裝 測試測試python3報錯:ModuleNotFoundError: No module named _ctypes’測試pip3報錯“pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.” 依賴庫…

springboot 日志詳解

系統用戶操作日志(記錄用戶操作并定時保存到表中) 客戶需求: 要對幾個關鍵的業務功能進行操作日志記錄&#xff0c;即什么人在什么時間操作了哪個功能&#xff0c;操作前的數據報文是什么、操作后的數據報文是什么&#xff0c;必要的時候可以一鍵回退。 設計思路: ruoyi中使用S…

共享旅游革命:千益暢行卡的優勢揭秘

在共享經濟的快速發展中&#xff0c;共享旅游創業已成為許多創新者和投資者關注的重點。特別是千益暢行&#xff0c;作為共享旅游行業的新秀&#xff0c;其商業模型和經營策略引起了市場的高度討論。然而&#xff0c;對于這個公司是否僅僅是新一輪的市場“收割者”&#xff0c;…

Kylin Server V10下FTP服務器安全加固

一、查看操作系統信息 [root@localhost ~]# cat /etc/.kyinfo [dist] name=Kylin milestone=Server-V10-GFB-Release-ZF9_01-2204-Build03 arch=arm64 beta=False time=2023-01-09 11:04:36 dist_id=Kylin-Server-V10-GFB-Release-ZF9_01-2204-Build03-arm64-2023-01-09 11:04…

大模型prompt實例:知識庫信息質量校驗模塊

大模型相關目錄 大模型&#xff0c;包括部署微調prompt/Agent應用開發、知識庫增強、數據庫增強、知識圖譜增強、自然語言處理、多模態等大模型應用開發內容 從0起步&#xff0c;揚帆起航。 大模型應用向開發路徑&#xff1a;AI代理工作流大模型應用開發實用開源項目匯總大模…

基于FPGA的數字信號處理(11)--定點數的舍入模式(2)向最臨近值取整nearest

前言 在之前的文章介紹了定點數為什么需要舍入和幾種常見的舍入模式。今天我們再來看看另外一種舍入模式&#xff1a;向最臨近值取整nearest。 10進制數的nearest nearest&#xff1a; 向最臨近值方向取整。它的舍入方式和四舍五入非常類似&#xff0c;都是舍入到最近的整數…

【Unity AR開發系列】介紹如何使用這個支持熱更的AR開發插件,快速地開發AR應用

預告 Unity開發AR系列 本專欄將介紹如何使用這個支持熱更的AR開發插件&#xff0c;快速地開發AR應用。 更新 二、使用插件一鍵安裝HybridCLR和ARCore 三、配置帶HybridCLR的ARCore開發環境

計算機視覺與深度學習實戰之以Python為工具:基于主成分分析的人臉二維碼識別

注意:本文的下載教程,與以下文章的思路有相同點,也有不同點,最終目標只是讓讀者從多維度去熟練掌握本知識點。 下載教程:計算機視覺與深度學習實戰-以MATLAB和Python為工具_基于主成分分析的人臉二維碼識別_項目開發案例教程.pdf 一、引言 隨著科技的快速發展,計算機視覺…

單鏈表經典oj題(2)

前言 這次將要把剩下的oj題將以圖解和自己的理解把它講解完&#xff0c;希望對大家有所幫助&#xff0c;這次的講解也是干貨 第一題 21. 合并兩個有序鏈表 - 力扣&#xff08;LeetCode&#xff09; ok這次就簡單點&#xff0c;大家自己去看題目了 將兩個升序鏈表合并為一個…

帶有-i選項的sed命令在Linux上執行成功,但在MacOS上失敗了

問題&#xff1a; 我已經成功地使用以下 sed 命令在Linux中搜索/替換文本&#xff1a; sed -i s/old_string/new_string/g /path/to/file然而&#xff0c;當我在Mac OS X上嘗試時&#xff0c;我得到&#xff1a; command i expects \ followed by text我以為我的Mac運行的是…

未授權訪問:Memcached 未授權訪問漏洞

目錄 1、漏洞原理 2、環境搭建 3、未授權訪問 防御手段 今天繼續學習各種未授權訪問的知識和相關的實操實驗&#xff0c;一共有好多篇&#xff0c;內容主要是參考先知社區的一位大佬的關于未授權訪問的好文章&#xff0c;還有其他大佬總結好的文章&#xff1a; 這里附上大…

如何在OpenWrt軟路由中增加一個新功能

為了在OpenWrt中增加一個新的功能&#xff0c;并使其支持 UCI 配置&#xff0c;我們可以創建一個簡單的C語言服務&#xff0c;例如一個簡單的日志服務。此服務將記錄到日志文件中&#xff0c;并支持通過 UCI 配置啟用或禁用日志功能。以下是詳細的步驟和代碼示例。 1 創建服務…

K8S三 K8S部署微服務應用

一 用k8s部署微服務應用 以我們之前用docker部署過的eureka應用為例&#xff0c;首先添加配置文件eureka-app-deployment.yaml用于創建Deployment apiVersion: apps/v1 kind: Deployment metadata:name: eureka-app-deployment # deployment名字labels:app: eureka-app spec:…

【C++】CentOS環境搭建-升級CMAKE

【C】CentOS環境搭建-升級CMAKE CMAKE報錯CMake 3.12 or higher is required. You are running version 2.8.12.2升級步驟1.移除當前的cmake2.安裝必要的構建工具和庫3.下載最新的cmake源碼并解壓5.編譯和安裝6.驗證安裝 CMAKE報錯CMake 3.12 or higher is required. You are r…

oraclesql中刪除表中重復行的方法

在Oracle SQL中&#xff0c;刪除表中的重復行有幾種常見的方法。以下是其中的三種&#xff1a; 使用ROWID: 通過比較ROWID&#xff0c;你可以找到并刪除重復的行。這是因為ROWID是Oracle數據庫為每一行數據分配的唯一標識符。 sql DELETE FROM persons p1 WHERE ROWID NOT…

MySQL存儲引擎詳解

存儲引擎 MySQL體系結構 連接層&#xff1a;與客戶端連接&#xff0c;權限校驗、連接池服務層&#xff1a;SQL接口和解析、查詢優化、緩存、函數引擎層&#xff1a;索引、存儲引擎存儲層&#xff1a;系統文件、日志&#xff08;Redo、Undo等&#xff09; 存儲引擎介紹 不同的…

SSH:安全遠程訪問的基石

SSH&#xff1a;安全遠程訪問的基石 一、引言 在當今這個數字化、網絡化的時代&#xff0c;遠程訪問和管理計算機資源已成為日常工作的重要組成部分。然而&#xff0c;如何在不安全的網絡環境中確保數據傳輸的機密性、完整性和可靠性&#xff0c;成為了一個亟待解決的問題。S…

前端測試策略與實踐:單元測試、E2E測試與可訪問性審計

前端測試策略是確保Web應用程序質量、性能和用戶體驗的關鍵組成部分。有效的測試策略通常包括單元測試、端到端&#xff08;E2E&#xff09;測試以及可訪問性審計等多個層面。以下是關于這三類測試的策略與實踐建議&#xff1a; 單元測試 定義與目的&#xff1a; 單元測試是針…

P2622 關燈問題

小小注解&#xff1a; 1. vis&#xff1a;表示到達該狀態的步數&#xff08;min&#xff09;1&#xff0c; 因為我們是從開始狀態 窮舉&#xff0c;所以每次到一個新狀態&#xff08;之前沒有到過的狀態&#xff09;就是最小步數。 如何判斷是否是一個新狀態呢&#xff0c…

axios常用配置

Axios 是一個基于 promise 的 HTTP 庫&#xff0c;廣泛用于瀏覽器和 node.js 中。以下是一些 Axios 常用的配置選項&#xff1a; url: 字符串&#xff0c;請求的服務器URL&#xff0c;是必填項。method: 請求方法&#xff0c;如 ‘get’, ‘post’, ‘put’, ‘delete’ 等&am…