В моей функции чтения myread она непрерывно печатает прочитанные данные, когда я делаю cat/driver/mydriver. Мне нужно только один раз напечатать, как это сделать

Я написал h в драйвере, выполнив echo: echo -n h/dev/mydriver

Когда я делаю cat/dev/mydriver, функция myread непрерывно печатает h. Я хотел напечатать один раз. Как это сделать.

static char m;

static ssize_t myread(struct file *f, char __user *buf, size_t len, loff_t *off)
{
    printk(KERN_INFO "Read()\n");
    if (copy_to_user(buf, &m, 1) != 0)
        return -EFAULT;
    else
        return 1;
}

static ssize_t my_write(struct file *f, const char __user *buf, size_t len, loff_t *off)
{
    printk(KERN_INFO "Write()\n");
    if (copy_from_user(&c, buf + len – 1, 1) != 0)
        return -EFAULT;
    else
        return len;
}
1
nl ja de
@JoachimPileborg Ты говоришь о поведении кошки здесь? Перечитывает ли файл, если EOF не найден?
добавлено автор Sibi Rajasekaran, источник
@JoachimPileborg Я не понимаю эту часть. «« читает »одного и того же персонажа снова и снова». но myread делает copy_to_user только один раз. Извините, если это очень простой вопрос.
добавлено автор Sibi Rajasekaran, источник
@JoachimPileborg Получил это. Благодарю.
добавлено автор Sibi Rajasekaran, источник
Потому что у вас нет условия «конца файла».
добавлено автор Some programmer dude, источник
@Sibrajas Программа cat считывает свой ввод до тех пор, пока не получит конец файла. И поскольку устройство OPs никогда не выполняет cat , оно будет продолжаться вечно. Кроме того, cat не «перечитывает» что-либо, устройство OPs просто «читает» одного и того же символа снова и снова.
добавлено автор Some programmer dude, источник
@Sibrajas Да, он копирует один раз, но поскольку он никогда не возвращает EOF, он будет вызываться снова в следующий раз cat выполняет `чтение, выполнение копирования снова и снова, и снова ...
добавлено автор Some programmer dude, источник
Хорошо. Мне не понравилось, где поставить условие. Можете ли вы мне посоветовать.
добавлено автор kzs, источник
@JoachimPileborg Спасибо за объяснение кошки. Я никогда этого не знаю.
добавлено автор kzs, источник

2 ответы

Если вы хотите использовать стандартные инструменты (например, cat ) с вашими пользовательскими драйверами, не забудьте установить смещение (* loff_t off ) правильно. Функция read должна выглядеть примерно так:

static ssize_t myread(struct file *f, char __user *buf, size_t len, loff_t *off)
{
    printk(KERN_INFO "Read()\n");

    /* You have just a single char in your buffer, so only 0 offset is valid */
    if(*off > 0)
        return 0; /* End of file */

    if (copy_to_user(buf, &m, 1))
        return -EFAULT;

    *off++;
    return 1;
}
4
добавлено

Вам нужно подумать о том, как вы хотите, чтобы ваше устройство работало ... Будет ли то, что вы ему пишете, быть доступным для нескольких процессов? Или следует удалить то, что вы пишете, когда оно будет прочитано?

Последнее, конечно, проще, и его можно просто реализовать, очистив переменную m в функции myread . Если он равен нулю, то возвратите ноль из функции myread .

1
добавлено
@zair Пожалуйста, никогда не отправляйте код в комментариях. И что я могу расшифровать из кода, который вы сделали , вам нужно проверить m first . Кроме того, вы должны инициализировать m , если кто-то попытается прочитать его, прежде чем что-либо будет написано на нем, а также очистите его при успешном чтении (т. Е. При возврате 1 )).
добавлено автор Some programmer dude, источник
static ssize_t myread (struct file * f, char __user * buf, size_t len, loff_t * off) {printk (KERN_INFO "Read() \ n"); if (copy_to_user (buf, & m, 1)! = 0) return -EFAULT; else if (m) return 1; else return 0; } Могу ли я сделать это.
добавлено автор kzs, источник
Linux Help
Linux Help
2 686 участник(ов)

Правила: https://telegra.ph/Pravila-Linux-Help-10-15

Linux Security
Linux Security
652 участник(ов)

Данная группа принципиально про безопасность и в частности про безопасность Linux. Прочие темы просим обсуждать в профильных чатах.

Linux Gaming RUS
Linux Gaming RUS
28 участник(ов)

Русскоязычный чатик, посвящённый играм на различных дистрибутивах Linux, а также wine, proton Arch Linux RU @ArchLinuxChatRU Gnome RU @gnome_ru