第十四章 netlink机制--基于Linux3.10

2023-11-12

Netlink基于网络的消息机制,能够让用户和内核空间进行通信,12.3节提到的ifconfig是使用ioctl方法和内核通信的,而ip命令则是使用netlink和内核通信的。该机制初衷是为网络服务的,但是现在起应用范围已经大大扩展。

14.1 netlink支持的通信

用户空代码使用实例,发送消息时内核使用同一套代码,也就是说调用这套消息机制代码除了可以发送netlink消息还可以发送其它消息,但是这些消息又各有不同,并且netlink本身也分为好多种,内核在处理这些不同时,使用了两个结构体解决这个问题。

struct msghdr {
	void	*	msg_name;	/* Socket name			*/
	int		msg_namelen;	/* Length of name		*/
	struct iovec *	msg_iov;	/* Data blocks			*/
	__kernel_size_t	msg_iovlen;	/* Number of blocks		*/
	void 	*	msg_control;	/* Per protocol magic (eg BSD file descriptor passing) */
	__kernel_size_t	msg_controllen;	/* Length of cmsg list */
	unsigned int	msg_flags;
};

该结构体用于描述不同的消息,msg_iov存放的是消息内容,针对netlink消息有nlmsghdr头来描述。

struct nlmsghdr {
	__u32		nlmsg_len;	/* Length of message including header */
	__u16		nlmsg_type;	/* Message content */
	__u16		nlmsg_flags;	/* Additional flags */
	__u32		nlmsg_seq;	/* Sequence number */
	__u32		nlmsg_pid;	/* Sending process port ID */
};

下面的代码片段展示了netlink的基本用法。

12 #define SEND_TEST_DATA "Hello Word"
 13 
 14 struct event_msg{
 15     unsigned int event;
 16     unsigned int sub_event;
 17     unsigned int len;
 18     unsigned char data[0];
 19 };
 20 /* DEMO SUB EVENT */
 21 #define LOOP_UNICAST                    1
 22 #define LOOP_BROADCAST                  2
 23 
 24 #define PRIVATE_EVENT_GROUP   2
 25 #define NETLINK_TEST          17
 26 #define MAX_PAYLOAD           512  /* maximum payload size*/
 27 #define TEST_CNT              100000
 28 
 29 struct hello _info {
 30     unsigned int idx;  //idx
 31     unsigned int irq_type;
 32     unsigned long timestamp; //jiffies
 33 };
 34 
 35 
 36 
 37 int main(int argc, char* argv[])
 38 {
 39     int i;
 40     struct sockaddr_nl src_addr, dest_addr;
 41     struct nlmsghdr *nlh = NULL;
 42     struct iovec iov;
 43     int sock_fd;
 44     struct msghdr message,recv_msg;
 45     struct event_msg *msg;
 46     struct alarm_info *alarm_info;

//创建netlink套接字,第三个参数是netlink协议类型,所有的类型见下文。
 48     sock_fd = socket(PF_NETLINK, SOCK_RAW,NETLINK_TEST);
 49     memset(&message, 0, sizeof(message));
 50     memset(&src_addr, 0, sizeof(src_addr));
 51     src_addr.nl_family = AF_NETLINK;
 52     src_addr.nl_pid = getpid();  
 53     src_addr.nl_groups = PRIVATE_EVENT_GROUP ;  
/*************************************************************************************
*******struct sockaddr_nl {
*******	__kernel_sa_family_t	nl_family;	/* AF_NETLINK	*/
*******	unsigned short	nl_pad;		/* zero		*/
*******	__u32		nl_pid;		/* port ID	*/
*******       	__u32		nl_groups;	/* multicast groups mask */
*******};
*************************************************************************************/

 54     bind(sock_fd, (struct sockaddr*)&src_addr, sizeof(src_addr));  //将netlink套接字和netlink地址绑定。
 55     memset(&dest_addr, 0, sizeof(dest_addr));
 56 
 57     dest_addr.nl_family = AF_NETLINK;
 58     dest_addr.nl_pid = 0;   /* For Linux Kernel */
 59     dest_addr.nl_groups = PRIVATE_EVENT_GROUP;
 60 
61     nlh=(struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));
 62     /* 参看图14.1;*/
 63     nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD);
 64     nlh->nlmsg_pid = getpid();  /* self pid */
 65     nlh->nlmsg_flags = 0;
 66 
 67     for (i = 0;i < TEST_CNT;i++){
 68         /* Fill in the netlink message payload */

//将netlink信息和msg关联起来。
70         msg = NLMSG_DATA(nlh); //消息头的首部存放netlink的头,见图14.1。
 71         msg->event = 0;
 72         msg->sub_event = (i%2) + 1;
 73         msg->len = sizeof(SEND_TEST_DATA);//Hello Word字符串在payload里了,见图14.1。
 74         strcpy(msg->data, SEND_TEST_DATA);
 75 
 76         //printf("test %d time; %s\n",i,(msg->sub_event == LOOP_UNICAST) ? "UNICAST" : "BROADCAST");
 77         iov.iov_base = (void *)nlh; //这边管理netlink头,也是关联msg,在70行,netlink和msg的关系就确定了。
 78         iov.iov_len = nlh->nlmsg_len;
 79         message.msg_name = (void *)&dest_addr;
 80         message.msg_namelen = sizeof(dest_addr);
 81         message.msg_iov = &iov;
 82         message.msg_iovlen = 1;
 83 
 84         sendmsg(sock_fd, &message, 0); //发送消息给内核
 85         /* Read message from kernel */
 86 
 87         memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));
 88         recvmsg(sock_fd, &message, 0); //从内核接收消息
 89         msg = NLMSG_DATA(nlh);
 90         hello _info = (struct hello_info *)&msg->data;
 91         if ( msg->event == 3)
 92         {
 93             printf("recv event %dsub_event %d  alarm_info.\n",msg->event, msg->sub_event);
96         }
 97     }
 98     close(sock_fd);
 99     return 0;
100 }

Netlink消息类型

Include/uapi/linux/netlink.h
  8 #define NETLINK_ROUTE       0   /* Routing/device hook              */
  9 #define NETLINK_UNUSED      1   /* Unused number                */
 10 #define NETLINK_USERSOCK    2   /* Reserved for user mode socket protocols  */
 11 #define NETLINK_FIREWALL    3   /* Unused number, formerly ip_queue     */
 12 #define NETLINK_SOCK_DIAG   4   /* socket monitoring                */
 13 #define NETLINK_NFLOG       5   /* netfilter/iptables ULOG */
 14 #define NETLINK_XFRM        6   /* ip security*/
 15 #define NETLINK_SELINUX     7   /* SELinux event notifications */
 16 #define NETLINK_ISCSI       8   /* Open-iSCSI */
 17 #define NETLINK_AUDIT       9   /* auditing */
 18 #define NETLINK_FIB_LOOKUP  10  
 19 #define NETLINK_CONNECTOR   11
 20 #define NETLINK_NETFILTER   12  /* netfilter subsystem */
 21 #define NETLINK_IP6_FW      13
 22 #define NETLINK_DNRTMSG     14  /* DECnet routing messages */
 23 #define NETLINK_KOBJECT_UEVENT  15  /* Kernel messages to userspace */
 24 #define NETLINK_GENERIC     16
 25 /* leave room for NETLINK_DM (DM Events) */
 26 #define NETLINK_SCSITRANSPORT   18  /* SCSI Transports */
 27 #define NETLINK_ECRYPTFS    19
 28 #define NETLINK_RDMA        20
 29 #define NETLINK_CRYPTO      21  /* Crypto layer */
 30 
 31 #define NETLINK_INET_DIAG   NETLINK_SOCK_DIAG
 32 
 33 #define MAX_LINKS 32   

图14.1 netlink消息格式

14.2 netlink用户空间API

在第六章提到套接字创建的系统调用时,提到实际的套接字创建是由具体的协议族的套接字创建函数来完成的,其调用形如err = pf->create(net, sock, protocol, kern);在af_netlink.c文件中netlink协议族的创建netlink套接字的注册的结构体如下。

static const struct net_proto_family netlink_family_ops = {
	.family = PF_NETLINK,
	.create = netlink_create,
	.owner	= THIS_MODULE,	/* for consistency 8) */
};

其创建netlink套接字的过程和inet套接字是一样的。和inet协议很相似,netlink实现相关的主要代码在af_netlink.c(inet也有一个af_inet.c)文件。

14.3 netlink内核空间API 

14.2节的内容是针对用户空间的,这本小节则是针对内核而言的。Netlink内核创建API位于include/linux/netlink.h。在14.1节的netlink应用程序调用14.2节的netlink套接字创建API创建netlink套接字,并发送了一个netlink消息,在内核侧有对应的netlink套接字接收应用程序发送的消息。内核侧创建netlink消息方法和应用程序调用的接口并不一样。接收应用程序发送的消息的内核侧驱动程序netlink创建的netlink代码片段可以看出。312~319行可以看到netlink套接字创建接口的参数随着内核版本的升级发生了一些变化。本文基于3.10内核,所以创建的API是318行代码中的netlink_kernel_create。

304 static int event_notify_init(void)
305 {
306     struct sock *nlsock = NULL;
307     int ret;
308     struct netlink_kernel_cfg cfg = {
309         .input  = event_notify_receive_skb,
310     };
311 
312 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24))
313     nlsock = netlink_kernel_create(EVENT_NOTIFY, 0, event_notify_receive_skb, THIS_MODULE);
314 #elif (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
315     nlsock = netlink_kernel_create(&init_net, EVENT_NOTIFY, 0,
316             event_notify_receive_skb, NULL, THIS_MODULE);
317 #else
318     nlsock = netlink_kernel_create(&init_net, EVENT_NOTIFY, &cfg);
319 #endif
320 
321     if (nlsock) {
322         en_nlsock = nlsock;
323         ret = init_events(events_group);
324         if (ret) {
325             printk(KERN_ERR "some events init fail\n");
326         }
327         return 0;
328     }else{
329         printk(KERN_ERR "create netlink %d error\n",EVENT_NOTIFY);
330         return -1;
331     }
332 }

Netlink内核侧的创建函数实际是对__netlink_kernel_create的封装。

af_netlink.c
54 static inline struct sock *
 55 netlink_kernel_create(struct net *net, int unit, struct netlink_kernel_cfg *cfg)
 56 {
 57     return __netlink_kernel_create(net, unit, THIS_MODULE, cfg);
 58 }

其调用的函数位于af_netlink.c,*net指向所在的网络命名空间,unit是netlink协议类型,module是模块所有者信息,cfg存放的是netlink内核配置参数,配置参数中的input成员用于处理接收到的消息,对于上面的驱动程序只初始化了cfg的input函数指针。该回调函数在应用程序调用sendmsg()发送消息时被调用。

2229 struct sock *
2230 __netlink_kernel_create(struct net *net, int unit, struct module *module,
2231             struct netlink_kernel_cfg *cfg)
2232 {
2233     struct socket *sock;
2234     struct sock *sk;
2235     struct netlink_sock *nlk;
2236     struct listeners *listeners = NULL;
2237     struct mutex *cb_mutex = cfg ? cfg->cb_mutex : NULL;
2238     unsigned int groups;
2239 
2240     BUG_ON(!nl_table);
2241 
2242     if (unit < 0 || unit >= MAX_LINKS)
2243         return NULL;
//为sock申请套接字存储空间,并将套接字类型设置为SOCK_DGRAM。
2245     if (sock_create_lite(PF_NETLINK, SOCK_DGRAM, unit, &sock))
2246         return NULL;
//按netlink机制需要初始化套接字相应的成员。注意是在初始网络命名空间中完成的。
2254     if (__netlink_create(&init_net, sock, cb_mutex, unit) < 0)
2255         goto out_sock_release_nosk;
//更新套接字命名空间
2257     sk = sock->sk;
2258     sk_change_net(sk, net);
2259 
2260     if (!cfg || cfg->groups < 32)
2261         groups = 32;
2262     else
2263         groups = cfg->groups;
2264 
2265     listeners = kzalloc(sizeof(*listeners) + NLGRPSZ(groups), GFP_KERNEL);
2266     if (!listeners)
2267         goto out_sock_release; 
2268 
2269     sk->sk_data_ready = netlink_data_ready;
2270     if (cfg && cfg->input)
2271         nlk_sk(sk)->netlink_rcv = cfg->input; //设置netlink消息接收处理函数。
2272 
2273     if (netlink_insert(sk, net, 0))
2274         goto out_sock_release;
2275 
2276     nlk = nlk_sk(sk);
2277     nlk->flags |= NETLINK_KERNEL_SOCKET;
2278 
2279     netlink_table_grab();//将进程放到nl_table_wait等待链表上,并调度其它进程。
2280     if (!nl_table[unit].registered) {
2281         nl_table[unit].groups = groups;
2282         rcu_assign_pointer(nl_table[unit].listeners, listeners);
2283         nl_table[unit].cb_mutex = cb_mutex;
2284         nl_table[unit].module = module;
2285         if (cfg) {
2286             nl_table[unit].bind = cfg->bind;
2287             nl_table[unit].flags = cfg->flags;
2288         }
2289         nl_table[unit].registered = 1;
2290     } else {
2291         kfree(listeners);
2292         nl_table[unit].registered++;
2293     }
2294     netlink_table_ungrab();
2295     return sk;
2296 
2297 out_sock_release:
2298     kfree(listeners);
2299     netlink_kernel_release(sk);
2300     return NULL;
2301 
2302 out_sock_release_nosk:
2303     sock_release(sock); //内核关闭netlink套接字API。
2304     return NULL;
2305 }

Netlink内核发送消息的内核空间API是:

netlink_unicast
netlink_broadcast

发送消息的代码片段如下:

if (pid) {
	/* unicast */
	NETLINK_CB(skb).portid = pid;
	ret = netlink_unicast(nlsock, skb, pid, MSG_DONTWAIT);//单播发送法
}else{
	/* broadcast */
	NETLINK_CB(skb).dst_group = group;
	ret = netlink_broadcast(nlsock, skb, 0, group, 0);//广播发送法
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第十四章 netlink机制--基于Linux3.10 的相关文章

  • 使用端口 80 (Ubuntu / Linode) 运行 Node.js 的最佳实践 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在设置我的第一个Node js服务器上的cloud Linux node我对以下细节还很陌生Linux admin 顺便说一句 我并没有尝试
  • 如何在没有 root 访问权限的情况下在 Ubuntu 上安装 Google Test?

    我正在尝试根据以下方式安装 Google Test这个答案 https stackoverflow com a 21314020 6560773在没有 root 访问权限的 Ubuntu 上 因为我需要在工作中学习和使用它 设法在我自己的用
  • 获取后台进程的退出代码

    我有一个从我的主 bourne shell 脚本中调用的命令 CMD 该命令需要很长时间 我想修改脚本如下 作为后台进程并行运行命令 CMD CMD 在主脚本中 有一个循环每隔几秒监视生成的命令 该循环还向标准输出回显一些消息 指示脚本的进
  • Linux下对多个文件进行排序

    我有多个 很多 文件 每个都非常大 file0 txt file1 txt file2 txt 我不想将它们合并到一个文件中 因为生成的文件将超过 10 场演出 每个文件中的每一行都包含一个 40 字节的字符串 现在字符串的排序相当好 大约
  • 无法使用 sysctl 更改每个进程的最大打开文件数

    我的实际极限是1024 ulimit a core file size blocks c 0 data seg size kbytes d unlimited scheduling priority e 0 file size blocks
  • Bash:更新文件中的变量

    我知道这是一个简单的答案 在找到答案之前我可能可以继续在谷歌上进行挖掘 但我的日程很紧 我希望能得到一个轻松的答复 我需要在安装时更新 ifcfg eth0 中的变量 换句话说 这就是需要发生的事情 以下变量需要更改 ONBOOT no B
  • 将管道输入转储到文件的简单方法是什么? (Linux)

    我正在寻找一个小 shell 脚本 它可以将任何内容通过管道传输到其中 并将其转储到文件中 用于电子邮件调试目的 有任何想法吗 unix 命令 tee 可以做到这一点 man tee
  • 在大型文本文件中查找重复记录

    我在一台 Linux 机器 Redhat 上 并且有一个 11GB 的文本文件 文本文件中的每一行包含单个记录的数据 并且该行的前 n 个字符包含该记录的唯一标识符 该文件包含略多于 2700 万条记录 我需要验证文件中不存在具有相同唯一标
  • 健全性检查 SSH 公钥? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已要求用户提供他们的公共 id rsa pub ssh 密钥 然后将其放入 home theiraccount ssh authorized key
  • Bash 变量:区分大小写?

    Bash shell 脚本区分大小写吗 是可变的date与DATE 是的 它区分大小写 就像 UNIX 的其余部分一样 date and DATE是两个不同的变量 makefile and Makefile是两个不同的文件 h and H是
  • 查找系统日志最大消息长度

    大多数 Unix 程序员都会习惯由syslog h 并且许多实现 例如 glibc 对发送给它的 syslog 消息的大小没有真正的限制 但通常对侦听的应用程序有限制 dev log 我想知道是否有人知道如何找到系统日志的最大消息大小 或者
  • 如何永久清除 linux/ubuntu 终端或 bash 中的所有历史记录? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 当您在 Linux 终端中使用向上键时 可以再次使用之前的命令 很棒的功能 但是 我开始使用命令中的敏感详细信息将 mysql 记录到 mysql 中
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • 为什么 SDL 在 Mac 上比 Linux 上慢得多?

    我正在研究使用 SDL2 渲染的单线程图形程序 https github com TurkeyMcMac intergrid 请参阅末尾的较小示例 它既可以在旧的 Linux 机器上运行 也可以在不太旧的 Mac 上运行 Linux 计算机
  • 用于列出用户和组的 Python 脚本

    我正在尝试编写一个脚本 在自己的行上输出每个用户及其组 如下所示 user1 group1 user2 group1 user3 group2 user10 group6 etc 我正在为此用 python 编写一个脚本 但想知道如何做到这
  • 验证 BASH 脚本时出现问题 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试验证 bash 脚本时出现代码 lint 错误 bin bash if eq 0 then printf No argum
  • Node exec 无权执行脚本

    直到最近 它都运行良好 但是当我今天尝试使用它时 它无法正常运行 它返回以下错误 错误 命令失败 bin sh c home pi RPi Computer Power RPi Server routes scripts hash js 1
  • Linux 中如何获取内存修改通知

    在Linux的用户空间程序中 我通过从堆中分配来获取一块内存 然后将指针分发给在其他线程中运行的许多其他组件来使用 当上述内存被修改时我想收到通知 我当然可以开发一个自定义用户空间解决方案 供其他组件在尝试修改内存时使用 我的情况的问题是这
  • 为什么分配大块内存会失败,而重新分配小块内存却不会失败

    这段代码的结果是x指向一块大小为 100GB 的内存 include
  • 如何检测文本文件中大于 n 的一系列“空洞”(孔、与模式不匹配的线)?

    Case scenario cat Status txt 1 connected 2 connected 3 connected 4 connected 5 connected 6 connected 7 disconnected 8 di

随机推荐

  • spingboot热部署,实现jsp页面时时刷新

    SpringBoot默认不支持JSP的实时更新 目前有两种解决方案 解决方法1 在配置文件 手工开启实时编译JSP的功能 application yml 配置如下 server jsp servlet init parameters dev
  • 双目标定(三)标定流程(含矫正)

    1 原理 参见单目标定基本原理 2 采集 2 1标定板的制作 大小 应当使得标定板在图像中占比尽可能大一些 占图像长度比例应当超过1 3 如果实在无法保证标定板占图像比例比较大如果占比比较小 则需要尽可能多采集一些图像 平 标定板应当尽可能
  • 单片机基础——使用USART发送和接收数据(DMA模式)

    1 准备工作 硬件准备 开发板 首先需要准备一个小熊派IoT开发板 并通过USB线与电脑连接 2 生成MDK工程 选择芯片型号 打开STM32CubeMX 打开MCU选择器 搜索并选中芯片STM32L431RCT6 配置时钟源 如果选择使用
  • STM32 标准外设SPL库、硬件抽象层HAL库、低层LL库区别?

    1 STM32 之一 HAL库 标准外设库 LL库 ZC Shou的博客 CSDN博客 ll库 仔细阅读 2 STM32标准外设库 HAL库 LL库 King先生 博客园 3 STM32 之 HAL库 戈 扬的博客 仔细阅读 4 STM32
  • sql: SQLite,MySQL,SQL Server

    SQLite 3 CREATE TABLE DuStudentList StudentId INTEGER PRIMARY KEY AUTOINCREMENT StudentName TEXT NOT NULL StudentNO TEXT
  • Oracle 11Gr1监听报错TNS-12542 12560 00512

    环境 Oracle 11Gr1 Linux Redhat 5 重启机器后 数据库监听启动报错如下 TNS 12542 TNS address already in use TNS 12560 TNS protocol adapter err
  • Go_数据类型转换(Sprintf、Format)

    数据类型转换 类型转换是将一种数据类型的变量转为另一种类型的变量 Go强制要求使用显式类型转换 所以语法更能确定语句及表达式的明确含义 转换的时候如果大的转给小的 会有精度损失 数据溢出 比如int64转int8 转换格式 将v转成T类型
  • vscode php debug断点调试

    记录一个我配置debug的总结 大概步骤 下载对应版本xdebug 下载vscode插件 配置 只要跟着一步一步配置即可 在桌面创建一个test文件夹 创建一个index php文件 win r 输出cmd cd到这个文件夹 使用php内置
  • 这一年,我们一起追过的梦想

    这一年 我们一起追过的梦想 梦想是一个好大的话题 是一个振奋人心的词汇 也是一个遥遥无期的词汇 总是给人希望 但是却让人很难把握 这一年我们牢牢的把握住了时间 让它发挥它最大的效益 IT主旋律 键盘上的舞动 这个学期开始接触软件工程项目之C
  • 2013-2014嵌入式开发从业人员调查报告

    调查背景 在嵌入式 移动互联网 物联网等热门技术日益普及的今天 以实现智能化为核心目标的典型技术 已经成为了整个信息产业毋庸置疑的主旋律 特别是近1年 以智能家居 智能医疗 可穿戴设备等为首的大量智能硬件批量的进入到人们的生活 更让这一场智
  • 学习太极创客 — MQTT(七)MQTT 主题进阶

    视频链接 https www bilibili com video BV1Va4y1W7Ub spm id from autoNext vd source b91967c499b23106586d7aa35af46413 资料链接 http
  • 来袭!SOLIDWORKS 2024 主要增强功能

    在SOLIDWORKS软件使用过程中 我们知道您创建了出色的设计 您的出色设计也会得到构建 为了简化和加快从概念到制造产品的产品开发流程 SOLIDWORKS 2024 包含用户驱动的全新增强功能 重点关注 提高工作智能化程度 通过更有效地
  • 软件测试及自动化测试

    软件测试面经 文章目录 软件测试面经 软件测试理论 1 GET和POST请求区别 2 web service的接口如何测试 3 cookie session与Token的区别 4 接口测试该怎么测 5 postman和jemter的区别 6
  • java 151建议_JAVA开发中151个建议

    1 不在常量和变量中出现混淆的字母 2 莫让常量蜕变成变量 3 三元操作符的类型必须一致 4 避免带有变长参数的方法重载 5 别让null值和空值威胁到变长方法 KISS原装 Keep It simple stupid即懒人原装 6 覆写变
  • 6.4集合类

    1 什么是集合 将多个对象合在一起变成一个统一的对象 然后通过这个统一的对象来实现对多个对象的管理 存储 检索 操作 传输数据 在数组里要进行这样的操作 可以会写很多算法 但在集合里 只需要调用其中的方法就可以了 集合也可以对其中的元素进行
  • 【java】Java -jar 运行的程序如何 本地代码远程调试服务器程序

    1 概述 因为要在服务器上进行es远程认证 需要先写个包进行测试一下 需要远程调用 那么改怎么做呢 远程服务命令配置 在服务器启动java jar包的命令中添加 Xdebug Xrunjdwp transport dt socket ser
  • 1033 旧键盘打字 (20分)

    这道题很坑的一点就是 有可能坏掉的键盘是空串 所有的键都是好的 如下测试用例 input NULL abcdefg output abcdefg 所以 用字符串数组的不能直接用scanf s str 读入 用string的也不能直接用cin
  • 计算机提示xinput1_3.dll丢失的三个解决方法?哪个更好用

    在遇到xinput1 3 dll丢失的问题后 我不得不花费一些时间和精力来尝试修复这个错误 这个问题导致我无法正常运行一些游戏或应用程序 给我的计算机使用带来了一些不便 问题描述 在使用计算机过程中 您可能会遇到一个错误提示 指示xinpu
  • sentinel 官方文档_Sentinel 限流与熔断初探(技巧篇)

    温馨提示 源码分析 Alibaba Sentinel 专栏开始连载 本文展示如何学习一个全新的技术的方法 该专栏基于 1 7 0 版本 在学习一个新技术或新框架时 建议先查看其官方文档以获得对其形成一个整体的认识 https github
  • 第十四章 netlink机制--基于Linux3.10

    Netlink基于网络的消息机制 能够让用户和内核空间进行通信 12 3节提到的ifconfig是使用ioctl方法和内核通信的 而ip命令则是使用netlink和内核通信的 该机制初衷是为网络服务的 但是现在起应用范围已经大大扩展 14