簡體   English   中英

Linux 設備驅動程序,內核線程無法打開文件?

[英]Linux Device Driver, kernel thread can't open file?

我正在編寫一個帶有 Linux 內核模塊的 Linux 驅動程序,當用戶可以寫入時,當用戶調用 close 時,驅動程序必須將內容刷新到另一個目錄中與設備文件同名的文件中。

我有這個問題:當一個進程調用 close 時,驅動程序可以打開一個文件並正確刷新它的所有內容; 當進程被終止時(例如,從帶有kill的終端),設備驅動程序無法執行filp_open fs->CURRENT設置為 NULL。 所以,我試圖啟動一個內核線程來完成這項工作。

當我嘗試在同一目錄中打開文件時,例如filp_open("myfile"...) ,它可以正常工作。 但是如果我必須在另一個目錄中打開一個文件,那么filp_open("dirA/myfile")filp_open返回 -2。 但是當我從主線程調用filp_open時,這不會發生。

這是我的代碼:

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;
}

這是我的device_release函數:

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_CREAT,filp_open 不會返回錯誤,但不會創建文件; 那么,內核線程不能對文件進行操作?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM