生活随笔
收集整理的這篇文章主要介紹了
使用proc文件系统
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
以下是內(nèi)核提供的幾個(gè)重要的proc文件系統(tǒng)接口:
(1)read_proc
int?(*read_proc)(char?*page,?char?**start,?off_t?offset,?int?count,?int?*eof,?void?*data);?
read_proc是proc文件輸出信息接口,page是將要寫入數(shù)據(jù)的緩沖區(qū)指針,start是數(shù)據(jù)將要寫入的頁(yè)面位置,offset是頁(yè)面中的偏移量;count是寫入的字節(jié)數(shù),eof是一個(gè)整形數(shù),當(dāng)沒有更多數(shù)據(jù)時(shí),必須配置這個(gè)參數(shù),data是驅(qū)動(dòng)程序特定的數(shù)據(jù)指針,可用于內(nèi)部使用。函數(shù)的返回值表示實(shí)際放入頁(yè)面緩沖區(qū)的數(shù)據(jù)字節(jié)數(shù)。
(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用來創(chuàng)建proc目錄。其中name為文件名稱;mode為文件權(quán)限;parent為文件的父目錄的指針,它為null時(shí)代表父目錄為/proc。
(3)remove_proc_entry
void?remove_proc_entry(const?char?*name,?struct?proc_dir_entry?*parent);?
remove_proc_entry用于刪除上面函數(shù)創(chuàng)建的proc條目,參數(shù)name給出要?jiǎng)h除的proc條目的名稱,參數(shù)parent指定建立的proc條目所在的目錄。
(4)proc_mkdir
struct?proc_dir_entry?*proc_mkdir(const?char?*?name,?struct?proc_dir_entry?*parent);?
該函數(shù)用于創(chuàng)建一個(gè)proc目錄,參數(shù)name用于指定要?jiǎng)?chuàng)建的proc目錄的名稱,參數(shù)parent為該proc目錄所在的目錄。
在驅(qū)動(dòng)程序中使用proc文件系統(tǒng),就要了解proc_dir_entry結(jié)構(gòu):
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;???????????????//進(jìn)程ID ?????loff_t?size; ?????const?struct?inode_operations?*proc_iops;???//結(jié)點(diǎn)操作 ?????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;/*?引用計(jì)數(shù)*/ ?????int?pde_users; ?????spinlock_t?pde_unload_lock; ?????struct?completion?*pde_unload_completion; ?????shadow_proc_t?*shadow_proc; ?}; ?
例1.9? proc文件系統(tǒng)驅(qū)動(dòng)程序?qū)嵗?/p>
下面的例子演示了如何訪問 proc 文件系統(tǒng)。代碼見光盤\src\1drivermodel\1-9proc。核心代碼如下所示:
//結(jié)點(diǎn)操作 ?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;//結(jié)點(diǎn)操作 ?????????????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文件的操作權(quán)限控制代碼: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; ?} ?運(yùn)行結(jié)果如下:[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,則屏蔽對(duì)/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 ?
總結(jié)
以上是生活随笔為你收集整理的使用proc文件系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。