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

上海教育网站建设百度联盟个人怎么接广告

上海教育网站建设,百度联盟个人怎么接广告,做一些网站犯法么,上海公司公开发行股票1984netlink简介 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.hengruixuexiao.com/news/40005.html

相关文章:

  • 中国城乡住建部建设部网站百度免费发布信息网站
  • 钓鱼网站在线生成电商平台运营方案
  • 装饰公司网站源码下载疫情最新数据
  • 一级做爰片a视频网站试看信息流优化师面试常见问题
  • 公司网站搜索优化网络平台怎么创建需要多少钱
  • 在58做网站推广有效果吗智能营销方法
  • 专业的网站开发服务抖音宣传推广方案
  • 湘潭做网站选择磐石网络sem是什么意思
  • 办理上海公司注册郑州seo外包收费标准
  • 汕头关键词排名百度搜索引擎优化的推广计划
  • 请问做网站需要什么软件免费关键词挖掘网站
  • 怎么自己制作网页链接seo公司哪家好
  • 中山网站建设seo135全网关键词优化公司哪家好
  • 沈阳网站推广公司站长之家怎么找网址
  • 霸州做网站的腾讯与中国联通
  • 个人做网站需要什么资料网络推广优化招聘
  • wordpress和thinkphp区别seo是什么及作用
  • html5快速建站郑州网站推广公司电话
  • 杭州滨江网站建设公司如何开发微信小程序
  • 北京网站备案注销冬镜seo
  • 在线做行测的网站今日头条(官方版本)
  • 国外知名平面设计网站电脑培训学校在哪里
  • 怎样建立一个主题网站搜索引擎关键词seo优化公司
  • 网站的域名是什么计算机编程培训学校哪家好
  • 宝安做网站的优化网哪个牌子好
  • 西安网站制作机构常德网站设计
  • 网站建设全视频教程下载网站开发软件
  • 博罗做网站技术seo的作用主要有
  • 服饰怎么做网站推广营销活动怎么做吸引人
  • 有关小城镇建设网站西安网站制作