亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1751 | 回復: 2
打印 上一主題 下一主題

請教一個簡單的問題! [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 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;
復制代碼
這是頭 文件
下面是 內(nèi)核的模塊代碼
  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) //發(fā)送到用戶態(tài)
  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) //內(nèi)核接受函數(shù)
  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. //初始化結(jié)束
  49. //發(fā)送進程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. //接受內(nèi)核態(tài)確認信息
  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. //內(nèi)核和用戶進行通信
  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)
復制代碼
以上程序都能編譯通過,但是當我執(zhí)行用戶程序的時候,報說 無法執(zhí)行二進制文件。這是什么問題。我已經(jīng)google過了。但是還沒有找到問題所在!謝謝大家

論壇徽章:
0
2 [報告]
發(fā)表于 2010-05-09 23:34 |只看該作者
你的用戶程序是怎么編譯出來的。

論壇徽章:
0
3 [報告]
發(fā)表于 2010-05-10 14:31 |只看該作者
這個問題我已經(jīng)解決了!謝謝你回帖
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP