C Linux设备驱动程序,内核线程无法打开文件?
我正在用Linux内核模块编写一个Linux驱动程序,当用户可以编写时,当用户调用close时,驱动程序必须将内容刷新到另一个目录中与设备文件同名的文件中 我有这个问题:当进程调用close时,驱动程序可以打开一个文件并正确刷新其所有内容;例如,当进程被终止时,从具有终止的终端,设备驱动程序无法执行filp_open,因为fs->CURRENT设置为NULL。所以,我试图启动一个内核线程来完成这项工作 当我尝试打开同一目录中的文件时,例如filp_openmyfile…,它工作正常。但是如果我必须在另一个目录中打开一个文件,那么filp_opendirA/myfile,filp_open返回-2。但是当我从主线程调用filp_open时,这不会发生 这是我的代码:C Linux设备驱动程序,内核线程无法打开文件?,c,linux,module,kernel,linux-device-driver,C,Linux,Module,Kernel,Linux Device Driver,我正在用Linux内核模块编写一个Linux驱动程序,当用户可以编写时,当用户调用close时,驱动程序必须将内容刷新到另一个目录中与设备文件同名的文件中 我有这个问题:当进程调用close时,驱动程序可以打开一个文件并正确刷新其所有内容;例如,当进程被终止时,从具有终止的终端,设备驱动程序无法执行filp_open,因为fs->CURRENT设置为NULL。所以,我试图启动一个内核线程来完成这项工作 当我尝试打开同一目录中的文件时,例如filp_openmyfile…,它工作正常。但是如果我必
static int thread_fn(void *unused){
struct thread_data* td = (struct thread_data *) unused;
if(td == NULL)
printk(KERN_INFO "td is null\n");
struct file* filp=filp_open("/dirA/myfile",O_RDWR,0666);
if(filp == NULL || (IS_ERR(filp)))
printk(KERN_INFO "filp is null!\n");
else
printk(KERN_INFO "filp is not null!\n");
size_t filp_size = filp->f_inode->i_size;
printk(KERN_INFO "size on release: %ld\n",filp_size);
if(filp_size > td->size){
printk(KERN_INFO "truncating file\n");
truncate_setsize(filp->f_inode, td->size);
}
inode_lock(filp->f_inode);
//file_write(filp,/*file->f_pos*/0,td->data,td->size);
inode_unlock(filp->f_inode);
printk(KERN_INFO "Thread Stopping\n");
do_exit(0);
return 0;
}
这是我的设备释放功能:
static int device_release(struct inode *inode, struct file *file)
{
if(my_data->buffer == NULL)
return -ENOMEM;
struct thread_data* td=alloc_mem(sizeof(struct thread_data));
td->filename=my_data->filename;
td->data=my_data->buffer;
td->size=my_data->size;
thread_st = kthread_run(thread_fn, (void *)td,"Thread!");
if (thread_st)
printk(KERN_INFO "Thread Created successfully\n");
else
printk(KERN_ERR "Thread creation failed\n");
return 0;
}
有什么问题吗?我不明白,这可能是操作系统的问题?我也尝试过使用set_fs/get_fs,但没有成功。我有一个更新:如果我把标志放在了O_create上,filp_open不会返回错误,但不会创建文件;因此,内核线程无法对文件进行操作?这并不能回答问题。要向问题添加更多信息,请单击问题下方的编辑按钮。