用户进程与内核进程通信netlink实例
生活随笔
收集整理的這篇文章主要介紹了
用户进程与内核进程通信netlink实例
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
為了方便應(yīng)用程序使用netlink接口,一個叫l(wèi)ibnl庫被開發(fā). 1 下載libnl2? http://packages.ubuntu.com/oneiric/libnl2 2 下載libnl2-dev http://packages.ubuntu.com/precise/libnl2-dev 3 先安裝libnl2 在安裝libnl2-dev 應(yīng)用層代碼 #include <stdio.h> #include <stdlib.h> #include <netlink/netlink.h> #define MY_MSG_TYPE (0x10 + 2) ?// + 2 is arbitrary but is the same for kern/usr int main(int argc, char *argv[]) { struct nl_sock *nls; char msg[] = { 0xde, 0xad, 0xbe, 0xef, 0x90, 0x0d, 0xbe, 0xef }; int ret; nls = nl_socket_alloc(); if (!nls) { printf("bad nl_socket_alloc\n"); return EXIT_FAILURE; } ret = nl_connect(nls, NETLINK_USERSOCK); if (ret < 0) { nl_perror(ret, "nl_connect"); nl_socket_free(nls); return EXIT_FAILURE; } ret = nl_send_simple(nls, MY_MSG_TYPE, 0, msg, sizeof(msg)); if (ret < 0) { nl_perror(ret, "nl_send_simple"); nl_close(nls); nl_socket_free(nls); return EXIT_FAILURE; } else { printf("sent %d bytes\n", ret); } nl_close(nls); nl_socket_free(nls); return EXIT_SUCCESS; } 內(nèi)核代碼 #include <linux/kernel.h> #include <linux/module.h> #include <net/sock.h> #include <net/netlink.h> #define MY_MSG_TYPE (0x10 + 2) ?// + 2 is arbitrary. same value for kern/usr static struct sock *my_nl_sock; DEFINE_MUTEX(my_mutex); static int my_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) { int type; char *data; type = nlh->nlmsg_type; if (type != MY_MSG_TYPE) { printk("%s: expect %#x got %#x\n", __func__, MY_MSG_TYPE, type); return -EINVAL; } data = NLMSG_DATA(nlh); printk("%s: x x x x x x x x\n", __func__, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]); return 0; } static void my_nl_rcv_msg(struct sk_buff *skb) { mutex_lock(&my_mutex); netlink_rcv_skb(skb, &my_rcv_msg); mutex_unlock(&my_mutex); } static int my_init(void) { my_nl_sock = netlink_kernel_create(&init_net, NETLINK_USERSOCK, 0, my_nl_rcv_msg, NULL, THIS_MODULE); if (!my_nl_sock) { printk(KERN_ERR "%s: receive handler registration failed\n", __func__); return -ENOMEM; } return 0; } static void my_exit(void) { if (my_nl_sock) { netlink_kernel_release(my_nl_sock); } } module_init(my_init); module_exit(my_exit); 系統(tǒng):ubuntu 10.04 ,內(nèi)核: linux-2.6.38
編譯應(yīng)用層代碼需要加入動態(tài)鏈接庫 /usr/lib/libnl.so
即sudo gcc -o 1 1.c /usr/lib/libnl.so
編譯應(yīng)用層代碼需要加入動態(tài)鏈接庫 /usr/lib/libnl.so
即sudo gcc -o 1 1.c /usr/lib/libnl.so
轉(zhuǎn)載于:https://www.cnblogs.com/kungfupanda/archive/2013/01/11/2856973.html
總結(jié)
以上是生活随笔為你收集整理的用户进程与内核进程通信netlink实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用squid配置透明代理并对上网行为进
- 下一篇: iOS uiscrollView 嵌套