亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? x1008.html

?? linux驅動開發
?? HTML
?? 第 1 頁 / 共 2 頁
字號:
      /* If we woke up because we got a signal we're not blocking, return
       * -EINTR (fail the system call).  This allows processes to be killed or
       * stopped.
       */

/*
 * Emmanuel Papirakis:
 *
 * This is a little update to work with 2.2.*.  Signals now are contained in
 * two words (64 bits) and are stored in a structure that contains an array of
 * two unsigned longs.  We now have to make 2 checks in our if.
 *
 * Ori Pomerantz:
 *
 * Nobody promised me they'll never use more than 64 bits, or that this book
 * won't be used for a version of Linux with a word size of 16 bits.  This code
 * would work in any case.
 */	  
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
      for (i = 0; i < _NSIG_WORDS && !is_sig; i++)
         is_sig = current->signal.sig[i] & ~current->blocked.sig[i];

      if (is_sig) {
#else
      if (current->signal & ~current->blocked) {
#endif
         /* It's important to put MOD_DEC_USE_COUNT here, because for processes
          * where the open is interrupted there will never be a corresponding
          * close. If we don't decrement the usage count here, we will be left
          * with a positive usage count which we'll have no way to bring down
          * to zero, giving us an immortal module, which can only be killed by
          * rebooting the machine.
          */
         MOD_DEC_USE_COUNT;
         return -EINTR;
      }
   }

   /* If we got here, Already_Open must be zero */

   /* Open the file */
   Already_Open = 1;
   return 0;                                 /* Allow the access */
}

/* Called when the /proc file is closed */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
int module_close(struct inode *inode, struct file *file)
#else
void module_close(struct inode *inode, struct file *file)
#endif
{
   /* Set Already_Open to zero, so one of the processes in the WaitQ will be
    * able to set Already_Open back to one and to open the file.  All the other
    * processes will be called when Already_Open is back to one, so they'll go
    * back to sleep.
    */
   Already_Open = 0;

   /* Wake up all the processes in WaitQ, so if anybody is waiting for the
    * file, they can have it.
    */
   module_wake_up(&WaitQ);

   MOD_DEC_USE_COUNT;

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
   return 0;                                 /* success */
#endif
}

/* This function decides whether to allow an operation (return zero) or not
 * allow it (return a non-zero which indicates why it is not allowed).
 *
 * The operation can be one of the following values:
 * 0 - Execute (run the "file" - meaningless in our case)
 * 2 - Write (input to the kernel module)
 * 4 - Read (output from the kernel module)
 *
 * This is the real function that checks file permissions. The permissions
 * returned by ls -l are for referece only, and can be overridden here. 
 */
static int module_permission(struct inode *inode, int op)
{
   /* We allow everybody to read from our module, but only root (uid 0) may
    * write to it
    */ 
   if (op == 4 || (op == 2 && current->euid == 0))
      return 0; 

   /* If it's anything else, access is denied */
   return -EACCES;
}

/* Structures to register as the /proc file, with pointers to all the relevant
 * functions. 
 */

/* File operations for our proc file. This is where we place pointers to all
 * the functions called when somebody tries to do something to our file. NULL
 * means we don't want to deal with something.
 */
static struct file_operations File_Ops_4_Our_Proc_File = {
   NULL,                                   /* lseek */
   module_output,                          /* "read" from the file */
   module_input,                           /* "write" to the file */
   NULL,                                   /* readdir */
   NULL,                                   /* select */
   NULL,                                   /* ioctl */
   NULL,                                   /* mmap */
   module_open,                    /* called when the /proc file is opened */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
   NULL,                                   /* flush */
#endif
   module_close};                          /* called when it's classed */

/* Inode operations for our proc file.  We need it so we'll have somewhere to
 * specify the file operations structure we want to use, and the function we
 * use for permissions. It's also possible to specify functions to be called
 * for anything else which could be done to an inode (although we don't bother,
 * we just put NULL).
 */
static struct inode_operations Inode_Ops_4_Our_Proc_File = {
   &File_Ops_4_Our_Proc_File,
   NULL,                                   /* create */
   NULL,                                   /* lookup */
   NULL,                                   /* link */
   NULL,                                   /* unlink */
   NULL,                                   /* symlink */
   NULL,                                   /* mkdir */
   NULL,                                   /* rmdir */
   NULL,                                   /* mknod */
   NULL,                                   /* rename */
   NULL,                                   /* readlink */
   NULL,                                   /* follow_link */
   NULL,                                   /* readpage */
   NULL,                                   /* writepage */
   NULL,                                   /* bmap */
   NULL,                                   /* truncate */
   module_permission};                     /* check for permissions */

/* Directory entry */
static struct proc_dir_entry Our_Proc_File = {
	 0,                 /* Inode number - ignore, it will be filled by 
                       * proc_register[_dynamic]
                       */
   5,                                      /* Length of the file name */
   "sleep",                                /* The file name */

   /* File mode - this is a regular file which can be read by its owner, its
    * group, and everybody else. Also, its owner can write to it.
    *
    * Actually, this field is just for reference, it's module_permission that
    * does the actual check. It could use this field, but in our
    * implementation it doesn't, for simplicity.
    */
   S_IFREG | S_IRUGO | S_IWUSR, 
   1,        /* Number of links (directories where the file is referenced) */
   0, 0,     /* The uid and gid for the file - we give it to root */
   80,       /* The size of the file reported by ls. */

   /* A pointer to the inode structure for the file, if we need it. In our
    * case we do, because we need a write function.
    */
   &Inode_Ops_4_Our_Proc_File, 

   /* The read function for the file.  Irrelevant, because we put it in the
    * inode structure above
    */
   NULL}; 

/* Module initialization and cleanup */

/* Initialize the module - register the proc file */
int init_module()
{
   /* Success if proc_register_dynamic is a success, failure otherwise */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
   return proc_register(&proc_root, &Our_Proc_File);
#else
   return proc_register_dynamic(&proc_root, &Our_Proc_File);
#endif 

   /* proc_root is the root directory for the proc fs (/proc).  This is where
    * we want our file to be located. 
    */
}

/* Cleanup - unregister our file from /proc.  This could get dangerous if
 * there are still processes waiting in WaitQ, because they are inside our
 * open function, which will get unloaded. I'll explain how to avoid removal
 * of a kernel module in such a case in chapter 10.
 */
void cleanup_module()
{
   proc_unregister(&proc_root, Our_Proc_File.low_ino);
}  </PRE
></FONT
></TD
></TR
></TABLE
></DIV
></DIV
></DIV
><H3
CLASS="FOOTNOTES"
>Notes</H3
><TABLE
BORDER="0"
CLASS="FOOTNOTES"
WIDTH="100%"
><TR
><TD
ALIGN="LEFT"
VALIGN="TOP"
WIDTH="5%"
><A
NAME="FTN.AEN1048"
HREF="x1008.html#AEN1048"
><SPAN
CLASS="footnote"
>[1]</SPAN
></A
></TD
><TD
ALIGN="LEFT"
VALIGN="TOP"
WIDTH="95%"
><P
>最方便的保持某個文件被打開的方法是使用命令 
			<B 
CLASS="COMMAND" 
>tail -f</B 
> 打開該文件。</P
></TD
></TR
><TR
><TD
ALIGN="LEFT"
VALIGN="TOP"
WIDTH="5%"
><A
NAME="FTN.AEN1056"
HREF="x1008.html#AEN1056"
><SPAN
CLASS="footnote"
>[2]</SPAN
></A
></TD
><TD
ALIGN="LEFT"
VALIGN="TOP"
WIDTH="95%"
><P
>這就意味著該進程仍然在內核態中——該進程已經調用了 <TT 
CLASS="FUNCTION" 
>open</TT 
>  
      的系統調用,但系統調用卻沒有返回。在這段時間內該進程將不會得知別人正在使用CPU。</P
></TD
></TR
><TR
><TD
ALIGN="LEFT"
VALIGN="TOP"
WIDTH="5%"
><A
NAME="FTN.AEN1077"
HREF="x1008.html#AEN1077"
><SPAN
CLASS="footnote"
>[3]</SPAN
></A
></TD
><TD
ALIGN="LEFT"
VALIGN="TOP"
WIDTH="95%"
><P
>這是因為我們使用的是 <TT 
CLASS="FUNCTION" 
>module_interruptible_sleep_on</TT 
>. 我們也可以使用 <TT 
CLASS="FUNCTION" 
>module_sleep_on</TT 
>  ,但這樣會導致一些十分憤怒的用戶,因為他們的 <B
CLASS="KEYCAP"
>Ctrl</B
>+<B
CLASS="KEYCAP"
>c</B
> 將不起任何作用。  </P
></TD
></TR
></TABLE
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="c1006.html"
ACCESSKEY="P"
>返回</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>返回首頁</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="c1109.html"
ACCESSKEY="N"
>繼續</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>阻塞進程</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="c1006.html"
ACCESSKEY="U"
>返回本章開始</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>替換 Printk</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲男人的天堂一区二区| 成人午夜免费av| 亚洲同性gay激情无套| 久久久不卡网国产精品一区| 成人中文字幕在线| www.成人网.com| 欧美大白屁股肥臀xxxxxx| 国产欧美久久久精品影院| 午夜av电影一区| av中文字幕在线不卡| 久久久精品tv| 蜜桃视频一区二区三区在线观看| 国产成人午夜99999| 精品嫩草影院久久| 午夜久久久影院| 91亚洲精品乱码久久久久久蜜桃 | 亚洲特黄一级片| 久久爱另类一区二区小说| 色综合久久天天综合网| 久久久国产综合精品女国产盗摄| 日韩精品亚洲专区| 欧美三级电影网| 亚洲综合一区二区精品导航| 99久久伊人网影院| 久久久www免费人成精品| 美女国产一区二区| 69堂成人精品免费视频| 自拍偷拍国产亚洲| 99re成人在线| 国产精品污网站| 国产高清亚洲一区| 久久久久亚洲蜜桃| 精品一区二区三区的国产在线播放| 欧美aaaaaa午夜精品| 偷拍自拍另类欧美| 福利91精品一区二区三区| 91美女视频网站| 欧美绝品在线观看成人午夜影视| 91精品蜜臀在线一区尤物| 国产女人aaa级久久久级| 亚洲精品国产精华液| 麻豆91在线看| 色婷婷综合激情| 欧美色大人视频| 国产欧美一区视频| 亚洲精品中文字幕乱码三区| 日韩专区中文字幕一区二区| 国产黄色精品网站| 欧美精品在线一区二区三区| 26uuu精品一区二区| 中文字幕亚洲在| 国产最新精品免费| 成人免费视频caoporn| 国产麻豆精品在线| 精品免费日韩av| www.视频一区| 亚洲精品五月天| 欧日韩精品视频| 日韩精品久久理论片| 久久久久久久久久久黄色| 国产成人午夜片在线观看高清观看| 国产精品久久久久久久久果冻传媒| 99精品热视频| 日韩精品一级中文字幕精品视频免费观看 | 久久综合久久久久88| 国产乱人伦偷精品视频不卡| 国产区在线观看成人精品| 91成人免费电影| 久久99精品国产麻豆婷婷 | 日韩欧美久久一区| 国产一区二区在线观看视频| 日韩毛片高清在线播放| 欧美美女直播网站| 国产成人午夜电影网| 亚洲电影视频在线| 久久久不卡网国产精品二区| 欧美视频精品在线观看| 国产麻豆精品95视频| 一区二区三区在线免费观看| 欧美精品一区二区三区在线 | 欧美日韩激情在线| 国产综合成人久久大片91| 亚洲女与黑人做爰| 日韩免费看网站| 成人h动漫精品| 亚洲毛片av在线| 国产清纯白嫩初高生在线观看91| 欧美性猛交xxxxxxxx| 国产xxx精品视频大全| 一区二区在线观看视频| 欧美tickling挠脚心丨vk| 在线观看一区二区视频| 国产精品伊人色| 亚洲1区2区3区视频| 国产欧美日韩麻豆91| 日韩欧美一区在线| 色偷偷久久一区二区三区| 国产美女精品人人做人人爽| 午夜精品123| 一区二区三区在线免费| 中文字幕一区二区三区乱码在线| 欧美mv日韩mv| 欧美一区二区网站| 91在线观看免费视频| 国产成人精品影院| 蜜桃精品视频在线观看| 婷婷激情综合网| 亚洲国产一区二区三区青草影视| 亚洲免费电影在线| 国产精品国产自产拍在线| 久久新电视剧免费观看| 欧美videofree性高清杂交| 日韩无一区二区| 欧美视频在线不卡| 在线观看亚洲a| 欧洲国内综合视频| 欧美在线观看禁18| 欧美视频一二三区| 欧美色涩在线第一页| 欧美日韩国产综合一区二区| 日本韩国精品在线| 欧美专区在线观看一区| 色噜噜狠狠色综合欧洲selulu| 色综合久久综合中文综合网| 99视频精品免费视频| 日本高清成人免费播放| 色狠狠av一区二区三区| 99v久久综合狠狠综合久久| 福利一区二区在线| 国产麻豆精品95视频| 国产69精品久久久久毛片| 97se狠狠狠综合亚洲狠狠| 99国产精品久久久久| 在线免费不卡电影| 欧美无乱码久久久免费午夜一区| 欧美另类z0zxhd电影| 欧美一区二区三级| 国产亚洲va综合人人澡精品| 亚洲欧洲精品成人久久奇米网| 最近中文字幕一区二区三区| 亚洲五码中文字幕| 日韩av电影一区| 国产成人亚洲综合a∨婷婷| jlzzjlzz国产精品久久| 欧美日韩一区高清| 精品国产1区二区| 18欧美乱大交hd1984| 亚洲午夜激情av| 国产精品影音先锋| 91麻豆精品秘密| 日韩精品资源二区在线| 国产精品免费久久久久| 一区二区三国产精华液| 强制捆绑调教一区二区| 国产91清纯白嫩初高中在线观看| 91豆麻精品91久久久久久| 日韩一级二级三级精品视频| 国产人伦精品一区二区| 香港成人在线视频| 国产精品一区二区免费不卡 | 欧美性猛交xxxx乱大交退制版| 91精品国产高清一区二区三区蜜臀| 日韩女优av电影| 亚洲另类在线视频| 精品一区二区免费视频| 欧美日韩你懂的| 亚洲午夜久久久久久久久电影院| 国产精品一区二区不卡| 色综合久久99| 国产欧美日韩精品一区| 日韩影院精彩在线| 色综合一区二区| 国产婷婷精品av在线| 亚洲一级片在线观看| 国产精品77777| 欧美亚洲国产一区二区三区va | 国产精品一区二区久激情瑜伽 | 久久99国产精品免费网站| aaa欧美色吧激情视频| 日韩欧美一级精品久久| 亚洲一区二区三区四区在线免费观看| 国产精品亚洲一区二区三区妖精 | 国产福利精品一区二区| 欧美日韩五月天| 久久夜色精品一区| 免费在线观看一区| 在线观看www91| 国产精品亲子乱子伦xxxx裸| 国内久久婷婷综合| 欧美二区乱c少妇| 17c精品麻豆一区二区免费| 国产一区二区在线影院| 91精品国产综合久久精品麻豆 | 欧美视频第二页| 欧美国产一区二区在线观看| 日韩综合一区二区| 欧美三级蜜桃2在线观看| 亚洲精品国产无套在线观| 91啦中文在线观看| ...av二区三区久久精品|