使用内核模块更改文件打开模式

时间:2013-12-31 10:04:32

标签: linux linux-kernel fedora redhat

我正在使用内核模块进行一些测试,使用以下代码将进程的文件打开模式从write更改为readonly,我从lsof -p <pid of process>获取文件描述符编号并编译模块&amp;&amp; ; insmod changefilemode.ko它适用于fedora 19,但如果在RedHat 5上使用它,文件描述符将被关闭。

  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/init.h>
  #include <linux/sched.h>
  #include <linux/file.h>
  #include <linux/fs.h>


  struct files_struct *get_files_struct(struct task_struct *task)
  {
       struct files_struct *files;

       task_lock(task);
       files = task->files;
       if (files)
              atomic_inc(&files->count);
       task_unlock(task);

       return files;
   }


   MODULE_LICENSE("GPL");

   static int __init myinit(){
         struct task_struct *tsk;
         for_each_process(tsk){

         if(tsk->pid == 11923){
                    struct files_struct *files = get_files_struct(tsk);
                    task_lock(tsk);
                    printk("\tpid %d - file mode %d\n",tsk->pid, files->fd_array[6]->f_mode);
                    files->fd_array[6]->f_mode = FMODE_READ;
                    printk("\tpid %d - file mode %d\n",tsk->pid, files->fd_array[6]->f_mode);
                    task_unlock(tsk);
               }
         }
      return 0;
   }

static void  __exit myexit(){
    printk("Good Bye from exit");
}


module_init(myinit);
module_exit(myexit);

1 个答案:

答案 0 :(得分:0)

精确PID值取决于启动期间过程启动的确切时间顺序。 没有办法确保流程启动的确切时间顺序在发行版中是确定性的,除非您仔细调整事物以满足您的确切需求,并假设init进程完全相同。

此外,fd编号取决于流程执行期间open()的时间顺序。