Chinaunix

标题: 3.10 以上内核创建proc文件的问题 [打印本页]

作者: archangle    时间: 2014-07-29 15:31
标题: 3.10 以上内核创建proc文件的问题
我的内核版本是3.11.0-15-generic

我现在想在/proc/sys/net/netfilter里面创建一个文件。我用proc_create函数的时候,proc_dir_entry 参数该怎么设置呢?
作者: haohaoxuexillk    时间: 2014-08-16 11:37
楼主解决这个问题了吗 我也碰到这个问题了
作者: Tinnal    时间: 2014-08-16 20:59
回复 1# archangle

你们不能什么不会就直接上来问,Linux不是Windows,不会什么都有教程,都要写得清清楚楚。
这种没法用一两句话说清楚,但又不是什么很难的问题,是很少有人理会的!!!
要学Linux,就要学会自己看代码,自己去学习,要说Linux最大的学习方法,就是RTFSC(Read the fucking source code)!
内核里头有大量的参考代码,要先学会查找、仿照。

你搜搜关键字,就会发现/proc/sys/net/netfilter不是由create_proc创建的!!!! 用的是sysctl!!!! 然后自己去百度一下就会有很多的教程!
至于在现成的目录低下去建文件,方法就是多仿照,多试验。因为网上的例子都是建一个全新的目录的。
我仿照的就是cdrom.c文件,至于试验,至少我没有写个测试案例以前,我也不确定走得通。

下面的代码在 Linux 3.1.0-7.fc16.i686.PAE下测试通过。
  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/sysctl.h>
  4. #include <linux/stat.h>
  5. MODULE_LICENSE("GPL");

  6. static int MyNewEntry = 0;
  7. static struct ctl_table_header *root_header;

  8. static struct ctl_table my_table[] = {
  9.         {
  10.                 .procname = "MyNewEntry",
  11.                 .mode = 0644,
  12.                 .data = & MyNewEntry,
  13.                 .maxlen = sizeof(int),
  14.                 .proc_handler = &proc_dointvec
  15.         },
  16.         {.procname = 0}
  17. };

  18. static struct ctl_table net_table[] = {
  19.         {
  20.                 .procname = "netfilter",
  21.                 .mode = 0555,
  22.                 .child = my_table,
  23.         },
  24.         {.procname = 0}
  25. };
  26. static struct ctl_table root_table[] = {
  27.         {
  28.                 .procname = "net",
  29.                 .mode = 0555,
  30.                 .child = net_table,
  31.         },
  32.         {.procname = 0}
  33. };

  34. struct proc_dir_entry *myproc = NULL;
  35. static int procfile_init(void)
  36. {
  37.         printk("procfile enter\n");
  38.         root_header = register_sysctl_table(root_table);
  39.         return 0;
  40. }

  41. static void procfile_exit(void)
  42. {
  43.         printk("procfile exit\n");
  44.         if(root_header)
  45.                 unregister_sysctl_table(root_header);
  46. }

  47. module_init(procfile_init);
  48. module_exit(procfile_exit);
复制代码

作者: Tinnal    时间: 2014-08-16 21:02
回复 2# haohaoxuexillk

参考上一贴吧。自己掌握学习Linux的方法。什么都问不是办法,总有别人也不关心的问题。


   
作者: wantaugust    时间: 2014-08-18 18:05
回复 4# Tinnal


    谢谢大神,要是有Read the fucking source code的视频入门就好了,
最近也是和大家一样,自己像个没头的苍蝇乱撞,就是因为入门的资源没有个统一的公布地点,
没有个针对的教程(或者不知道),更没有个好的中文的教程(我说的是中文入门,入门后就不在乎什么E文了),
所以大家一遇到问题就不知道哪里找答案,所以才什么都问。当入门后大家就知道到哪里找答案,怎么分析问题,
怎么解决问题了
我觉得坛子里的个位大神应该联合出个制顶的帖子完善上面的要求,

要是把我关注的netfilter_queue(千万别给官方的,就一篇代码没什么用)和内核的墙过滤也贴上我就万分感谢了
作者: Tinnal    时间: 2014-08-18 20:35
wantaugust 发表于 2014-08-18 18:05
回复 4# Tinnal


楼主都没发话,你来谢我干干什么,呵呵,没有糖发。
作者: wantaugust    时间: 2014-08-19 08:16
回复 6# Tinnal


    找了一夜都没有内核的入门视频
没办法,硬着头皮看文字那
郁闷中。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
作者: qxhgd    时间: 2014-08-19 09:25
你们不能什么不会就直接上来问,Linux不是Windows,不会什么都有教程,都要写得清清楚楚。

顶这句!!


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2