- 论坛徽章:
- 0
|
本人刚咖刚学习linux的netlink!所以不太懂!- #ifndef __nl_h__
- #define __nl_h__
- #define My_netlink 17
- #define U_PID 1
- #define K_MSG 2
- #endif
- struct
- {
- __u32 pid;
- }user_proc;
复制代码 这是头 文件
下面是 内核的模块代码- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/netlink.h>
- #include <net/sock.h>
- #include "nl.h"
- static struct sock *nlfd;
- int send_to_user(struct sock *nlfd,char *info) //发送到用户态
- {
- int size;
- struct sk_buff *skb;
- unsigned char *old_tail;
- struct nlmsghdr *nlh;
- size = NLMSG_SPACE(strlen(info));
- skb = alloc_skb(size, GFP_ATOMIC);
- nlh = NLMSG_PUT(skb, 0, 0, K_MSG, size-sizeof(*nlh));
- old_tail = skb->tail;
- memcpy(NLMSG_DATA(nlh) ,info,strlen(info));
- nlh->nlmsg_len = skb->tail - old_tail;
- netlink_unicast(nlfd, skb, user_proc.pid, MSG_DONTWAIT);
- return 0;
- nlmsg_failure:
- if(skb)
- kfree_skb(skb);
- return -1;
- }
- void kernel_receive(struct sk_buff* __skb) //内核接受函数
- {
- struct sk_buff *skb;
- struct nlmsghdr *nlh = NULL;
- printk("begin kernel_receive\n");
- skb = skb_get(__skb);
- if(skb->len == sizeof(struct nlmsghdr))
- {
- nlh = (struct nlmsghdr *)skb->data;
- if((nlh->nlmsg_len >= sizeof(struct nlmsghdr))
- && (skb->len >= nlh->nlmsg_len))
- {
- user_proc.pid = nlh->nlmsg_pid;
- printk("user_pid:%d\n",user_proc.pid);
- send_to_user(nlfd,"PID send success");
- }
- }
- else
- {
- printk("user data:%s\n",skb->data);
- //send_to_user();
- }
- kfree_skb(skb);
- }
- int __init nl_init(void)
- {
- printk("nl start!!\n");
- nlfd = netlink_kernel_create(&init_net, My_netlink, 0, kernel_receive, NULL, THIS_MODULE);
- if(!nlfd)
- {
- printk("can not create a netlink socket\n");
- return -1;
- }
- return 0;
- }
- void __exit nl_exit(void)
- {
- sock_release(nlfd->sk_socket);
- printk("nl exit!!\n");
- }
- MODULE_AUTHOR("JZH");
- MODULE_DESCRIPTION("NETLINK_TEST");
- MODULE_LICENSE("GPL");
- module_init(nl_init);
- module_exit(nl_exit);
复制代码 这是用户程序:- #include <stdio.h>
- #include <sys/socket.h>
- #include <stdlib.h>
- #include <string.h>
- #include <linux/netlink.h>
- #include "nl.h"
- struct msg_to_kernel
- {
- struct nlmsghdr hdr;
- };
- struct u_packet_info
- {
- struct nlmsghdr hdr;
- char msg[100];
- };
- int main()
- {
- //初始化
- struct sockaddr_nl local;
- struct sockaddr_nl kpeer;
- int skfd,ret,kpeerlen = sizeof(struct sockaddr_nl);;
- struct msg_to_kernel message;
- struct u_packet_info info;
- skfd = socket(PF_NETLINK, SOCK_RAW, My_netlink);
- if(skfd < 0)
- {
- printf("can not create a netlink socket\n");
- return -1;
- }
- memset(&local, 0, sizeof(local));
- local.nl_family = AF_NETLINK;
- local.nl_pid = getpid();
- local.nl_groups = 0;
- if(bind(skfd, (struct sockaddr*)&local, sizeof(local)) != 0)
- {
- printf("bind() error\n");
- return -1;
- }
- memset(&kpeer, 0, sizeof(kpeer));
- kpeer.nl_family = AF_NETLINK;
- kpeer.nl_pid = 0;
- kpeer.nl_groups = 0;
- memset(&message, 0, sizeof(message));
- message.hdr.nlmsg_len = NLMSG_LENGTH(0);
- message.hdr.nlmsg_flags = 0;
- message.hdr.nlmsg_type = U_PID;
- message.hdr.nlmsg_pid = local.nl_pid;
- //初始化结束
- //发送进程PID
- ret = sendto(skfd, &message, message.hdr.nlmsg_len, 0,(struct sockaddr*)&kpeer, sizeof(kpeer));
- if(!ret)
- {
- perror("send pid:");
- exit(-1);
- }
- //接受内核态确认信息
- ret = recvfrom(skfd, &info, sizeof(struct u_packet_info),0, (struct sockaddr*)&kpeer, &kpeerlen);
- if(!ret)
- {
- perror("recv form kerner:");
- exit(-1);
- }
- printf("msg:%s\n",info.msg);
- //内核和用户进行通信
- //
- close(skfd);
- return 0;
- }
复制代码 以下是Makefile:- obj-m := nl_k.o
- all:
- make -C /usr/src/linux-headers-2.6.31-20-generic modules M=$(PWD)
复制代码 以上程序都能编译通过,但是当我执行用户程序的时候,报说 无法执行二进制文件。这是什么问题。我已经google过了。但是还没有找到问题所在!谢谢大家 |
|