我正在使用内核模块进行一些测试,使用以下代码将进程的文件打开模式从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);
答案 0 :(得分:0)
精确PID值取决于启动期间过程启动的确切时间顺序。 没有办法确保流程启动的确切时间顺序在发行版中是确定性的,除非您仔细调整事物以满足您的确切需求,并假设init进程完全相同。
此外,fd编号取决于流程执行期间open()
的时间顺序。