当前位置: 首页 > news >正文

青浦专业网站建设域名注册商有哪些

青浦专业网站建设,域名注册商有哪些,b2b网站开发,辽宁省建设部网站netlink简介 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。在Linux标准内核中,系统默认集成了很多netlink实例,比如日志上报、路由系统等,netlink消息是双向的&a…

netlink简介

Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。在Linux标准内核中,系统默认集成了很多netlink实例,比如日志上报、路由系统等,netlink消息是双向的,应用层可以发送消息到内核,同时内核也可以发送消息到应用层进程,非常适合涉及到内核信息采集的模块。

与ioctl的区别

netlink采用sock方式实现,而ioctl采用驱动注册方式实现。netlink通常用于传输大量消息,而ioctl通常用于下发系统命令,不支持内核主动发送消息到应用层。
什么情况下用netlink?
在开发过程中,我们会面临消息通信机制的选型,这和应用层消息通信选型一样,每个通信方式都有自己的优缺点。采用netlink机制一般需要应用层单独起进程用于监听内核发送上来的消息,开发工作量相对于ioctl较大,而ioctl主要用于驱动消息下发,比如无线驱动的iwpriv命令实现,就采用ioctl机制。

内核模块hello_kernel.c

#include <linux/module.h>
#include <net/sock.h> 
#include <linux/netlink.h>
#include <linux/skbuff.h> 
#define NETLINK_USER 31struct sock *nl_sk = NULL;static void hello_nl_recv_msg(struct sk_buff *skb)
{struct nlmsghdr *nlh;int pid;struct sk_buff *skb_out;int msg_size;char *msg = "Hello from kernel";int res;printk(KERN_INFO "Entering: %s\n", __FUNCTION__);msg_size = strlen(msg);nlh = (struct nlmsghdr *)skb->data;printk(KERN_INFO "Netlink received msg payload:%s\n", (char *)nlmsg_data(nlh));pid = nlh->nlmsg_pid; /*pid of sending process */skb_out = nlmsg_new(msg_size, 0);if (!skb_out) {printk(KERN_ERR "Failed to allocate new skb\n");return;}nlh = nlmsg_put(skb_out, 0, 0, NLMSG_DONE, msg_size, 0);NETLINK_CB(skb_out).dst_group = 0; /* not in mcast group */strncpy(nlmsg_data(nlh), msg, msg_size);res = nlmsg_unicast(nl_sk, skb_out, pid);if (res < 0)printk(KERN_INFO "Error while sending bak to user\n");
}static int __init hello_init(void)
{printk("Entering: %s\n", __FUNCTION__);//nl_sk = netlink_kernel_create(&init_net, NETLINK_USER, 0, hello_nl_recv_msg, NULL, THIS_MODULE);struct netlink_kernel_cfg cfg = {.input = hello_nl_recv_msg,};nl_sk = netlink_kernel_create(&init_net, NETLINK_USER, &cfg);if (!nl_sk) {printk(KERN_ALERT "Error creating socket.\n");return -10;}return 0;
}static void __exit hello_exit(void)
{printk(KERN_INFO "exiting hello module\n");netlink_kernel_release(nl_sk);
}module_init(hello_init); 
module_exit(hello_exit);
MODULE_LICENSE("GPL");

应用层代码hello.c

#include <linux/netlink.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>#define NETLINK_USER 31#define MAX_PAYLOAD 1024 /* maximum payload size*/
struct sockaddr_nl src_addr, dest_addr;
struct nlmsghdr *nlh = NULL;
struct iovec iov;
int sock_fd;
struct msghdr msg;int main()
{sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_USER);if (sock_fd < 0)return -1;memset(&src_addr, 0, sizeof(src_addr));src_addr.nl_family = AF_NETLINK;src_addr.nl_pid = getpid(); /* self pid */bind(sock_fd, (struct sockaddr *)&src_addr, sizeof(src_addr));memset(&dest_addr, 0, sizeof(dest_addr));dest_addr.nl_family = AF_NETLINK;dest_addr.nl_pid = 0; /* For Linux Kernel */dest_addr.nl_groups = 0; /* unicast */nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD);nlh->nlmsg_pid = getpid();nlh->nlmsg_flags = 0;strcpy(NLMSG_DATA(nlh), "Hello");iov.iov_base = (void *)nlh;iov.iov_len = nlh->nlmsg_len;msg.msg_name = (void *)&dest_addr;msg.msg_namelen = sizeof(dest_addr);msg.msg_iov = &iov;msg.msg_iovlen = 1;printf("Sending message to kernel\n");sendmsg(sock_fd, &msg, 0);printf("Waiting for message from kernel\n");/* Read message from kernel */recvmsg(sock_fd, &msg, 0);printf("Received message payload: %s\n", NLMSG_DATA(nlh));close(sock_fd);return 0;
}

 Makefile

bin=hello
obj-m = hello_kernel.o
KVERSION = $(shell uname -r)
all:$(bin)make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
bin:gcc hello.c -o hello
clean:make -C /lib/modules/$(KVERSION)/build M=$(PWD) cleanrm -rf hello.o hello

Makefile问题记录一下

chat:KVERSION = $(shell uname -r)去掉shell有什么区别?

在Makefile中,`$(shell ...)`是一个用于执行命令并获取其输出的内置函数。在你提到的语句中,`$(shell uname -r)`用于执行`uname -r`命令来获取当前Linux内核的版本,并将结果赋值给`KVERSION`变量。如果你去掉`shell`,那么整个语句就会变成:
KVERSION = uname -r
这将不再是一个命令执行语句,而是一个简单的变量赋值语句。这意味着`KVERSION`的值将直接设置为字符串`"uname -r"`,而不是执行`uname -r`命令并获取其输出。
因此,区别在于:
- `KVERSION = $(shell uname -r)`:这会执行`uname -r`命令,获取内核版本,并将结果作为字符串赋值给`KVERSION`变量。
- `KVERSION = uname -r`:这只是将字符串`"uname -r"`赋值给`KVERSION`变量,不会执行命令或获取内核版本。
如果你想要将内核版本赋值给`KVERSION`变量,你应该使用`$(shell ...)`来执行命令。否则,你将只是将命令字符串本身赋值给变量,而不会获取命令的输出。

make  -C什么意思?

`make -C` 是 `make` 命令的一个选项,用于指定 `make` 命令应该在哪个目录下执行。
语法为:
make -C <目录>
其中 `<目录>` 是你希望 `make` 命令执行的目录的路径。
这个选项通常用于在项目的子目录中执行 `make` 命令,以便构建子项目或依赖于其他目录中的代码的项目。这对于在大型项目中管理多个模块或组件的构建过程非常有用,因为你可以在每个子目录中维护一个独立的 `Makefile` 文件,并使用 `-C` 选项来指定要构建的子目录。
例如,如果你有一个名为 `subproject` 的子目录,并在该目录中有一个名为 `Makefile` 的构建文件,你可以使用以下命令在 `subproject` 目录中执行 `make`:
make -C subproject
这将导致 `make` 命令在 `subproject` 目录中查找并执行 `Makefile` 文件,执行与该子项目相关的构建任务。

运行结果:

应用层

内核,先加载.ko,运行hello之后,用dmesg就可查看收到的消息

代码来源:

Linux下C语言如何使用 netlink sockets与内核模块通信?_c语言nlmsghdr的使用_wellnw的博客-CSDN博客

http://www.hkea.cn/news/164365/

相关文章:

  • 食品公司网站源码谷歌网页
  • 做网站用哪种代码比较好推广seo发贴软件
  • 3d效果图软件宁波seo行者seo09
  • 美国做按摩广告的网站网站优化教程
  • wordpress云建站教程信息流广告公司一级代理
  • 我有一个域名怎么做网站百度一下下载
  • 郑州网站建设品牌好安装百度到桌面
  • 株洲做网站定制百度灰色词优化排名
  • 上海网页设计公司兴田德润电话排名优化外包公司
  • 做360网站优化快推广普通话宣传语手抄报
  • 动态网站开发语言有哪些大学生创新创业大赛
  • 关键词推广公司网站网络排名优化方法
  • 福州移动网站建设网络营销推广工具有哪些
  • win2008sr怎么用iis做网站国外网站加速
  • 合肥++网站建设磐石网站seo
  • 万网主机怎么上传网站如何在百度上投放广告
  • 做网站时如何给文字做超链接全球疫情最新数据消息
  • 四川省住建厅官方网站3分钟搞定网站seo优化外链建设
  • 做网站阳泉巨量千川广告投放平台
  • 温岭哪里有做网站的如何自制网站
  • 知道创于 wordpress搜索引擎优化宝典
  • 乌兰县wap网站建设公司有效获客的六大渠道
  • 微信网站开发教程视频教程百度一下主页官网
  • 网站开发专业前景关键词挖掘排名
  • 网站开发属于什么职位类别seo查询站长工具
  • wordpress postmetaseoul national university
  • 商务网站的主要存在形式杭州百度快照优化公司
  • 个人备案网站做购物网站可以不班级优化大师免费下载电脑版
  • 贸易网站建设互联网广告代理加盟
  • 深圳网站建设网络公司河北关键词排名推广