Linux之netlink(2)libnl使用介紹(1)

Linux之netlink(2)Libnl3使用介紹(1)

Author:Onceday Date:2025年4月26日

漫漫長路,才剛剛開始…

全系列文章可查看專欄: Linux內核知識_Once-Day的博客-CSDN博客

本文翻譯自libnl3官方文檔:Netlink Library (libnl)

參考文檔:

  • thom311/libnl: Netlink Library Suite
  • libnl - Netlink Protocol Library Suite
  • Routing Family Netlink Library (libnl-route)
  • Netlink Library (libnl)
  • Documentation Overview - libnl Suite

文章目錄

      • Linux之netlink(2)Libnl3使用介紹(1)
        • 1. libnl介紹
        • 2. Netlink協議介紹
          • 2.1 Netlink地址
          • 2.2 消息格式
          • 2.3 消息類型
          • 2.4 序列號
        • 3. Netlink套接字
          • 3.1 Socket實例
          • 3.2 序列號
          • 3.3 多播組
          • 3.4 回調函數配置
          • 3.5 套接字屬性

1. libnl介紹

libnl3是Linux平臺上一個功能豐富的網絡編程庫。它為用戶空間程序提供了一組全面的API,用于與Linux內核的網絡組件進行交互。libnl3讓開發者能夠方便地配置和管理各種網絡功能,如鏈路、接口、路由、地址、鄰居、策略路由、流量控制、網絡狀態監控等。

libnl 套件是一組庫的集合,它為基于 Netlink 協議的 Linux 內核接口提供了應用程序編程接口(API)。

Netlink 是一種主要在內核與用戶空間進程之間使用的進程間通信(IPC)機制。它被設計成是 ioctl(輸入輸出控制)更靈活的替代方案,主要用于提供與網絡相關的內核配置和監控接口。

在這里插入圖片描述

這些接口被劃分到幾個小型庫中,這樣就不會強制應用程序鏈接到一個龐大臃腫的單一庫上。

  • libnl,核心庫,實現了使用 Netlink 協議所需的基本功能,比如套接字處理、消息構建與解析,以及數據的發送和接收。這個庫保持小巧且簡約。該套件中的其他庫都依賴于這個庫。
  • libnl-route,提供了 NETLINK_ROUTE 系列配置接口的 API,這些接口涉及網絡接口、路由、地址、鄰居節點以及流量控制等方面。
  • libnl-genl,提供了通用 Netlink 協議(Netlink 協議的擴展版本)的 API。
  • libnl-nf,提供了基于 Netlink 的 netfilter(網絡過濾器)配置和監控接口(連接跟蹤、日志記錄、隊列)的 API。

主要的頭文件是 <netlink/netlink.h>。根據程序所使用的子系統和組件的不同,可能還需要在源文件中包含其他的頭文件。

#include <netlink/netlink.h>#include <netlink/cache.h>#include <netlink/route/link.h>

如果該庫在編譯時啟用了調試語句,那么當環境變量 NLDBG 的值設置為大于 0 時,它將會把調試信息打印到標準錯誤輸出(stderr)中。

NLDBG=2 ./myprogram

下面是各個NLDBG值對應的調試級別:

調試級別描述
0調試功能已禁用(默認設置)
1警告、重要事件及通知信息
2或多或少較為重要的調試消息
3會產生大量調試消息的重復性事件相關信息
4甚至更不太重要的消息

查看與其他套接字交換的 Netlink 消息流通常是很有用的。設置環境變量 NLCB=debug 將啟用調試消息處理程序,該程序進而會以人類可讀的格式將交換的 Netlink 消息打印到標準錯誤輸出(stderr)中。

$ NLCB=debug ./myprogram-- Debug: Sent Message:--------------------------   BEGIN NETLINK MESSAGE ---------------------------[HEADER] 16 octets.nlmsg_len = 20.nlmsg_type = 18 <route/link::get>.nlmsg_flags = 773 <REQUEST,ACK,ROOT,MATCH>.nlmsg_seq = 1301410712.nlmsg_pid = 20014[PAYLOAD] 16 octets
.....
2. Netlink協議介紹
2.1 Netlink地址

Netlink 協議是一種基于套接字的進程間通信(IPC)機制,用于用戶空間進程與內核之間,或者用戶空間進程彼此之間的通信。Netlink 協議基于 BSD 套接字,并使用 AF_NETLINK 地址族。每一種 Netlink 協議都有其自身的協議編號(例如,NETLINK_ROUTE、NETLINK_NETFILTER 等)。它的編址模式基于一個 32 位的端口號,以前稱為進程標識符(PID),這個端口號唯一標識每個通信對等端。

Netlink 地址(端口)由一個 32 位整數組成。端口 0(零)是為內核保留的,它指的是每個 Netlink 協議族在內核端的套接字。其他端口號通常指的是用戶空間所擁有的套接字,不過這并非強制規定。

起初,常見的做法是使用進程標識符(PID)作為本地端口號。但隨著支持多線程的 Netlink 應用程序以及需要多個套接字的應用程序的出現,這種做法變得不太實用了。因此,libnl 庫會基于進程標識符生成唯一的端口號,并為其添加一個偏移量,從而允許使用多個套接字。出于向后兼容的原因,初始套接字的端口號仍然會等于進程標識符。

在這里插入圖片描述

上圖展示了三個應用程序以及內核端所暴露的兩個內核端套接字。它呈現了常見的 Netlink 使用場景:

  • 用戶空間到內核。
  • 用戶空間到用戶空間。
  • 監聽內核的多播通知。

(1)用戶空間到內核:Netlink 最常見的使用形式是用戶空間應用程序向內核發送請求,并處理回復,回復內容要么是錯誤消息,要么是成功通知。

在這里插入圖片描述

(2)用戶空間到用戶空間:Netlink 也可以用作一種進程間通信機制,以便用戶空間應用程序之間直接進行通信。通信并不局限于兩個對等端,任意數量的對等端都可以相互通信,并且多播功能允許通過一條消息發送給多個對等端。

為了讓各個套接字能夠相互可見,必須為相同的 Netlink 協議族創建這兩個套接字。

在這里插入圖片描述

(3)用戶空間監聽內核通知:這種形式的 Netlink 通信通常出現在用戶空間守護進程中,這些守護進程需要針對某些內核事件采取行動。此類守護進程通常會維護一個訂閱了某個多播組的 Netlink 套接字,內核使用該多播組向感興趣的用戶空間各方通知特定事件。

在這里插入圖片描述

由于在任何時候更換用戶空間組件時都無需內核察覺,并且具有靈活性,所以相較于直接編址,多播的使用更為可取。

2.2 消息格式

Netlink 協議通常基于消息,由 Netlink 消息頭部(struct nlmsghdr)以及附加到它上面的有效載荷組成。有效載荷可以由任意數據構成,但通常包含一個固定大小的特定于協議的頭部,其后跟著一系列屬性。

在這里插入圖片描述

Netlink 消息頭部(struct nlmsghdr結構體):

  • 總長度(32 位):消息的總長度,以字節為單位,包括 Netlink 消息頭部。

  • 消息類型(16 位):消息類型指定了該消息所攜帶的有效載荷的類型。Netlink 協議定義了幾種標準的消息類型。每個協議族可能會定義額外的消息類型。

  • 消息標志(16 位):消息標志可用于修改消息類型的行為。

  • 序列號(32 位):序列號是可選的,可用于引用先前的消息,例如,一條錯誤消息可以引用導致該錯誤的原始請求。

  • 端口號(32 位):端口號指定了該消息應發送到的對等端。如果未指定端口號,該消息將被發送到同一協議族中第一個匹配的內核端套接字。

2.3 消息類型

Netlink 協議區分請求、通知和回復。請求是設置了NLM_F_REQUEST標志的消息,其目的是向接收方請求執行某個操作。請求通常由用戶空間進程發送到內核。雖然并非嚴格強制要求,但每個發送的請求都應該攜帶一個遞增的序列號。

根據請求的性質,接收方可能會用另一條 Netlink 消息來回復該請求。回復的序列號必須與它所關聯的請求的序列號相匹配。

通知屬于非正規性質的消息,不需要回復,因此序列號通常設置為 0。

在這里插入圖片描述

消息的類型主要通過消息頭部中設置的 16 位消息類型來識別。定義了以下標準消息類型:

  • NLMSG_NOOP,無操作,該消息必須被丟棄。

  • NLMSG_ERROR,錯誤消息或確認消息(ACK)。

  • NLMSG_DONE,多部分消息序列的結束。

  • NLMSG_OVERRUN,溢出通知(錯誤)。

每個 Netlink 協議都可以自由定義自己的消息類型。請注意,小于 NLMSG_MIN_TYPE(0x10)的消息類型值是保留的,不能使用。

通常的做法是使用自定義的消息類型來實現遠程過程調用(RPC)模式。假設正在實現的 Netlink 協議的目標是允許對特定網絡設備進行配置,因此希望提供對各種配置選項的讀寫訪問權限。實現這一目標的典型 “Netlink 方式” 是定義兩種消息類型:MSG_SETCFG(設置配置消息)和 MSG_GETCFG(獲取配置消息):

#define MSG_SETCFG      0x11
#define MSG_GETCFG      0x12

發送一條MSG_GETCFG請求消息通常會觸發一條消息類型為MSG_SETCFG的回復,回復中包含當前的配置信息。用面向對象的術語來說,這可以描述為 “內核在用戶空間中設置配置的本地副本”。

在這里插入圖片描述

可以通過發送一條 MSG_SETCFG 消息來更改配置,對該消息的回復要么是一條確認消息(ACK),要么是一條錯誤消息。

在這里插入圖片描述

作為可選操作,內核可以發送配置更改的通知,使用戶空間能夠監聽這些更改,而無需頻繁輪詢。通知通常會重用現有的消息類型,并且依賴于應用程序使用單獨的套接字來區分請求和通知,但你也可以指定一個單獨的消息類型。

在這里插入圖片描述

盡管從理論上講,一條 Netlink 消息的大小最大可達 4GiB,但套接字緩沖區很可能不夠大,無法容納如此大小的消息。因此,通常的做法是將消息大小限制為一頁的大小(PAGE_SIZE),并使用多部分機制將大塊數據分割成幾條消息。一條多部分消息(Multipart Messages)設置了標志NLM_F_MULTI,接收方需要持續接收和解析消息,直到接收到特殊的消息類型NLMSG_DONE為止。

與分片的 IP 數據包不同,多部分消息無需重新組裝,盡管如果協議希望以這種方式工作,重新組裝也是完全可行的。多部分消息常常用于發送對象列表或對象樹,每條多部分消息僅僅攜帶多個對象,從而允許獨立解析每條消息。

在這里插入圖片描述

錯誤消息可以作為對請求的響應而發送。錯誤消息必須使用標準消息類型 NLMSG_ERROR。其有效載荷由一個錯誤代碼和原始請求的 Netlink 消息頭部組成。

在這里插入圖片描述

錯誤消息應將序列號設置為導致該錯誤的請求的序列號。

在這里插入圖片描述

確認消息(ACK),發送方可以通過在請求中設置 NLM_F_ACK 標志,來請求接收方為每條已處理的請求發回一條確認消息。這通常用于讓發送方在請求被接收方處理之前同步后續的處理操作。

在這里插入圖片描述

確認消息也使用消息類型NLMSG_ERROR和有效載荷格式,但錯誤代碼設置為 0。

消息標志,定義了以下標準標志:

#define NLM_F_REQUEST           1
#define NLM_F_MULTI             2
#define NLM_F_ACK               4
#define NLM_F_ECHO              8
  • NLM_F_REQUEST - 消息是一個請求。
  • NLM_F_MULTI - 多部分消息。
  • NLM_F_ACK - 請求確認消息。
  • NLM_F_ECHO - 請求回顯該請求。

標志 NLM_F_ECHO 與 NLM_F_ACK 標志類似。它可以與 NLM_F_REQUEST 標志結合使用,使得作為請求結果而發送的通知,無論發送方是否已訂閱相應的多播組,都會被發送給發送方。

還定義了一些僅適用于 GET 請求的額外通用消息標志:

#define NLM_F_ROOT      0x100
#define NLM_F_MATCH     0x200
#define NLM_F_ATOMIC    0x400
#define NLM_F_DUMP      (NLM_F_ROOT|NLM_F_MATCH)
  • NLM_F_ROOT - 基于樹的根節點返回數據。
  • NLM_F_MATCH - 返回所有匹配的條目。
  • NLM_F_ATOMIC - 已過時,曾經用于請求一個原子操作。
  • NLM_F_DUMP - 返回所有對象的列表(NLM_F_ROOT|NLM_F_MATCH)。

這些標志的使用完全是可選的,許多 Netlink 協議僅使用 NLM_F_DUMP 標志,該標志通常請求接收方以多部分消息序列的形式,發送與消息類型相關的所有對象的列表。

還有另一組與 NEW 或 SET 請求相關的標志。這些標志與 GET 請求的標志相互排斥:

#define NLM_F_REPLACE   0x100
#define NLM_F_EXCL      0x200
#define NLM_F_CREATE    0x400
#define NLM_F_APPEND    0x800
  • NLM_F_REPLACE - 如果對象已存在,則替換該現有對象。
  • NLM_F_EXCL - 如果對象已經存在,則不更新該對象。
  • NLM_F_CREATE - 如果對象尚不存在,則創建該對象。
  • NLM_F_APPEND - 在列表末尾添加對象。

這些標志的行為在不同的 Netlink 協議之間可能會略有不同。

2.4 序列號

Netlink 允許使用序列號來幫助將回復與請求相關聯。需要注意的是,與 TCP 等協議不同,Netlink 對序列號沒有嚴格的強制要求。序列號的唯一目的是幫助發送方將回復與相應的請求關聯起來。序列號是在每個套接字的基礎上進行管理的。

3. Netlink套接字
3.1 Socket實例

為了使用 Netlink 協議,需要一個 Netlink 套接字。每個套接字都定義了一個獨立的消息發送和接收上下文。一個應用程序可以使用多個套接字,例如,一個套接字用于發送請求并接收回復,另一個套接字訂閱多播組以接收通知。

Netlink 套接字以及所有相關屬性(包括實際的文件描述符)都由struct nl_sock結構體表示。

#include <netlink/socket.h>struct nl_sock *nl_socket_alloc(void)
void nl_socket_free(struct nl_sock *sk)

應用程序必須為其希望使用的每個 Netlink 套接字分配一個struct nl_sock結構體的實例。

3.2 序列號

該庫會自動為應用程序處理序列號。在套接字結構中存儲有一個序列號計數器,當需要發送預期會產生回復(如錯誤消息或任何其他需要與原始消息相關聯的消息類型)的消息時,會自動使用并遞增該計數器。

或者,也可以通過函數nl_socket_use_seq()直接使用該計數器。它將返回計數器的當前值,然后將其遞增 1。

#include <netlink/socket.h>unsigned int nl_socket_use_seq(struct nl_sock *sk);

不過,大多數應用程序并不希望自己處理序列號。當使用nl_send_auto()函數時,序列號會自動填入,并且在收到回復時會再次進行匹配。

如果所實現的 Netlink 協議不使用請求 / 回復模型,例如當套接字用于接收通知消息時,這種(自動處理序列號的)行為可以并且必須被禁用。

#include <netlink/socket.h>void nl_socket_disable_seq_check(struct nl_sock *sk);
3.3 多播組

每個套接字可以訂閱其所連接的 Netlink 協議的任意數量的多播組。然后,該套接字將接收發送到任何一個多播組的每條消息的副本。多播組通常用于實現事件通知。

在內核版本 2.6.14 之前,組訂閱是使用位掩碼來執行的,這將每個協議族的組數量限制為 32 個。即使不建議在新代碼中使用,仍然可以通過函數nl_join_groups()訪問這個過時的接口。

#include <netlink/socket.h>void nl_join_groups(struct nl_sock *sk, int bitmask);

從內核版本 2.6.14 開始引入了一種新方法,該方法支持訂閱幾乎無限數量的多播組。

#include <netlink/socket.h>int nl_socket_add_memberships(struct nl_sock *sk, int group, ...);
int nl_socket_drop_memberships(struct nl_sock *sk, int group, ...);
3.4 回調函數配置

每個套接字都被分配一個回調配置,該配置控制套接字的行為。例如,這對于每個套接字擁有一個單獨的消息接收函數是必要的。不過,在套接字之間共享回調配置也是完全可行的。

可以使用以下函數來訪問和設置套接字的回調配置:

#include <netlink/socket.h>struct nl_cb *nl_socket_get_cb(const struct nl_sock *sk);
void nl_socket_set_cb(struct nl_sock *sk, struct nl_cb *cb);

此外,還存在一種快捷方式,可以直接修改分配給套接字的回調配置:

#include <netlink/socket.h>int nl_socket_modify_cb(struct nl_sock *sk, enum nl_cb_type type, enum nl_cb_kind kind,nl_recvmsg_msg_cb_t func, void *arg);
3.5 套接字屬性

本地端口號唯一標識該套接字,并用于對其進行尋址。在分配套接字時,會自動生成一個唯一的本地端口號。它將由進程 ID(22 位)和一個隨機數(10 位)組成,因此每個進程最多允許有 1024 個套接字。

#include <netlink/socket.h>uint32_t nl_socket_get_local_port(const struct nl_sock *sk);
void nl_socket_set_local_port(struct nl_sock *sk, uint32_t port);

注意:可以覆蓋本地端口號,但你必須確保所提供的值是唯一的,并且任何其他應用程序中的其他套接字都沒有使用相同的值。

可以為套接字分配一個對等端口,這將導致通過該套接字發送的所有單播消息都被發送到該對等方。如果未指定對等方,則消息將發送到內核,內核將嘗試自動將該套接字綁定到同一 Netlink 協議族的內核端套接字。通常的做法是不將套接字綁定到對等端口,因為每個 Netlink 協議族通常只存在一個內核端套接字。

#include <netlink/socket.h>uint32_t nl_socket_get_peer_port(const struct nl_sock *sk);
void nl_socket_set_peer_port(struct nl_sock *sk, uint32_t port);

Netlink 使用 BSD 套接字接口,因此每個套接字背后都有一個文件描述符,你可以直接使用它。

#include <netlink/socket.h>int nl_socket_get_fd(const struct nl_sock *sk);

如果一個套接字僅用于接收通知,通常最好將該套接字設置為非阻塞模式,并定期輪詢以獲取新的通知。

#include <netlink/socket.h>int nl_socket_set_nonblocking(const struct nl_sock *sk);

套接字緩沖區用于在發送方和接收方之間對 Netlink 消息進行排隊。這些緩沖區的大小指定了你能夠寫入 Netlink 套接字的最大大小,也就是說,它將間接定義最大消息大小。默認大小是 32KiB。

#include <netlink/socket.h>int nl_socket_set_buffer_size(struct nl_sock *sk, int rx, int tx);

以下函數允許在套接字上啟用 / 禁用自動確認模式。自動確認模式默認是啟用的。

#include <netlink/socket.h>void nl_socket_enable_auto_ack(struct nl_sock *sk);
void nl_socket_disable_auto_ack(struct nl_sock *sk);

啟用/禁用消息窺探(Message Peeking)。如果啟用,消息窺探會使nl_recv函數嘗試使用 MSG_PEEK 來檢索接收到的下一條消息的大小,并分配一個該大小的緩沖區。消息窺探默認是啟用的,但可以使用以下函數將其禁用:

#include <netlink/socket.h>void nl_socket_enable_msg_peek(struct nl_sock *sk);
void nl_socket_disable_msg_peek(struct nl_sock *sk);

啟用 / 禁用接收數據包信息。如果啟用,從內核接收到的每條 Netlink 消息都將在控制消息中包含一個額外的struct nl_pktinfo結構體。可以使用以下函數來啟用 / 禁用接收數據包信息。

#include <netlink/socket.h>int nl_socket_recv_pktinfo(struct nl_sock *sk, int state);

注意,Netlink Pktinfo的處理功能還沒有實現。

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

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

相關文章

深入理解TransmittableThreadLocal:原理、使用與避坑指南

一、ThreadLocal與InheritableThreadLocal回顧 在介紹TransmittableThreadLocal之前&#xff0c;我們先回顧一下Java中的ThreadLocal和InheritableThreadLocal。 1. ThreadLocal ThreadLocal提供了線程局部變量&#xff0c;每個線程都可以通過get/set訪問自己獨立的變量副本…

Linux下的I/O復用技術之epoll

I/O多路復用 指在單個線程或進程中&#xff0c;同時處理多個I/O操作的技術。 旨在提高程序處理多個并發I/O操作的能力&#xff0c;避免程序因等待某個I/O操作而被阻塞。在傳統的I/O模型中當程序進行I/O操作時(如讀取文件、接受網路數據等)&#xff0c;如果數據還未準備好&…

用 C 語言實現通用的冒泡排序算法

在日常編程中&#xff0c;排序算法是一個非常常見且重要的工具。雖然有許多排序算法可以選擇&#xff0c;但如果你需要一個能夠處理不同數據類型的排序算法&#xff0c;如何設計一個通用的排序算法呢&#xff1f;今天我們將實現一個通用的冒泡排序算法&#xff0c;支持不同數據…

C# 變量全解析:聲明、初始化與使用

在多用途的編程語言中&#xff0c;程序存取數據是一項基礎且關鍵的功能&#xff0c;而這一功能主要通過變量來實現。本文將全面深入地探討 C# 中的變量&#xff0c;包括變量的種類、聲明、初始化、自動初始化、多變量聲明以及如何使用變量的值。 變量概述 變量是一個名稱&…

Dify中的文本分詞處理技術詳解

Dify中的文本分詞處理技術詳解 引言核心架構概覽索引處理器工廠 文本分詞技術詳解基礎分詞器增強型遞歸字符分詞器固定分隔符文本分詞器遞歸分割算法 索引處理器中的分詞應用特殊索引處理器的分詞特點問答索引處理器父子索引處理器 分詞技術的應用場景技術亮點與優勢總結 引言 …

如何打包python程序為可執行文件

將 Python 程序打包為可執行文件是一個常見需求&#xff0c;尤其是在希望將應用程序分享給不具備 Python 環境的用戶時。以下是使用 PyInstaller 工具將 Python 程序打包為可執行文件的步驟。 步驟 1&#xff1a;安裝 PyInstaller 如果您還沒有安裝 PyInstaller&#xff0c;請…

美團Java后端二面面經!

場景題是面試的大頭&#xff0c;建議好好準備 Q. [美團]如何設計一個外賣訂單的并發扣減庫存系統&#xff1f; Q.[美團]為啥初始標記和重新標記需要STW&#xff1f; Q.[美團]騎手位置實時更新&#xff0c;如何保證高并發寫入&#xff1f; Q.[美團]訂單表數據量過大導致查詢…

在應用運維過程中,業務數據修改的證據留存和數據留存

在應用運維過程中,業務數據修改的證據留存和數據留存至關重要,以下是相關介紹: 一、證據留存 操作日志記錄 : 詳細記錄每一次業務數據修改的操作日志,包括操作人員、操作時間、修改內容、修改前后數據的對比等。例如,某公司業務系統中,操作日志會精確記錄員工小張在 2…

Eigen迭代求解器類

1. 迭代求解器核心類概覽 Eigen 提供多種迭代法求解稀疏線性方程組 AxbAxb&#xff0c;適用于大規模稀疏矩陣&#xff1a; 求解器類適用矩陣類型算法關鍵特性ConjugateGradient對稱正定&#xff08;SPD&#xff09;共軛梯度法&#xff08;CG&#xff09;高精度&#xff0c;內…

ORACLE數據庫備份入門:第四部分:2-備份場景舉例

下面以4個常見的場景為例&#xff0c;介紹如何規劃備份方案。備份方案沒有標準答案&#xff0c;需要根據實現情況來制定&#xff0c;也和管理員的個人使用習慣有很大相關性。 1 交易型數據庫備份 以銀行的交易系統為例&#xff0c;除了前一章節提到的關于RPO和RTO的指標外&am…

小白如何學會完整挪用Github項目?(以pix2pix為例)

[目錄] 0.如何完整地復現/應用一個Github項目 1.建立適用于項目的環境 2.數據準備與模型訓練階段 3.訓練過程中的一些命令行調試必備知識0.如何完整地復現/應用一個Github項目 前日在健身房的組間同一位好友交流時&#xff0c;得到了一個一致結論—— ** Github \texttt{Githu…

藍橋杯 5. 交換瓶子

交換瓶子 原題目鏈接 題目描述 有 N 個瓶子&#xff0c;編號為 1 ~ N&#xff0c;放在架子上。 例如有 5 個瓶子&#xff0c;當前排列為&#xff1a; 2 1 3 5 4每次可以拿起 2 個瓶子&#xff0c;交換它們的位置。 要求通過若干次交換&#xff0c;使得瓶子的編號從小到大…

Linux 系統滲透提權

Linux 系統滲透提權 比賽題庫-Linux 系統滲透提權 文章目錄 Linux 系統滲透提權比賽題庫-Linux 系統滲透提權 前言一、解題過程1.使用滲透機對服務器信息收集&#xff0c;并將服務器中 SSH 服務端口號作為 flag 提 交&#xff1b;2.使用滲透機對服務器信息收集&#xff0c;并將…

華為OD機試真題——查找接口成功率最優時間段(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 A卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C、GO六種語言的最佳實現方式&#xff1b; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析&#xff1b; 本文收錄于專欄&#xff1a;《2025華為OD真題目錄…

華為OD機試真題——繪圖機器(2025A卷:100分)Java/python/JavaScript/C++/C/GO最佳實現

2025 A卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析&#xff1b; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式&#xff01; 本文收錄于專欄&#xff1a;《2025華為OD真題目錄全流程解析/備考攻略/經驗…

基于 Python(selenium) 的百度新聞定向爬蟲:根據輸入的關鍵詞在百度新聞上進行搜索,并爬取新聞詳情頁的內容

該項目能夠根據輸入的關鍵詞在百度新聞上進行搜索,并爬取新聞詳情頁的內容。 一、項目準備 1. 開發環境配置 操作系統:支持 Windows、macOS、Linux 等主流操作系統,本文以 Windows 為例進行說明。Python 版本:建議使用 Python 3.8 及以上版本,以確保代碼的兼容性和性能。…

MySQL表的操作 -- 表的增刪改查

目錄 1. 表的創建2. 表的查看3. 表的修改4. 表的刪除5. 總結 1. 表的創建 1.查看字符集及效驗規則 2. 表的創建 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校驗規則 engine 存儲引擎;創建用戶表1 創建用…

如何解決極狐GitLab 合并沖突?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 合并沖突 (BASIC ALL) 合并沖突發生在合并請求的兩個分支&#xff08;源分支和目標分支&#xff09;對相同代碼行進行了不同…

oracle不同數據庫版本的自增序列

-- 查看數據庫版本 SELECT * FROM v$version WHERE banner LIKE Oracle%; 1. Oracle 12c及以上版本支持 id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) PRIMARY KEY, -- 語法 id NUMBER GENER…

VIC-3D非接觸全場應變測量系統用于小尺寸測量之電子元器件篇—研索儀器DIC數字圖像相關技術

在5G通信、新能源汽車電子、高密度集成電路快速迭代的今天&#xff0c;電子元件的尺寸及連接工藝已進入亞毫米級競爭階段&#xff0c;這種小尺寸下的力學性能評估對測量方式的精度有更高的要求&#xff0c;但傳統應變測量手段常因空間尺寸限制及分辨率不足難以捕捉真實形變場。…