📄 proc_text.c
字号:
#define __NO_VERSION#define __KERNEL__#define MODULE#include <linux/kernel.h>#include <linux/module.h>#include <linux/sched.h>#include <linux/proc_fs.h>#include <asm/uaccess.h>#define STRINGLEN 10#define NAMELEN 10#define IDLEN 10#define KBUFLEN 50 struct person_information{ char name[NAMELEN]; char id[IDLEN]; };struct person_information global_buffer[STRINGLEN];struct proc_dir_entry *student_dir,*student_file;int rec_count=0; int proc_read_student(char *page,char **start,off_t off,int count,int *eof, void *data){ int len; MOD_INC_USE_COUNT; if(rec_count==0)//若student文件中没有内容 { len=sprintf(page,"there is no record!\n"); } int v; for(v=0;v<rec_count;v++)//有内容则打印 { len=len+sprintf(page,"name is %s, id is %s \n",global_buffer[v].name, global_buffer[v].id); } MOD_DEC_USE_COUNT; return len;} int proc_write_student(struct file *file,const char *buffer,unsigned long count, void *data){ int len=count; char kbuffer[KBUFLEN]; MOD_INC_USE_COUNT; char op[5]; char name[NAMELEN]; char id[IDLEN]; copy_from_user(kbuffer,buffer,len);//将用户区命令copy到核心缓冲区 kbuffer[len]='\0'; int index=0; while(kbuffer[index]!='-') { op[index]=kbuffer[index]; index++; } op[index]='\0';//将指令类型存入op index++; int i=0; while(kbuffer[index]!='-') { name[i]=kbuffer[index]; i++; index++; } name[i]='\0';//学生姓名存入name index++; i=0; while(index<strlen(kbuffer)) { id[i]=kbuffer[index]; i++; index++; } id[i]='\0';//学生号存入id if(strcmp(op,"insert")==0)//若用户指令为插入 { strcpy(global_buffer[rec_count].name,name); strcpy(global_buffer[rec_count].id,id); rec_count++; } else//若用户指令为删除 { int j; for(j=0;j<rec_count;j++) { if((strcmp(global_buffer[j].name,name)==0)&& (strcmp(global_buffer[j].id,id)==0)) break;//找到要删除的 } while(j<rec_count)//数组内容依次前移 { strcpy(global_buffer[j].name,global_buffer[j+1].name); strcpy(global_buffer[j].id,global_buffer[j+1].id); j++; } rec_count--; } MOD_DEC_USE_COUNT; return len;} int init_module(){ student_dir=proc_mkdir("proc_text",NULL);//建立新文件夹proc_text student_dir->owner=THIS_MODULE; student_file=create_proc_entry("student",0644,student_dir);//并生成文件student student_file->read_proc=proc_read_student; student_file->write_proc=proc_write_student; student_file->owner=THIS_MODULE; int w; for(w=0;w<STRINGLEN;w++)//初始化 { strcpy(global_buffer[w].name,"$$$$$$$$$"); strcpy(global_buffer[w].id,"$$$$$$$$$"); } return 0;}void cleanup_module()//删除文件以及文件夹{ remove_proc_entry("student",student_dir); remove_proc_entry("proc_text",NULL);}MODULE_LICENSE("GPL");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -