⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proc_text.c

📁 实现模块的加载等实现。在LINUX操作系统下实现 操作系统实验程序之一
💻 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 + -