NuttX Socket 源碼學習

概述

NuttX 的 socket 實現是一個精心設計的網絡編程接口,提供了標準的 BSD socket API。該實現采用分層架構設計,支持多種網絡協議族(如 TCP/IP、UDP、Unix域套接字等),具有良好的可擴展性和模塊化特性。

整體架構設計

分層架構

NuttX socket 采用經典的分層架構設計:

應用層 API (socket, bind, connect, etc.)↓
Socket 抽象層 (socket.c, net_sockif.c)↓
協議族接口層 (inet, local, can, netlink, etc.)↓
具體協議實現層 (TCP, UDP, etc.)↓
設備接口層 (netdev)

核心組件

  1. Socket 抽象層: 提供統一的接口抽象,屏蔽不同協議族的差異

  2. 協議族接口: 為不同協議族提供統一的接口實現

  3. 連接管理: 管理 socket 連接的生命周期和狀態

  4. 數據傳輸: 處理數據的發送和接收

核心數據結構

1. struct socket - Socket 結構體

// 位置: nuttx/include/nuttx/net/net.h
struct socket
{uint8_t       s_domain;    // IP 域(協議族)uint8_t       s_type;      // 協議類型(SOCK_STREAM, SOCK_DGRAM等)uint16_t      s_proto;     // Socket 協議FAR void     *s_conn;      // 連接對象(繼承自 socket_conn_s)// Socket 接口函數表FAR const struct sock_intf_s *s_sockif;
};

作用:

  • 表示一個 socket 實例

  • 包含協議族、類型、協議等基本信息

  • 通過 s_sockif 指向具體的協議實現接口

2. struct socket_conn_s - Socket 連接基類

// 位置: nuttx/include/nuttx/net/net.h
struct socket_conn_s
{dq_entry_t node;        // 雙向鏈表節點// 回調函數鏈表(用于異步事件處理)FAR struct devif_callback_s *list;FAR struct devif_callback_s *list_tail;// Socket 選項
#ifdef CONFIG_NET_SOCKOPTSint16_t       s_error;     // 最后的錯誤碼sockopt_t     s_options;   // 選擇的 socket 選項socktimeo_t   s_rcvtimeo;  // 接收超時值(決秒)socktimeo_t   s_sndtimeo;  // 發送超時值(決秒)
#ifdef CONFIG_NET_SOLINGERsocktimeo_t   s_linger;    // Linger 超時值
#endif
#ifdef CONFIG_NET_BINDTODEVICEuint8_t       s_boundto;   // 綁定的網絡接口索引
#endif
#endifuint8_t       s_flags;     // Socket 狀態標志位uint8_t       s_tos;       // IPv4 服務類型/IPv6 流量類
#if defined(CONFIG_NET_IPv4) || defined(CONFIG_NET_IPv6)uint8_t       s_ttl;       // 默認生存時間
#endif
};

狀態標志位說明:

  • _SF_INITD: Socket 結構已初始化

  • _SF_NONBLOCK: 非阻塞模式

  • _SF_LISTENING: 正在監聽(SOCK_STREAM)

  • _SF_BOUND: 已綁定到地址

  • _SF_CONNECTED: 已連接

  • _SF_CLOSED: 已關閉

3. struct sock_intf_s - Socket 接口函數表

// 位置: nuttx/include/nuttx/net/net.h
struct sock_intf_s
{// 基本操作CODE int        (*si_setup)(FAR struct socket *psock);CODE sockcaps_t (*si_sockcaps)(FAR struct socket *psock);CODE void       (*si_addref)(FAR struct socket *psock);// 連接管理CODE int        (*si_bind)(FAR struct socket *psock,FAR const struct sockaddr *addr, socklen_t addrlen);CODE int        (*si_listen)(FAR struct socket *psock, int backlog);CODE int        (*si_connect)(FAR struct socket *psock,FAR const struct sockaddr *addr, socklen_t addrlen);CODE int        (*si_accept)(FAR struct socket *psock,FAR struct sockaddr *addr, FAR socklen_t *addrlen,FAR struct socket *newsock, int flags);// 數據傳輸CODE ssize_t    (*si_sendmsg)(FAR struct socket *psock,FAR struct msghdr *msg, int flags);CODE ssize_t    (*si_recvmsg)(FAR struct socket *psock,FAR struct msghdr *msg, int flags);// 信息獲取CODE int        (*si_getsockname)(FAR struct socket *psock,FAR struct sockaddr *addr, FAR socklen_t *addrlen);CODE int        (*si_getpeername)(FAR struct socket *psock,FAR struct sockaddr *addr, FAR socklen_t *addrlen);// 其他操作CODE int        (*si_poll)(FAR struct socket *psock,FAR struct pollfd *fds, bool setup);CODE int        (*si_close)(FAR struct socket *psock);CODE int        (*si_ioctl)(FAR struct socket *psock,int cmd, unsigned long arg);CODE int        (*si_shutdown)(FAR struct socket *psock, int how);// 可選功能
#ifdef CONFIG_NET_SOCKOPTSCODE int        (*si_getsockopt)(FAR struct socket *psock, int level,int option, FAR void *value, FAR socklen_t *value_len);CODE int        (*si_setsockopt)(FAR struct socket *psock, int level,int option, FAR const void *value, socklen_t value_len);
#endif
#ifdef CONFIG_NET_SENDFILECODE ssize_t    (*si_sendfile)(FAR struct socket *psock,FAR struct file *infile, FAR off_t *offset, size_t count);
#endif
};

作用: 定義了所有 socket 操作的虛函數表,實現多態性支持不同協議族。

Socket 生命周期管理

1. Socket 創建 (socket.c)

函數: psock_socket(int domain, int type, int protocol, FAR struct socket *psock)

流程:

  1. 參數驗證和類型掩碼處理

  2. 初始化 socket 基本結構

  3. 嘗試 usrsock 接口(如果啟用)

  4. 通過 net_sockif() 獲取協議族接口

  5. 調用協議族的 si_setup() 進行特定初始化

  6. 設置非阻塞標志和初始化標志

int psock_socket(int domain, int type, int protocol, FAR struct socket *psock)
{FAR const struct sock_intf_s *sockif = NULL;int ret;// 參數驗證if (type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK | SOCK_TYPE_MASK)){return -EINVAL;}// 初始化 socket 結構psock->s_domain = domain;psock->s_proto  = protocol;psock->s_conn   = NULL;psock->s_type   = type & SOCK_TYPE_MASK;// 獲取協議族接口sockif = net_sockif(domain, psock->s_type, psock->s_proto);if (sockif == NULL){return -EAFNOSUPPORT;}// 協議族特定初始化psock->s_sockif = sockif;ret = sockif->si_setup(psock);if (ret >= 0){FAR struct socket_conn_s *conn = psock->s_conn;if (type & SOCK_NONBLOCK){conn->s_flags |= _SF_NONBLOCK;}conn->s_flags |= _SF_INITD;}return ret;
}

2. Socket 綁定 (bind.c)

函數: psock_bind(FAR struct socket *psock, const struct sockaddr *addr, socklen_t addrlen)

流程:

  1. 驗證 socket 和地址有效性

  2. 調用協議族的 si_bind() 實現

  3. 設置 _SF_BOUND 標志

int psock_bind(FAR struct socket *psock, const struct sockaddr *addr, socklen_t addrlen)
{int ret = OK;// 驗證參數if (!psock || psock->s_conn == NULL){return -EBADF;}if (addr == NULL){return -EFAULT;}// 調用協議族的綁定實現if (psock->s_sockif->si_bind == NULL){return -EOPNOTSUPP;}ret = psock->s_sockif->si_bind(psock, addr, addrlen);// 設置綁定標志if (ret >= 0){FAR struct socket_conn_s *conn = psock->s_conn;conn->s_flags |= _SF_BOUND;}return ret;
}

3. Socket 連接 (connect.c)

函數: psock_connect(FAR struct socket *psock, FAR const struct sockaddr *addr, socklen_t addrlen)

特點:

  • 支持阻塞和非阻塞連接

  • 取消點支持(可被信號中斷)

  • 連接狀態管理

4. Socket 監聽和接受 (listen.c, accept.c)

監聽: psock_listen() - 設置 _SF_LISTENING 標志 接受: psock_accept() - 創建新的連接 socket

數據傳輸機制

1. 發送數據架構

send() -> sendto() -> sendmsg() -> psock_sendmsg() -> si_sendmsg()

統一接口: 所有發送函數最終都通過 psock_sendmsg() 實現

// send.c 中的實現
ssize_t psock_send(FAR struct socket *psock, FAR const void *buf, size_t len, int flags)
{struct msghdr msg;struct iovec iov;// 構造 msghdr 結構iov.iov_base = (FAR void *)buf;iov.iov_len = len;msg.msg_name = NULL;msg.msg_namelen = 0;msg.msg_iov = &iov;msg.msg_iovlen = 1;msg.msg_control = NULL;msg.msg_controllen = 0;msg.msg_flags = 0;// 統一調用 sendmsgreturn psock_sendmsg(psock, &msg, flags);
}

2. 接收數據架構

recv() -> recvfrom() -> recvmsg() -> psock_recvmsg() -> si_recvmsg()

特點:

  • 支持阻塞和非阻塞接收

  • 超時控制

  • 取消點支持

協議族支持

1. 協議族注冊機制

通過 net_sockif() 函數進行協議族路由:

FAR const struct sock_intf_s *net_sockif(sa_family_t family, int type, int protocol)
{switch (family){case PF_INET:      // IPv4case PF_INET6:     // IPv6return inet_sockif(family, type, protocol);case PF_LOCAL:     // Unix 域套接字return &g_local_sockif;case PF_CAN:       // CAN 總線return &g_can_sockif;case PF_NETLINK:   // Netlink 套接字return &g_netlink_sockif;case PF_PACKET:    // 原始包套接字return &g_pkt_sockif;case PF_BLUETOOTH: // 藍牙套接字return &g_bluetooth_sockif;case PF_IEEE802154: // IEEE 802.15.4return &g_ieee802154_sockif;case PF_RPMSG:     // RPMSG 套接字return &g_rpmsg_sockif;default:return NULL;}
}

2. 主要協議族

  1. INET 協議族 (IPv4/IPv6):

    • 支持 TCP、UDP、ICMP 等協議

    • 完整的網絡功能支持

  2. LOCAL 協議族 (Unix 域套接字):

    • 進程間通信

    • 支持 SOCK_STREAM 和 SOCK_DGRAM

  3. CAN 協議族:

    • CAN 總線通信

    • 汽車電子應用

  4. 其他協議族:

    • NETLINK: 內核通信

    • PACKET: 原始數據包

    • BLUETOOTH: 藍牙通信

Socket 選項管理

1. Socket 選項位定義

// socket.h 中的定義
#define _SO_BIT(o)       (1 << (o))#define _SO_BROADCAST    _SO_BIT(SO_BROADCAST)    // 廣播權限
#define _SO_DEBUG        _SO_BIT(SO_DEBUG)        // 調試信息
#define _SO_DONTROUTE    _SO_BIT(SO_DONTROUTE)    // 繞過路由
#define _SO_KEEPALIVE    _SO_BIT(SO_KEEPALIVE)    // 保持連接活躍
#define _SO_LINGER       _SO_BIT(SO_LINGER)       // 延遲關閉
#define _SO_OOBINLINE    _SO_BIT(SO_OOBINLINE)    // 帶外數據內聯
#define _SO_RCVBUF       _SO_BIT(SO_RCVBUF)       // 接收緩沖區大小
#define _SO_RCVTIMEO     _SO_BIT(SO_RCVTIMEO)     // 接收超時
#define _SO_REUSEADDR    _SO_BIT(SO_REUSEADDR)    // 地址重用
#define _SO_SNDBUF       _SO_BIT(SO_SNDBUF)       // 發送緩沖區大小
#define _SO_SNDTIMEO     _SO_BIT(SO_SNDTIMEO)     // 發送超時
#define _SO_TIMESTAMP    _SO_BIT(SO_TIMESTAMP)    // 時間戳
#define _SO_BINDTODEVICE _SO_BIT(SO_BINDTODEVICE) // 綁定到設備

2. 選項操作宏

#define _SO_SETOPT(s,o)  ((s) |= _SO_BIT(o))   // 設置選項
#define _SO_CLROPT(s,o)  ((s) &= ~_SO_BIT(o))  // 清除選項
#define _SO_GETOPT(s,o)  (((s) & _SO_BIT(o)) != 0) // 檢查選項

3. 錯誤處理宏

#ifdef CONFIG_NET_SOCKOPTS
#define _SO_SETERRNO(s,e) \do { \if (s != NULL) { \_SO_CONN_SETERRNO((s)->s_conn, e); \} \} while (0)
#endif

超時控制機制

1. 超時值定義

typedef uint16_t socktimeo_t;  // 超時類型(決秒為單位,1決秒=0.1秒)#define _SO_TIMEOUT(t) ((t) ? (t) * MSEC_PER_DSEC : UINT_MAX)

2. 超時檢查函數

// net_timeo.c
int net_timeo(clock_t start_time, socktimeo_t timeo)
{// 檢查是否超時if (timeo != 0){clock_t elapsed = clock() - start_time;if (elapsed >= timeo * MSEC_PER_DSEC){return 1; // 超時}}return 0; // 未超時
}

錯誤處理機制

1. 錯誤碼設置

每個 socket 連接結構都包含錯誤字段:

int16_t s_error;  // 最后發生的錯誤

2. 錯誤傳播

  • 內核錯誤通過返回負的錯誤碼

  • 用戶空間API通過設置 errno 并返回 -1

3. 常見錯誤碼

  • EBADF: 無效的文件描述符

  • EAFNOSUPPORT: 不支持的地址族

  • EADDRINUSE: 地址已被使用

  • ECONNREFUSED: 連接被拒絕

  • ETIMEDOUT: 連接超時

  • EAGAIN: 資源暫時不可用

內存管理

1. 連接結構分配

每個協議族負責分配和管理自己的連接結構:

// 例如 TCP 連接分配
FAR struct tcp_conn_s *conn = tcp_alloc();
psock->s_conn = conn;

2. 緩沖區管理

  • 使用 IOB (I/O Buffer) 進行數據緩沖

  • 支持零拷貝優化

  • 動態內存分配和釋放

同步機制

1. 網絡鎖

net_lock();     // 獲取網絡全局鎖
// 臨界區代碼
net_unlock();   // 釋放網絡全局鎖

2. 回調機制

使用 devif_callback_s 結構進行異步事件處理:

struct devif_callback_s
{FAR struct devif_callback_s *nxtdev;  // 下一個回調uint16_t flags;                       // 事件標志uint16_t priv;                        // 私有數據devif_callback_event_t event;         // 回調函數
};

調試和監控

1. 調試宏

#ifdef CONFIG_DEBUG_NET
#  define ninfo(format, ...)   info(format, ##__VA_ARGS__)
#  define nerr(format, ...)    err(format, ##__VA_ARGS__)
#else
#  define ninfo(x...)
#  define nerr(x...)
#endif

2. 統計信息

NuttX 提供網絡統計信息用于監控和調試:

  • 連接數統計

  • 數據包統計

  • 錯誤統計

性能優化

1. 零拷貝支持

  • sendfile() 實現零拷貝文件傳輸

  • IOB 鏈表減少內存拷貝

2. 異步I/O

  • 非阻塞操作支持

  • poll/select 多路復用

  • 回調驅動的事件處理

3. 緩沖區優化

  • 可配置的緩沖區大小

  • 動態緩沖區分配

  • 內存池管理

配置選項

1. 主要配置項

CONFIG_NET                    // 啟用網絡支持
CONFIG_NET_SOCKOPTS          // 啟用 socket 選項
CONFIG_NET_SOLINGER          // 啟用 linger 選項
CONFIG_NET_BINDTODEVICE      // 啟用綁定到設備
CONFIG_NET_SENDFILE          // 啟用 sendfile 支持
CONFIG_NET_USRSOCK           // 啟用用戶空間 socket

2. 協議族配置

CONFIG_NET_LOCAL             // Unix 域套接字
CONFIG_NET_CAN               // CAN 總線
CONFIG_NET_NETLINK           // Netlink 套接字
CONFIG_NET_PKT               // 原始包套接字
CONFIG_NET_BLUETOOTH         // 藍牙支持
CONFIG_NET_IEEE802154        // IEEE 802.15.4 支持

擴展新協議族的方法

1. 定義協議族接口

const struct sock_intf_s g_myproto_sockif =
{myproto_setup,       // 初始化myproto_sockcaps,    // 能力查詢myproto_addref,      // 引用計數myproto_bind,        // 綁定myproto_getsockname, // 獲取本地地址myproto_getpeername, // 獲取對端地址myproto_listen,      // 監聽myproto_connect,     // 連接myproto_accept,      // 接受連接myproto_poll,        // 輪詢myproto_sendmsg,     // 發送消息myproto_recvmsg,     // 接收消息myproto_close,       // 關閉myproto_ioctl,       // 控制操作myproto_socketpair,  // 創建套接字對myproto_shutdown     // 關閉連接
};

2. 在 net_sockif() 中注冊

case PF_MYPROTO:sockif = &g_myproto_sockif;break;

3. 實現連接結構

struct myproto_conn_s
{struct socket_conn_s sconn;  // 基類(必須是第一個成員)// 協議特定的字段// ...
};

最佳實踐

1. 錯誤處理

  • 始終檢查函數返回值

  • 適當設置和傳播錯誤碼

  • 提供有意義的錯誤信息

2. 內存管理

  • 及時釋放分配的資源

  • 避免內存泄漏

  • 使用引用計數管理共享資源

3. 并發安全

  • 適當使用網絡鎖保護臨界區

  • 避免死鎖和競態條件

  • 考慮中斷上下文的安全性

4. 性能考慮

  • 減少不必要的內存拷貝

  • 使用適當的緩沖區大小

  • 考慮異步操作的使用

總結

NuttX 的 socket 實現展現了優秀的軟件架構設計:

  1. 分層設計: 清晰的抽象層次,良好的模塊化

  2. 多態支持: 通過函數指針表實現協議族的多態性

  3. 可擴展性: 易于添加新的協議族支持

  4. 標準兼容: 遵循 POSIX/BSD socket API 標準

  5. 性能優化: 零拷貝、異步I/O等優化技術

  6. 健壯性: 完善的錯誤處理和資源管理

這個實現為嵌入式系統提供了功能完整、性能優秀的網絡編程接口,是學習網絡協議棧設計的優秀范例。

參考文件列表

  • nuttx/net/socket/socket.h - Socket 模塊頭文件

  • nuttx/net/socket/socket.c - Socket 創建實現

  • nuttx/net/socket/net_sockif.c - 協議族接口路由

  • nuttx/net/socket/bind.c - Socket 綁定實現

  • nuttx/net/socket/connect.c - Socket 連接實現

  • nuttx/net/socket/accept.c - 連接接受實現

  • nuttx/net/socket/send.c - 數據發送實現

  • nuttx/net/socket/recv.c - 數據接收實現

  • nuttx/net/socket/setsockopt.c - Socket 選項設置

  • nuttx/net/socket/getsockopt.c - Socket 選項獲取

  • nuttx/include/nuttx/net/net.h - 網絡核心數據結構定義

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

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

相關文章

基于YOLO的語義分割實戰(以豬的分割為例)

數據集準備 數據集配置文件 其實語義分割和目標檢測類似&#xff0c;包括數據集制備、存放格式基本一致像這樣放好即可。 然后需要編寫一個data.yaml文件&#xff0c;對應的是數據的配置文件。 train: C:\圖標\dan\語義分割pig\dataset\train\images #絕對路徑即可 val: C:\…

釘釘智能會議室集成指紋密碼鎖,臨時開門密碼自動下發

在當今快節奏的工作環境中&#xff0c;會議室的高效管理和使用成為了企業提升工作效率的關鍵一環。湖南某知名企業近期成功升級了原有使用的釘釘智能會議室系統&#xff0c;并配套使用了啟辰智慧聯網指紋密碼鎖&#xff0c;實現了會議室管理的智能化升級&#xff0c;提升了會議…

C++講解—類(1)

類 在 C 中&#xff0c;類是一個關鍵概念&#xff0c;憑借其封裝和繼承的特性&#xff0c;能夠助力程序員之間實現高效的分工協作&#xff0c;共同完成復雜的大型項目。我們先從最簡單的概念入手&#xff0c;再進行更深層次的了解和應用。 1. 類的定義 類是用戶自定義的一種…

什么是Hadoop Yarn

Hadoop YARN&#xff1a;分布式集群資源管理系統詳解 1. 什么是YARN&#xff1f; YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Apache Hadoop 生態系統中的資源管理和作業調度系統&#xff0c;最初在 Hadoop 2.0 中引入&#xff0c;取代了 Hadoop 1.0 的…

項目開發中途遇到困難的解決方案

1. 正視困難&#xff0c;避免逃避 開發遇阻時&#xff0c;退縮會帶來雙重損失&#xff1a;既成為"失敗者逃兵"&#xff0c;又損害職業信心1。 行動建議&#xff1a; 立即向團隊透明化問題&#xff08;如進度延遲、技術瓶頸&#xff09;&#xff0c;避免問題滾雪球…

Blender硬表面建模篇收集學習建模過程中的Demo

c 齒輪 創建一個圓柱體&#xff0c;選擇側面的所有&#xff0c;然后進行隔斷選擇&#xff0c;兩次擠出面&#xff0c;一次縮放面&#xff0c;通過圓柱面三次插入面縮放擠出得到齒輪中心&#xff0c;選中齒輪的鋸齒中間&#xff0c;然后進行相同周長選擇行選擇齒與齒中間的面&…

Chromium 136 編譯指南 macOS篇:獲取源代碼(四)

1. 引言 在現代軟件開發的宏大版圖中&#xff0c;源代碼的獲取往往標志著從理論探索向實踐應用的關鍵轉折。對于Chromium 136這樣一個擁有超過2500萬行代碼、涉及數百個第三方庫的超大規模開源項目而言&#xff0c;源代碼的獲取不僅僅是簡單的文件下載&#xff0c;更是一個涉及…

OpenCV C++ 邊緣檢測與圖像分割

一、邊緣檢測 在數字圖像處理領域&#xff0c;邊緣檢測是一項至關重要的基礎技術。它如同為圖像賦予 “骨架”&#xff0c;幫助計算機快速識別圖像中的物體輪廓、形狀與結構&#xff0c;廣泛應用于目標識別、圖像分割、圖像配準等多個領域。 1.1 概念 邊緣檢測的核心目標是找…

線段樹(2025年6月14日)

原文 https://www.beiweidoge.top/132.html P1&#xff1a;求最大值1 題目描述 題目描述 小明給了你n個數字&#xff0c;你需要依次輸出&#xff1a; 1到n的最大值&#xff0c;1到n/2的最大值&#xff0c;n/21到n的最大值&#xff0c;1到n/4的最大值&#xff0c;n/41到n/2…

滲透實戰PortSwigger Labs AngularJS DOM XSS利用詳解

本Lab學習到關于AngularJS的 xss 漏洞利用 直接輸入回顯頁面&#xff0c;但是把<>進了 html 編碼了 當我們輸入{{11}}&#xff0c;沒有當作字符處理&#xff0c;而是執行了 {{}} 是多種前端框架&#xff08;如 Vue、Angular、Django 模板等&#xff09;中常見的模板插值語…

Ubuntu 多網卡安全路由配置(SSH 不斷線版)

Ubuntu 多網卡路由配置筆記&#xff08;內網 外網同時通&#xff09;&#xff08;SSH斷線版&#xff09;文章瀏覽閱讀386次&#xff0c;點贊4次&#xff0c;收藏5次。本文介紹了Ubuntu 如何配置雙網卡設備的路由規則&#xff0c;使默認流量走外網&#xff08;192.168.2.0/24&a…

基于昇騰NPU部署llamafactory單機多卡微調Qwen3教程

1. 進入華為云 華為云首頁 點擊右上角控制臺 2.進入ModelArts 點擊搜索框->搜索“ModelArts”->選擇AI開發平臺ModelArts->進入平臺后點擊開發者空間 3.創建Notebook 3.1在開發者空間中點擊Notebook->在西南貴陽一下點擊創建Notebook 3.2進入創建Notebook頁…

關于XES文件格式諸多問題

1. 格式類型是什么&#xff1f; case:concept:name (案例ID) - 必須是字符串類型concept:name (活動名稱) - 字符串類型time:timestamp - 必須是datetime類型 2. 如何修改&#xff1f; data[case:concept:name] data[case:concept:name].astype(str)data[concept:name] data…

數據融合平臺有哪些?在數據治理中發揮什么作用?

目錄 一、常見的數據融合平臺 &#xff08;一&#xff09;傳統數據融合平臺 &#xff08;二&#xff09;實時數據融合平臺 &#xff08;三&#xff09;云數據融合平臺 二、數據融合平臺在數據治理中的作用 &#xff08;一&#xff09;提升數據質量 &#xff08;二&#…

??Linux:XFS 文件系統擴容完整指南

???問題背景?? 在擴展 Linux 根目錄 / 時,我遇到了一個錯誤: sudo resize2fs /dev/uos/root resize2fs: 超級塊中的幻數有錯 嘗試打開 /dev/uos/root 時找不到有效的文件系統超級塊。 經過排查,發現根本原因是 ??文件系統類型是 XFS??,而 resize2fs 僅適用于 e…

網絡安全之CTF專題賽RE題解

easyre hap文件改成zip格式然后解壓去反編譯abc文件即可拿到源碼 這里推薦一個網站.abcD 蠻好用的 下載反編譯結果&#xff0c;解壓后用vscode打開分析。 這里可以看到一些目錄結構&#xff0c;我們先看看flag目錄 x_2_2.count位1000000的時候就會輸出flag那么大概率是一個點…

a padding to disable MSIE and Chrome friendly error page

問題 a padding to disable MSIE and Chrome friendly error page 解決 nginx 代理地址 配錯了

71、C# Parallel.ForEach 詳解

Parallel.ForEach 是 .NET Framework 4.0 引入的并行編程功能的一部分&#xff0c;位于 System.Threading.Tasks 命名空間中。它允許你對集合中的元素進行并行處理&#xff0c;可以顯著提高處理大量數據時的性能。 基本用法 using System; using System.Collections.Generic;…

生產者-消費者模式在不同操作系統上的行為差異

在多線程編程中&#xff0c;生產者-消費者模式是一種常見的設計模式&#xff0c;用于解決線程間的數據同步問題。最近&#xff0c;我在 Linux 和 macOS 上運行同一個生產者-消費者模式的程序時&#xff0c;發現它們表現出不同的行為。本文將介紹這個現象、分析其原因&#xff0…

【JS-4.1-DOM獲取元素操作】深入理解DOM操作:高效獲取頁面元素的方法與實踐

在現代Web開發中&#xff0c;DOM&#xff08;文檔對象模型&#xff09;操作是前端工程師的必備技能。而DOM操作的第一步&#xff0c;往往是從頁面中獲取我們需要操作的元素。本文將全面介紹各種獲取頁面元素的方法&#xff0c;分析它們的性能特點&#xff0c;并提供最佳實踐建議…