日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

使用proc文件系统

發布時間:2024/9/21 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用proc文件系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下是內核提供的幾個重要的proc文件系統接口:

(1)read_proc

  • int?(*read_proc)(char?*page,?char?**start,?off_t?offset,?int?count,?int?*eof,?void?*data);?
  • read_proc是proc文件輸出信息接口,page是將要寫入數據的緩沖區指針,start是數據將要寫入的頁面位置,offset是頁面中的偏移量;count是寫入的字節數,eof是一個整形數,當沒有更多數據時,必須配置這個參數,data是驅動程序特定的數據指針,可用于內部使用。函數的返回值表示實際放入頁面緩沖區的數據字節數。

    (2)create_proc_entry

  • struct?proc_dir_entry?*create_proc_entry(const?char?*name,?mode_t?mode,struct?proc_dir_entry?*parent);?
  • create_proc_entry用來創建proc目錄。其中name為文件名稱;mode為文件權限;parent為文件的父目錄的指針,它為null時代表父目錄為/proc。

    (3)remove_proc_entry

  • void?remove_proc_entry(const?char?*name,?struct?proc_dir_entry?*parent);?
  • remove_proc_entry用于刪除上面函數創建的proc條目,參數name給出要刪除的proc條目的名稱,參數parent指定建立的proc條目所在的目錄。

    (4)proc_mkdir

  • struct?proc_dir_entry?*proc_mkdir(const?char?*?name,?struct?proc_dir_entry?*parent);?
  • 該函數用于創建一個proc目錄,參數name用于指定要創建的proc目錄的名稱,參數parent為該proc目錄所在的目錄。

    在驅動程序中使用proc文件系統,就要了解proc_dir_entry結構:

  • struct?proc_dir_entry?{ ?
  • ????unsigned?int?low_ino; ?
  • ????unsigned?short?namelen; ?
  • ????const?char?*name; ?
  • ????mode_t?mode; ?
  • ????nlink_t?nlink; ?
  • ????uid_t?uid;?gid_t?gid;???????????????//進程ID ?
  • ????loff_t?size; ?
  • ????const?struct?inode_operations?*proc_iops;???//結點操作 ?
  • ????const?struct?file_operations?*proc_fops;????//文件操作 ?
  • ????get_info_t?*get_info; ?
  • ????struct?module?*owner;???????????????//擁有者 ?
  • ????struct?proc_dir_entry?*next,?*parent,?*subdir; ?
  • ????void?*data; ?
  • ????read_proc_t?*read_proc;?????????//讀接口 ?
  • ????write_proc_t?*write_proc;???????????//寫接口 ?
  • ????atomic_t?count;/*?引用計數*/ ?
  • ????int?pde_users; ?
  • ????spinlock_t?pde_unload_lock; ?
  • ????struct?completion?*pde_unload_completion; ?
  • ????shadow_proc_t?*shadow_proc; ?
  • }; ?
  • 例1.9? proc文件系統驅動程序實例

    下面的例子演示了如何訪問 proc 文件系統。代碼見光盤\src\1drivermodel\1-9proc。核心代碼如下所示:

  • //結點操作 ?
  • static?struct?inode_operations?simple_inode_operations?=?{ ?
  • ????.permission?=?simple_permission, ?
  • }; ?
  • int?init_simple_module(?void?) ?
  • { ?
  • ????int?ret?=?0; ?
  • ????simple_buffer?=?(char?*)vmalloc(?MAX_simple_LENGTH?); ?
  • ????if?(!simple_buffer)? ?
  • ????{ ?
  • ????????ret?=?-ENOMEM; ?
  • ????}? ?
  • ????else? ?
  • ????{ ?
  • ????????memset(?simple_buffer,?0,?MAX_LENGTH?); ?
  • ????????proc_entry?=?create_proc_entry(?"demo",?0644,?NULL?); ?
  • ????????if?(proc_entry?==?NULL) ?
  • ????????{ ?
  • ????????????ret?=?-ENOMEM; ?
  • ????????????vfree(simple_buffer); ?
  • ????????????printk(KERN_INFO?"demo:?Couldn't?create?proc?entry\n"); ?
  • ????????}? ?
  • ????????else ?
  • ????????{ ?
  • ????????????proc_entry->proc_iops?=?&simple_inode_operations;//結點操作 ?
  • ????????????proc_entry->read_proc?=?simple_read; ?
  • ????????????proc_entry->write_proc?=?simple_write; ?
  • ????????????proc_entry->owner?=?THIS_MODULE; ?
  • ????????????printk(KERN_INFO?"demo:?Module?loaded.\n"); ?
  • ????????} ?
  • ????} ?
  • ????return?ret; ?
  • } ?
  • 以下是讀寫操作的框架:

  • int?simple_read(?char?*page,?char?**start,?off_t?off,int?count,?int?*eof,?void?*data?) ?
  • { ?
  • ????int?size?=?0; ?
  • ????struct?task_struct?*p; ?
  • ????char?state; ?
  • ????size+=sprintf(page+size, ?
  • ????????"%5s%7s%7s%7s%7s%7s%7s??%s\n\n", ?
  • ????????"PID","UID","PRIO","POLICY", ?
  • ????????"STATE","UTIME","STIME","COMMAND"); ?
  • ????for_each_process(p) ?
  • ????{ ?
  • ????????switch((int)p->state) ?
  • ????????{ ?
  • ????????case?-1:?state='Z';?break; ?
  • ????????case?0:?state='R';?break; ?
  • ????????default:?state='S';?break; ?
  • ????????} ?
  • ????????size+=sprintf(page+size, ?
  • ????????????"%5d%7d%7d%7d%7c%7d%7d??%s\n", ?
  • ????????????(int)p->pid, ?
  • ????????????(int)p->uid, ?
  • ????????????(int)p->rt_priority, ?
  • ????????????(int)p->policy, ?
  • ????????????state, ?
  • ????????????(int)p->utime, ?
  • ????????????(int)p->stime, ?
  • ????????????p->comm); ?
  • ????} ?
  • ????return?(size); ?
  • } ?
  • ssize_t?simple_write(?struct?file?*filp,?const?char?__user?*buff,unsigned?long?len,?void?*data?) ?
  • { ?
  • ????if(len>MAX_LENGTH)len=MAX_LENGTH; ?
  • ????if?(copy_from_user(simple_buffer,?buff,?len?)) ?
  • ????{ ?
  • ????????return?-EFAULT; ?
  • ????} ?
  • ????simple_buffer[len]?=?0; ?
  • ????printk(KERN_INFO?"simple_write:?%s\n",simple_buffer); ?
  • ????return?len; ?
  • } ?
  • proc文件的操作權限控制代碼:
  • static?int?simple_permission(struct?inode?*inode,?int?op,?struct?nameidata?*foo) ?
  • { ?
  • ????printk(KERN_INFO?"simple_permission?op?%d\n",op); ?
  • ????if(itype==op) ?
  • ????{ ?
  • ????????return?-EACCES; ?
  • ????} ?
  • ????return?0; ?
  • } ?
  • 運行結果如下:
  • [root@urbetter?/home]#?insmod?demo.ko? ?
  • demo:?Module?loaded. ?
  • [root@urbetter?/home]#?cat?/proc/demo ?
  • simple_permission?op?36 ?
  • ??PID????UID???PRIO?POLICY??STATE??UTIME??STIME??COMMAND ?
  • ????1??????0??????0??????0??????S??????1????398??init ?
  • ????2??????0??????0??????0??????S??????0??????0??kthreadd ?
  • ????3??????0??????0??????0??????S??????0??????0??ksoftirqd/0 ?
  • ????4??????0?????99??????1??????S??????0??????0??watchdog/0 ?
  • ????5??????0??????0??????0??????S??????0??????0??events/0 ?
  • ????6??????0??????0??????0??????S??????0?????41??khelper ?
  • ??145??????0??????0??????0??????S??????0??????0??kblockd/0 ?
  • ??156??????0??????0??????0??????S??????0??????0??khubd ?
  • ??159??????0??????0??????0??????S??????0??????0??kseriod ?
  • ??163??????0??????0??????0??????S??????0??????4??kmmcd ?
  • ??187??????0??????0??????0??????S??????0??????0??pdflush ?
  • ??188??????0??????0??????0??????S??????0??????0??pdflush ?
  • ??189??????0??????0??????0??????S??????0??????0??kswapd0 ?
  • ??236??????0??????0??????0??????S??????0??????0??aio/0 ?
  • ??244??????0??????0??????0??????S??????0?????18??nfsiod ?
  • ??924??????0??????0??????0??????S??????0??????0??mtdblockd ?
  • ??957??????0??????0??????0??????S??????0??????0??kpsmoused ?
  • ?1011??????0??????0??????0??????S??????0?????78??rpciod/0 ?
  • ?1042??????0??????0??????0??????S??????0??????0??syslogd ?
  • ?1045??????0??????0??????0??????S??????1??????7??inetd ?
  • ?1079??????0??????0??????0??????S????707????468??qpe ?
  • ?1088??????0??????0??????0??????S??????2?????13??sh ?
  • ?1089??????0??????0??????0??????S??????0??????1??init ?
  • ?1090??????0??????0??????0??????S??????0??????0??init ?
  • ?1091??????0??????0??????0??????S??????0??????2??init ?
  • ?1109??????0??????0??????0??????S?????41?????20??qss ?
  • ?1110??????0??????0??????0??????S????141?????42??quicklauncher ?
  • ?1118??????0??????0??????0??????R??????0??????2??cat ?
  • [root@urbetter?/home]#?echo?"fgj">/proc/demo ?
  • simple_permission?op?34 ?
  • simple_write:?fgj ?
  • 如果將itype配置為34,則屏蔽對/proc/demo的寫操作。
  • [root@urbetter?/home]#?insmod?demo.ko?itype=34?
  • [root@urbetter?/home]#?echo?"fgj">/proc/demo ?
  • simple_permission?op?34 ?
  • -/bin/sh:?can't?create?/proc/demo:?Permission?denied ?

  • 總結

    以上是生活随笔為你收集整理的使用proc文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。