免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1698 | 回复: 2
打印 上一主题 下一主题

请教一个简单的问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-09 15:11 |只看该作者 |倒序浏览
本人刚咖刚学习linux的netlink!所以不太懂!
  1. #ifndef __nl_h__
  2. #define __nl_h__
  3. #define My_netlink 17
  4. #define U_PID 1
  5. #define K_MSG 2
  6. #endif
  7. struct
  8. {
  9. __u32 pid;
  10. }user_proc;
复制代码
这是头 文件
下面是 内核的模块代码
  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/netlink.h>
  4. #include <net/sock.h>
  5. #include "nl.h"
  6. static struct sock *nlfd;
  7. int send_to_user(struct sock *nlfd,char *info) //发送到用户态
  8. {
  9. int size;
  10. struct sk_buff *skb;
  11. unsigned char *old_tail;
  12. struct nlmsghdr *nlh;
  13. size = NLMSG_SPACE(strlen(info));
  14. skb = alloc_skb(size, GFP_ATOMIC);
  15. nlh = NLMSG_PUT(skb, 0, 0, K_MSG, size-sizeof(*nlh));
  16. old_tail = skb->tail;
  17. memcpy(NLMSG_DATA(nlh) ,info,strlen(info));
  18. nlh->nlmsg_len = skb->tail - old_tail;
  19. netlink_unicast(nlfd, skb, user_proc.pid, MSG_DONTWAIT);
  20. return 0;
  21. nlmsg_failure:
  22. if(skb)
  23. kfree_skb(skb);
  24. return -1;
  25. }
  26. void kernel_receive(struct sk_buff* __skb) //内核接受函数
  27. {
  28. struct sk_buff *skb;
  29. struct nlmsghdr *nlh = NULL;
  30. printk("begin kernel_receive\n");
  31. skb = skb_get(__skb);
  32. if(skb->len == sizeof(struct nlmsghdr))
  33. {
  34. nlh = (struct nlmsghdr *)skb->data;
  35. if((nlh->nlmsg_len >= sizeof(struct nlmsghdr))
  36. && (skb->len >= nlh->nlmsg_len))
  37. {
  38. user_proc.pid = nlh->nlmsg_pid;
  39. printk("user_pid:%d\n",user_proc.pid);
  40. send_to_user(nlfd,"PID send success");
  41. }
  42. }
  43. else
  44. {
  45. printk("user data:%s\n",skb->data);
  46. //send_to_user();
  47. }
  48. kfree_skb(skb);
  49. }
  50. int __init nl_init(void)
  51. {
  52. printk("nl start!!\n");
  53. nlfd = netlink_kernel_create(&init_net, My_netlink, 0, kernel_receive, NULL, THIS_MODULE);
  54. if(!nlfd)
  55. {
  56. printk("can not create a netlink socket\n");
  57. return -1;
  58. }
  59. return 0;
  60. }
  61. void __exit nl_exit(void)
  62. {
  63. sock_release(nlfd->sk_socket);
  64. printk("nl exit!!\n");
  65. }
  66. MODULE_AUTHOR("JZH");
  67. MODULE_DESCRIPTION("NETLINK_TEST");
  68. MODULE_LICENSE("GPL");
  69. module_init(nl_init);
  70. module_exit(nl_exit);
复制代码
这是用户程序:
  1. #include <stdio.h>
  2. #include <sys/socket.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <linux/netlink.h>
  6. #include "nl.h"
  7. struct msg_to_kernel
  8. {
  9. struct nlmsghdr hdr;
  10. };
  11. struct u_packet_info
  12. {
  13. struct nlmsghdr hdr;
  14. char msg[100];
  15. };
  16. int main()
  17. {
  18. //初始化
  19. struct sockaddr_nl local;
  20. struct sockaddr_nl kpeer;
  21. int skfd,ret,kpeerlen = sizeof(struct sockaddr_nl);;
  22. struct msg_to_kernel message;
  23. struct u_packet_info info;
  24. skfd = socket(PF_NETLINK, SOCK_RAW, My_netlink);
  25. if(skfd < 0)
  26. {
  27. printf("can not create a netlink socket\n");
  28. return -1;
  29. }
  30. memset(&local, 0, sizeof(local));
  31. local.nl_family = AF_NETLINK;
  32. local.nl_pid = getpid();
  33. local.nl_groups = 0;
  34. if(bind(skfd, (struct sockaddr*)&local, sizeof(local)) != 0)
  35. {
  36. printf("bind() error\n");
  37. return -1;
  38. }
  39. memset(&kpeer, 0, sizeof(kpeer));
  40. kpeer.nl_family = AF_NETLINK;
  41. kpeer.nl_pid = 0;
  42. kpeer.nl_groups = 0;
  43. memset(&message, 0, sizeof(message));
  44. message.hdr.nlmsg_len = NLMSG_LENGTH(0);
  45. message.hdr.nlmsg_flags = 0;
  46. message.hdr.nlmsg_type = U_PID;
  47. message.hdr.nlmsg_pid = local.nl_pid;
  48. //初始化结束
  49. //发送进程PID
  50. ret = sendto(skfd, &message, message.hdr.nlmsg_len, 0,(struct sockaddr*)&kpeer, sizeof(kpeer));
  51. if(!ret)
  52. {
  53. perror("send pid:");
  54. exit(-1);
  55. }
  56. //接受内核态确认信息
  57. ret = recvfrom(skfd, &info, sizeof(struct u_packet_info),0, (struct sockaddr*)&kpeer, &kpeerlen);
  58. if(!ret)
  59. {
  60. perror("recv form kerner:");
  61. exit(-1);
  62. }
  63. printf("msg:%s\n",info.msg);
  64. //内核和用户进行通信
  65. //
  66. close(skfd);
  67. return 0;
  68. }
复制代码
以下是Makefile:
  1. obj-m := nl_k.o
  2. all:
  3.         make -C /usr/src/linux-headers-2.6.31-20-generic modules M=$(PWD)
复制代码
以上程序都能编译通过,但是当我执行用户程序的时候,报说 无法执行二进制文件。这是什么问题。我已经google过了。但是还没有找到问题所在!谢谢大家

论坛徽章:
0
2 [报告]
发表于 2010-05-09 23:34 |只看该作者
你的用户程序是怎么编译出来的。

论坛徽章:
0
3 [报告]
发表于 2010-05-10 14:31 |只看该作者
这个问题我已经解决了!谢谢你回帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP