Kernel

編寫具有讀寫操作的簡單 misc char 設備驅動程序

  • June 18, 2020

感謝您查看這個問題。

我正在編寫一個具有讀寫操作的簡單 misc char 設備。請繼續閱讀…

TEXT當我這樣做時,以下程式碼僅列印一次所需的文本

cat /dev/mydevice01

這是讀取函式的程式碼。

static ssize_t my_read(struct file *file, char __user *buff, size_t count, loff_t *ppos)
{
   char *print_str = TEXT;

   if (*ppos != 0)
       return 0;
   if ((count < TEXT_LENGTH) || (copy_to_user(buff, print_str, TLF_ID_LENGTH)))
       return -EINVAL;
   *ppos += count;
   return count;
}

TEXT是使用定義的#define,所以是TEXT_LENGTH

我覺得這段程式碼有點太複雜,因此我嘗試修改它。這是修改後的程式碼,但會一直列印所需的文本,直到我在程序中使用SIGINT( Ctrl+C) :

static ssize_t my_read(struct file *file, char __user *buff, size_t count, loff_t *ppos)
{
       char *print_str = TLF_ID;

       if (copy_to_user(buff, print_str, TLF_ID_LENGTH))
               return -EINVAL;
       return count;
}

我是 Linux 核心程式的新手。我想知道程式碼出了什麼問題。如果可能的話,一行程式碼就可以實現相同的功能。提前致謝!

我自己想出來了,我會把答案留給其他尋找類似東西的人。

static ssize_t my_read(struct file *file, char __user *buff, size_t count, loff_t *ppos)
{
       char *print_str = TEXT;
       int len = TEXT_LENGTH;

       return simple_read_from_buffer(buff, count, ppos, print_str, len);
}

這按預期工作。只是不要忘記包含這些模組。

#include <linux/fs.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/module.h>

謝謝大家的幫助:)。

引用自:https://unix.stackexchange.com/questions/593507