Chinaunix首页 | 论坛 | 博客
  • 博客访问: 214003
  • 博文数量: 30
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 476
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-07 18:15
个人简介

程序员一个。14年毕业。

文章分类

全部博文(30)

文章存档

2014年(13)

2013年(17)

我的朋友

分类: LINUX

2014-09-28 14:33:29

http://blog.csdn.net/mrpre/article/details/78041431

本文代码实现:用户进程发送“nihao”给内核,内核回复“niyehao”给用户态。

1:添加自己的宏。
2:编写用户态程序。
3:编写内核态程序。

内核态,需要全局变量进行数据的交互。
在模块init的时候,可以:
 netlinkfd = netlink_kernel_create(&init_vrf, NL_MY, 0, kernel_receive, NULL, THIS_MODULE);
NL_MY是加载netlink.h头文件中的宏。
kernel_recv是函数的地址,用以接收处理用户态的数据

点击(此处)折叠或打开

  1. int process_message_thread(void *arg)
  2. {
  3.     struct sk_buff *skb = (struct sk_buff *)(arg);
  4.     struct sk_buff *newskb;
  5.     int opp_id;
  6.     struct struReq_s *msg = (struct struReq_s *) skb->data;
  7.     opp_id = msg->pid;

  8.     struct struReq_s *needtosend = kmalloc(sizeof(struct struReq_s) + strlen("niyehao"),GFP_KERNEL);
  9.     needtosend->data_len = strlen("niyehao");
  10.     memcpy(needtosend->data,"niyehao", needtosend->data_len);
  11.     newskb = alloc_skb(sizeof(struct struReq_s) + strlen("niyehao"), GFP_ATOMIC);
  12.     skb_put(newskb,sizeof(struct struReq_s) + strlen("niyehao"));
  13.     memcpy(newskb->data,needtosend,sizeof(struct struReq_s) + strlen("niyehao"));
  14.     netlink_unicast(netlinkfd, newskb, opp_id, MSG_DONTWAIT);
  15.     kfree(needtosend);
  16.     return 0;
  17. }
  18. u32 nt = 0;
  19. void kernel_receive(struct sk_buff *skb)
  20. {
  21.     printk("#########recv###########\n");
  22.     process_message_thread(skb);
  23.     printk("#########leave###########\n");
  24. }


点击(此处)折叠或打开

  1. int netlink_socket = -1;

  2. int main()
  3. {
  4.     
  5.     struct sockaddr_nl src_addr;
  6.     s32 ret;

  7.     struct struReq_s
  8.     {
  9.         int pid;
  10.         int data_len;
  11.         char data[0];
  12.     };
  13.     u8 buf[1024] = {0};
  14.     struct struReq_s *struReq = NULL;
  15.     netlink_socket = socket(AF_NETLINK, SOCK_RAW, NL_MY);
  16.     if(netlink_socket < 0)
  17.     {
  18.         return -1;
  19.     }
  20.     memset(&src_addr, 0, sizeof(src_addr));
  21.     src_addr.nl_family = AF_NETLINK;
  22.     src_addr.nl_pid = getpid();
  23.     src_addr.nl_groups = 1;
  24.         
  25.     ret = bind(netlink_socket, (struct sockaddr *)&src_addr, sizeof(src_addr));
  26.     if(ret < 0)
  27.     {
  28.         return -1;
  29.     }
  30.     struReq = malloc(sizeof( struct struReq_s) + 10);
  31.     if(struReq == NULL)
  32.     {
  33.         printf("malloc fail\n");
  34.         return 0;
  35.     }
  36.     memset(struReq, 0, sizeof(struct struReq_s) + 10);

  37.     struReq->pid = getpid();
  38.     struReq->data_len = 10;
  39.     memcpy(struReq->data,"nihao",strlen("nihao"));
  40.     
  41.     memset(&src_addr, 0, sizeof(src_addr));    
  42.     src_addr.nl_family = AF_NETLINK;    
  43.     src_addr.nl_pid = 0;    
  44.     src_addr.nl_groups = 0;
  45.     if(sendto(netlink_socket, struReq, struReq->data_len + sizeof(struct struReq_s), 0,        
  46.         (struct sockaddr *)&src_addr, sizeof(src_addr)) < 0)    
  47.     {
  48.         return -1;    
  49.     }
  50.     
  51.     printf("user recv\n");
  52.     /*阻塞的读*/
  53.     memset(buf,0,1024);
  54.     recv(netlink_socket,buf,1024,0);
  55.     printf("recv from kernel len : %d\n",((struct struReq_s *)buf)->data_len);
  56.     printf("recv from kernel data: %s\n",((struct struReq_s *)buf)->data);
  57.     
  58.     free(struReq);
  59.     close(netlink_socket);
  60.     return 0;
  61. }




阅读(3357) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~