Linux 内核通知链随笔【中】

    关于内核通知链不像Netlink那样,既可以用于内核与用户空间的通信,还能用于内核不同子系统之间的通信,通知链只能用于内核不同子系统之间的通信。那么内核通知链到底是怎么工作的?我们如何才能用好通知链?内核源代码里随处可见的通知链身影,我们到底该如何理解呢?本片博文过后,您的这些疑问和顾虑将统统消除。

   以前有个女神,超凡脱俗、出水芙蓉,不过在怎么滴也是人,是人就会有各种各样的需求,女神的所有需求都放在她的需求链表里requirment_chain,比如物质需求,精神需求等等。然后女神首先需要做的事情就是将自己的需求链给实例化了:

点击(此处)折叠或打开

  1. /* Godness.c */
  2. /* 我们假设女神需求链的类型是原始通知链(PS:不要和原始需求挂钩理解 -_-||)*/
  3. static RAW_NOTIFIER_HEAD(requirment_chain);


    当需求被定义出来后,还需要向外提供两个接口:一个是别人用于满足她需求的接口,另一个是别人需要和她break out的接口(虽然在现实生活中这种情况比较令人sadness,但女神所在的虚拟世界里这个是必须的)。于是女神提供了别人往其需求链注册响应函数的接口和卸载响应函数的接口:

点击(此处)折叠或打开

  1. /* Godness.c*/

  2. int register_godness_notifier(struct notifier_block *nb)
  3. {
  4.         return raw_notifier_chain_register(&requirment_chain, nb);
  5. }
  6. EXPORT_SYMBOL(register_godness_notifier); //注册函数实现了之后必须将其公布出去,不然别人怎么看得到呢

  7. int unregister_godness_notifier(struct notifier_block *nb)
  8. {
  9.         return raw_notifier_chain_unregister(&requirment_chain, nb);
  10. }
  11. EXPORT_SYMBOL(unregister_godness_notifier); //同上

    然后,女神要做的就是提需求,并看看哪些屌丝、土豪或高富帅来追求自己:

点击(此处)折叠或打开

  1. int call_godness_notifier_chain(unsigned long val, void *v)
  2. {
  3.         return raw_notifier_call_chain(&requirment_chain, val, v);
  4. }
  5. EXPORT_SYMBOL(call_godness_notifier_chain);

    为了模拟测试过程,我们需要一个内核线程,模拟女神提需求的过程,然后不断调用上面的需求响应的检测函数。我们姑且认为认为女神的需求有两种:物质需求就是对menoy的需求,精神需求就是音乐的需求。女神每3秒钟提一个需求,一共提10个需求:

点击(此处)折叠或打开

  1. #define PHY_REQ 0 //物质需求
  2. #define SPR_REQ 1 //精神需求

  3. #define REQ_MAX SPR_REQ+1

  4. static int make_requirment_thread(void *data)
  5. {
  6.      int i = 10;
  7.      struct completion cmpl;
  8.      unsigned int requirment_type = 0;
  9.      printk("[Godness]requirements thread starting...\n");
  10.      while((i--) > 0){
  11.             init_completion(&cmpl);
  12.             wait_for_completion_timeout(&cmpl, 3 * HZ);

  13.             get_random_bytes(&requirment_type,sizeof(requirment_type));  //生成一个内

你可能感兴趣的:(Linux)